游客您好
  • 点击联系客服

    在线时间:8:30-18:00

    客服微信

    Wkr-3000y-kf

    电子邮件

    3000y@wenkeruan.com
  • 手机版

    随时掌握游戏动态

  • 扫一扫二维码

    添加微信客服

Lv.7 版主
8号会员,9活跃值,2022.09.01 加入
  • 127发帖
  • 123主题
  • 0关注
  • 0粉丝
这个人很懒,什么也没有留下。
独家推荐 更多>

初步了解tgs插件的写法

[复制链接]
异仟年认证商人 发表于 2022-9-5 20:27:36 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
本帖最后由 异仟年 于 2022-9-5 20:28 编辑
3 o0 J; E; A- J" e, h; c  T7 C
9 t  p5 v. g5 N$ q7 |
编写需求条件:  [! e% u  }* k& j/ U

  F4 s, ^  E9 t& a2 \" Q    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)9 U9 ]0 b) E% I9 m( ]

; ~  @; i$ T9 t3 ]4 K; I$ X& f! I4 L) ?2 E& l
编写过程
- `" ]7 Z$ A; T& T3 O
9 D" Z1 M  j; S1 H* U# k% |1:: r7 K. r0 M. Q. g! r. Y3 T

4 _) M8 l& v4 Z' y( s. ]    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面
/ W4 i3 I0 K8 r7 Q! V- }/ C0 T0 e# B4 U2 x: k  t7 `1 _' k/ H4 Y% W
+ e( O' t) k* f' k( A
2:2 S: U( x0 }1 G" W# e
; P1 @& m/ R1 l9 m6 p
    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序' U9 ^! v3 K9 Q# }1 L

0 i6 ?/ A. p/ t    启动客户端进入游戏(后面要用客户端)
  q9 `5 T* {% F
6 t8 r4 ^* Z: z- U$ U$ @! S    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe, u* @. Z9 b9 X3 W
0 |8 K- _3 m9 E. ]. ~! r
    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序 6 m! z( v8 D/ {  c. n$ p4 }
' z3 j4 @: Q8 h% o9 Y1 m7 v) C
    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到
( x+ u; I+ x  I! R+ B' A5 E, [' i. G2 \
    od停在
4 \$ r' r: L/ T# p" O
6 ^7 q* S; s7 K4 x    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "6 s8 W* |- F- |; n# a3 f7 h, {( j
3 c. C1 q. H' @. Z/ M- V" V
    双击这一行 再次看到od定位在汇编代码显示页面" t" V- t- }0 {1 K: ~4 P

# V! ?$ K8 `1 m, y8 g% {+ v# M8 p7 x6 T7 P" w+ N+ m# d
        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: "
* A& l+ J. @  t/ h; ^        0052A0CC   .  E8 C7A5EDFF   call    00404698                                $ a! {8 O2 N5 X6 z7 G
        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容
, u5 P  P* K  K6 x, d2 d        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用
( D  Z9 p% a  m        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        % c" Z3 T" t+ j7 K1 D$ P$ p5 ^8 p
        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB8
) f1 ^3 s5 u! c: M; I9 x' c
: v$ L( X7 [3 f/ [0 C7 d: f. l/ a" A    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????
# _) J8 r" t& A7 ~7 M% [$ \. c5 o' {1 v    ! z5 k9 e, E) C: y
    这时od会被中断, 断在刚才下的断点处, 这时按下F8 4 K* n# @- b# _  ^& F5 ~: C
9 C0 ?$ v. M% v% y$ L
    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩
( }2 N# w/ R+ C2 y. |, U% G' R( v1 a, `9 Q1 `/ y
    同时发送数据给客户端9 a4 {4 S( ~  b2 D( w$ a8 W

" K4 w* Y8 P9 E! ]. N! ?( a    8 E' r7 A) g1 P% t
    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过: F4 O4 Y/ B5 `; |
  " Z0 z  \! |1 X* o5 I+ d, N' h
        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F), F0 }! M6 T9 p' _; d! W+ N
        0053BBFF  |.  0F87 41020000 ja      0053BE46
! x0 ?# L4 y5 X8 h2 J
" W% S+ l  v2 }    eax 这里是3 一路F8比较下去到下面这里5 _% N: Z7 M$ D( a
, b. T7 v5 T5 y
        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC
! C+ X& z3 i: P6 l        0053BCDD  |.  66:BA 1F00    mov     dx, 1F
+ {8 K. b3 i  `        0053BCE1  |.  66:B8 1F00    mov     ax, 1F
' T/ q0 h% R8 c: Q7 `        0053BCE5  |.  E8 EA54F2FF   call    004611D4. k! @9 W* E, W* R/ w
8 C8 n2 l% `4 ^$ \, N* K" P
    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数 ; H6 |! \# w- y6 y. V3 A
    + f9 w7 U" |& I/ W5 ^, S, l3 n. O
    call    004611D4  就是调用 winrgb
" O* M1 H" M4 I5 O9 N& V" v7 c/ X2 |7 X. c

' O7 g3 u0 I% |- u上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
- N' s7 A+ Q, \7 v' ^

+ ?0 ], `1 |2 Q
    dll里面进行内存地址读写
' n' ?8 e( m/ T0 O; A$ G
- E1 x. p  X; Z2 E, z4 y0 q6 j
    我是在
* I6 e0 F4 y+ |
   7 c& p$ C9 t' l9 B; \, J
    0053BBFF  |. /0F87 41020000     ja      0053BE46% {: S1 P8 e0 c( u" }

) f7 [0 q- w( P# D( f
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写
- [. Q5 U4 d) O$ X
& x  c, r/ ]8 J1 @
    procedure InitDll();: C+ h' I. Q5 V9 B/ L. j. {
    var
+ ]% g& R. e! O6 |" K8 i  I0 t  P
      p: Dword;* C2 R6 C4 {1 I3 K0 q
    begin) d' F1 H  a: a8 m
      p := $0053BBFF + 1;8 l% S& N# ?! C2 D; K* U
      PDword(p)^ := Dword(@proc_0053BBFF);3 e+ g! K! G& e* L& P# e( ^
    end;% t: \2 w4 z% w, ?% ?# e

# {+ ]( `3 r$ q
    在自己的代码里面写一个色彩增加的函数判断比如
7 b# `* h$ D  q/ A% l
! r; y6 W: v, @0 D& X
    delphi代码:
( ?/ ~) H, C6 g. k

; w: V. p0 T1 O3 @* s
    var
8 P1 S" {9 `  {9 S0 f) S
      EndAddr1_0053BBFF : Dword = $004F470C;
' I8 n; U0 s# b
      EndAddr2_0053BBFF : Dword = $004F44CB;
6 Z- d6 w! U7 R6 x
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转
# P0 n& E5 y- D, E
5 o% c- f+ G/ Q2 v
   CallAddr1_0053BBFF : Dword = $004611D4;) Y$ K/ {* A/ }
      CallAddr2_0053BBFF : Dword = $004611D4;& [7 P& J5 g3 R5 E7 o
! W( C" I# j, @, P* F
    procedure proc_0053BBFF();8 r$ F3 o1 _( b
    asm9 P+ R/ o0 w" g0 ]2 v: w2 M
      cmp     eax, $10                        //与预先设定的 最大17比较
. y: s3 L# V- W& a' W
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值
& ~* J5 c$ D% f4 K) A

( D* Z$ d2 M1 A7 h
      cmp     eax, $10                        //比较是否等于167 ?/ `+ j2 G7 o8 z/ B
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分7 `0 i0 R- M( E8 t# I0 O

: E, }) k4 B. h& Z9 q" D) N
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试8 f+ k5 {9 L: Q+ _2 h6 M1 T$ r
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF5 w/ d  n" V  d
      mov     ax, $A
. P! `- \+ r% @; Q  |* X
      call    CallAddr1_0053BBFF6 j, v) s2 ]8 F
      mov     edx, dword ptr [ebp-$14]9 K6 V: h. B3 Y: l
      mov     word ptr [edx+1], ax0 z" _9 e" M" A3 E( u0 t

4 W$ Y/ }, B! S" ?' \* d- H/ s
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
' M; J6 G8 ^( w/ |3 J. Z1 j
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF$ X/ C* b! x$ g' d5 F6 ~' f
      mov     ax, $10
, ~: n# U* c, C. g& @2 B  E
      call    CallAddr2_0053BBFF2 A, ?) j" a% K8 _; F  e
      mov     edx, dword ptr [ebp-$14]
3 _2 X1 R" N7 k* O. g/ [9 y
      mov     word ptr [edx+3], ax( x- o3 r9 p9 m1 |1 J- U. w
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
# {# G: O# s  Q  {% u
) |/ _/ a2 K! _+ ?
    @Seventh:
+ N, K4 R: c4 V% K
      cmp     eax, $11                        //比较是否等于17
8 ?+ k( ?/ {- ^! C1 d& E3 s
      jnz     @out                            //不等于就跳转到默认部分
% j+ x% h( ^; n7 s& U
2 V) p8 z% m8 C, ^/ h
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
7 s+ P7 h1 Z! S$ n2 A& O# c
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF: @; M/ x3 d( e$ D/ p
      mov     ax, $A$ U1 a, m2 y& w+ H7 H3 W
      call    CallAddr1_0053BBFF
1 o. O5 U7 b5 k1 G, f& g' B
      mov     edx, dword ptr [ebp-$14]! W, ]& Z( H: q% a3 Z
      mov     word ptr [edx+1], ax
" g0 p% X; N- k
& D1 p0 Y1 X' ]$ F7 Q
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试) u$ g9 u& A/ {' p/ l1 f  p. j
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
4 o& v/ V( g* t/ A" F) g
      mov     ax, $10
4 w8 Q3 H" e4 ]2 H
      call    CallAddr2_0053BBFF
9 a# e1 g0 l0 X
      mov     edx, dword ptr [ebp-$14]
* T4 z: {# T) k4 \
      mov     word ptr [edx+3], ax
4 x% S: ]' J9 X- \. T, \  h; {
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs$ N6 l8 Q  G0 g
                                               //
; h  z; r; `0 [6 s. F5 b$ i: B) J
    @out:
' @( w5 B3 D, H& X
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点5 u! A; n6 X; o+ D7 L0 f+ r

9 Q6 k+ G; R. w" |, |) K) y
    @OldCor:
0 `; ~/ |- B; k4 K/ k
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值/ q8 m7 G# L$ }
    end
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

Powered by Discuz!X3.4 ©2001-2013 Comsenz Inc.闽公网安备 35099902000100号增值电信业务经营许可证 闽B2-20220593 闽ICP备2023014375号