三千论坛

标题: 初步了解tgs插件的写法 [打印本页]

作者: 异仟年    时间: 2022-9-5 20:27
标题: 初步了解tgs插件的写法
本帖最后由 异仟年 于 2022-9-5 20:28 编辑 4 I) |; U) Y: z
# g$ G* E, L% M; r
编写需求条件:2 w4 R: P+ a7 P6 f2 @

7 O9 y% c$ G; j- |    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++); C# O- h, v/ }# q! U1 i) `6 i

. }( G, n4 a! D9 m  k; z
6 O/ l' N! O6 u! k) e编写过程
. \  O/ Z) L; g& k. I, {* R
5 X3 S) K/ e, y* [1:
* H7 B5 I0 e, Y" x8 F$ l
1 w! V/ o( w( [% J- B* n: F1 ~& M    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面
6 Q+ ]% Q1 l0 K9 A6 ~" q/ l+ z; o  w" l' A9 l  J

" A/ s5 l9 e5 E5 ^0 i2:1 Q3 j/ o9 k6 V- I1 ~4 V

* N6 @0 m; o- e) Y0 I* F" x    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序  ^' C) z: j+ S6 D- f. f

) P" c* U, _! u* A" g, Z: x, v: f% O, X/ L    启动客户端进入游戏(后面要用客户端)( Z7 o) y/ Z" ], b2 s4 V' B9 `

# T* |" X1 D; Y% H# n/ E    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe, u2 c; [- [# x# z$ V) t1 D

. I, j8 V% y* f) t2 S. D- a    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序
* ]: {5 ~% X3 I4 W1 y8 T( ~9 m. i9 I/ l: R% Y
    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到3 L( J, Z6 X. t& E

$ |7 l. N: m; Y7 B1 J    od停在! A5 V6 x2 ~4 H" ^0 u  c
6 h% s! R) P( w; K: E8 K
    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "
. @$ m! V  e. B# [" E# r* ^0 M. E. K; f
    双击这一行 再次看到od定位在汇编代码显示页面
3 |; f: L  u  h
! W" H+ _3 r! w0 p# q9 F" L: k, \; L, I7 n0 {+ z  Z' U4 m# j
        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: " + u$ o4 @: Y8 N2 m0 l, U; ^9 v* Y
        0052A0CC   .  E8 C7A5EDFF   call    00404698                                
, V6 p/ N7 ]& A# r6 {# z4 n' k* s        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容6 I% C) a5 f" u8 E' f; x, x
        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用' D! m  ]9 w# x0 @8 T
        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        
$ A  ~5 K" q3 s) X6 |2 A" k        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB8
& M2 k& N8 y4 t+ N7 L, I
, q. E6 H* _' b  `6 j    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????& f, O3 [; o( x* v5 L& z
   
' n$ B2 Y% k' R% N( ~* a: {7 Q    这时od会被中断, 断在刚才下的断点处, 这时按下F8 2 F1 K$ A: S1 g; Y0 X6 c
; v. n- r& M/ z' l! y: r* N
    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩1 O) X7 _0 u+ t/ I5 q
, i3 Y4 C( X5 d: o  z
    同时发送数据给客户端
! h; w/ c  Q+ h" S! M8 j2 ?7 o# t  s" M+ C8 H) p6 Z) }; a1 k
   
4 F( `( M" b9 r" w    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过
$ g$ _3 C; N5 x& y  
* p( e3 q8 M! Z( f; @" p        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)  }9 `% D% i, ]7 m# J( o  p
        0053BBFF  |.  0F87 41020000 ja      0053BE46  ~- t+ W" O- y' f; K

  U8 N' F9 E- I2 {8 ^) K    eax 这里是3 一路F8比较下去到下面这里
6 T9 i' a/ O, t1 e7 J6 x* A& s! O! s. p2 E$ U
        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC
' @* [( r- K* h0 j0 Y( `        0053BCDD  |.  66:BA 1F00    mov     dx, 1F8 `& ]5 M5 V# ]$ r
        0053BCE1  |.  66:B8 1F00    mov     ax, 1F; o5 o3 X  ?* N. p
        0053BCE5  |.  E8 EA54F2FF   call    004611D4
$ n& I& @" d$ g" N7 G: s+ G( X# D+ }9 @
    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数
& {- b. ?, R2 \' {7 j. ]    * ^+ a/ q7 `# b7 c
    call    004611D4  就是调用 winrgb; d! h0 b, V5 F) x& E
/ T# ]7 B, }/ W  I( Z4 T
4 u  B$ V' o& D9 i, i* ^
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在; |8 E) q1 {) B' |  c3 ~! i; f

$ V& Y# F& Y: K  x7 h* H
    dll里面进行内存地址读写+ |- M3 _/ u- s' M, s

% P8 u! n4 h5 K+ z) e
    我是在% S# z5 I# z, S7 n: J: i/ l4 t; B
   8 Q) R1 B# \) G2 Q7 j8 r. G
    0053BBFF  |. /0F87 41020000     ja      0053BE46
, p' V% O; d; S7 i7 U

  V5 e# h; D, t6 c
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写
( ~+ \" l3 R/ a

  _' d. x' H% |3 r& T7 p1 Q
    procedure InitDll();
) q& t" t5 U! t: @8 B# z
    var, D/ Z% h' `; A$ e9 {
      p: Dword;9 k- v/ [& |/ U; M
    begin
  r) r% w# i7 r. R
      p := $0053BBFF + 1;8 R4 U5 n0 S& X$ ^  {6 W
      PDword(p)^ := Dword(@proc_0053BBFF);+ V5 G, p9 @6 H0 h3 g8 R
    end;
; k$ g2 Z" u* \6 ]3 ]' ]/ L
5 u; o8 S& E' L! B5 C3 a% x+ b5 U- x
    在自己的代码里面写一个色彩增加的函数判断比如  \# G1 c2 D: D% o6 K8 L

  }) W: u% D6 B- {
    delphi代码:: l$ f) a3 X6 v, h7 p

* u8 y+ _+ X/ Y0 P
    var
* _1 D5 B3 K# w
      EndAddr1_0053BBFF : Dword = $004F470C;
/ Z& K( k+ z+ x' U2 d+ M
      EndAddr2_0053BBFF : Dword = $004F44CB;- x6 e' g1 w, a7 ~0 U  q% Q6 j
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转
' U$ U5 H9 k7 ]/ P7 V3 _& C, [5 n
# d/ U8 l# l  S9 ?' B8 ~
   CallAddr1_0053BBFF : Dword = $004611D4;# Y+ T. \' z- e5 ?; s
      CallAddr2_0053BBFF : Dword = $004611D4;
$ t  u5 j: e8 ?! m0 _& o+ ]

+ P7 ~, f! k. t% p0 a
    procedure proc_0053BBFF();
, Q& a+ h& P: J$ x- Y" \6 w
    asm  A7 m' a1 n: X5 P/ l4 b+ X
      cmp     eax, $10                        //与预先设定的 最大17比较3 m7 |' W5 b4 Z9 o; Q
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值- j/ ^0 ^7 t) [4 h, p, M* n4 W, a

* ], T0 l7 _+ B4 N
      cmp     eax, $10                        //比较是否等于16  z; I( c+ [5 `) W- A+ ]1 t
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分) \5 ~0 M3 E  U4 m3 y1 D# T  ]

: w$ F* E' t3 O9 k1 e. e4 D
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试* v* s3 M) P3 {" D2 x
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
. d! `' l' P2 F
      mov     ax, $A8 h8 N$ k% w5 _% G% w8 H! [
      call    CallAddr1_0053BBFF
7 ?: m9 U' O# j5 I( G
      mov     edx, dword ptr [ebp-$14]: E7 u2 t; d: y
      mov     word ptr [edx+1], ax, t% v9 U" M6 s# G, `
" L; X$ e/ w8 H0 H% q
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
/ D. g4 O& }2 ]% Q* F) r6 F! e
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
/ h2 q, u% U6 s( W
      mov     ax, $10- D" N, u- m0 _6 x
      call    CallAddr2_0053BBFF
& ~& v8 F, ~# l7 b
      mov     edx, dword ptr [ebp-$14]% Z% j7 H5 ]- \2 O9 S
      mov     word ptr [edx+3], ax0 P" I) H) {7 t7 q
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs2 {+ {9 r- f% l5 Y4 ^' N+ H

. r  [, T1 X. F2 H1 F- o7 H
    @Seventh:( l4 F0 _9 M- n: |" ~# ~3 e2 f
      cmp     eax, $11                        //比较是否等于17
- o' [' R( f5 b2 c8 f
      jnz     @out                            //不等于就跳转到默认部分# y9 \- H/ _' l

  Q  m. k5 ^( |# d# d, h+ o
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试7 e0 H" y# C5 E* {' {4 P* j5 O* G
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
' n/ R9 Q+ c( F  z
      mov     ax, $A
8 g5 Q* U1 J4 T# A  g  |
      call    CallAddr1_0053BBFF; h* e6 g# k, M5 U& S
      mov     edx, dword ptr [ebp-$14]
$ ~% S7 X* O' b) A% H5 x+ e
      mov     word ptr [edx+1], ax$ @8 m' v7 M/ S0 `7 X& ~' r

/ a. _' m3 }1 X; w. k$ N1 r. R) A
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
$ r$ f9 a0 ]7 F/ Y) d. E* U. V
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
' |7 j; T: R$ ^* q- a. B- @
      mov     ax, $10& t, I, [3 ?, s: U# a
      call    CallAddr2_0053BBFF0 O% G  n2 ]7 Y8 [/ |, h8 w
      mov     edx, dword ptr [ebp-$14]) d& H9 h" a  W, v& F. K& w
      mov     word ptr [edx+3], ax6 G* F: R1 f( ]: c4 R4 n4 Q( ~
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
9 p9 f7 u* ^% d' |/ e
                                               //
) c8 w9 C5 E+ F$ Y; t; U* k1 B
    @out:
4 g# p  J" Z2 f) I; l9 M& p( S5 J
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点: \( ~4 ]* z$ M! Z
& y* t! D/ ?" {+ ^/ ]1 d# l
    @OldCor:3 e6 G3 L0 L6 g& K, T5 F) m9 p" O9 C& J
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值2 t5 ^9 c( D; w  y
    end





欢迎光临 三千论坛 (http://3000y.com.cn/) Powered by Discuz! X3.4