三千论坛

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

作者: 异仟年    时间: 2022-9-5 20:27
标题: 初步了解tgs插件的写法
本帖最后由 异仟年 于 2022-9-5 20:28 编辑
- i$ i2 H0 @' L. E7 w
4 I6 T# K) H4 d8 r, @# K
编写需求条件:
8 G2 c0 m1 c6 G. D" U
! m8 M& z+ `* W" D. {% h7 O1 a# @. n    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)
2 _( t5 f( R  i0 Q, p+ D0 c" X% _) r) E: |9 E

7 B/ ^; `: n5 |9 @5 ?: n) C/ ^3 l编写过程
3 @: ?) c. s/ z2 E' c. J) t* g1 B
1:
4 y9 X. C# U/ I1 t: k5 i1 ]: o: a
, w8 A' j0 w; q' z* J8 U    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面. k3 W9 f# j- H* a1 s

! ~) |0 L! H4 Z+ \* O  N# H+ }2 F& b6 l
2:
! b: I! A8 J( {
, k) X# M: u* v2 B5 V) h$ K    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序
6 J) k2 }" @6 T( m6 N  d" q2 @/ @( B5 w
    启动客户端进入游戏(后面要用客户端)
$ b+ z+ g/ S9 X9 k( U4 m, r, v5 s$ T8 p. @+ G4 S
    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
) ^4 T: d/ o- _
' H' J' ^/ d" X6 h/ e9 I    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序 $ U0 m- c/ n8 u9 z' i8 I9 t1 v( o
  V8 h2 O, n# u8 \/ ]; I" m
    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到+ S) C2 V8 f! O& z9 j- n
) U5 ]- O* v2 x' E2 D
    od停在$ w- c9 G: A. |: _
( C( d* h. y: H& U1 |& W
    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "
: X* }  J$ }8 x( r' @6 L# [9 N4 c- N' i- L5 q
    双击这一行 再次看到od定位在汇编代码显示页面
8 i0 b. M' N1 k; O8 m/ w
+ j$ f! w3 d! L- u3 i9 }. I6 G( W9 g
        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: " ) Q0 x6 _% V2 L! m6 `- V$ x( Z
        0052A0CC   .  E8 C7A5EDFF   call    00404698                                
9 N) K+ w: }& d' ^0 k0 b7 d2 F        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容: U; h! j" j' X$ q" f
        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用% B' Z1 p" _- k+ S( l
        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        ) a& h# C7 G3 n# P+ Y) I& n+ i
        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB86 |' a$ g2 ^% V, ?' o

" W$ j/ `$ ^% e- P6 O2 b; n    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????2 Z) ~: o+ p, F+ o: _
    3 q5 S' |) B/ n0 ]
    这时od会被中断, 断在刚才下的断点处, 这时按下F8
, L& c$ Z9 L5 g
3 t4 F9 z1 P2 ?- [    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩* v7 k& c0 z) d

0 A- ~7 [- D& t$ |% J1 x* `    同时发送数据给客户端
: [& k0 c2 t) B; T: z! O5 k' v3 Q& {: q0 h) q
   
( u5 ?6 g" o1 b0 H' E6 F    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过
4 P8 A6 P0 c5 |, X" V  
# h* w1 r% z/ E5 z, @& L+ ]" f& p        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)
4 |) E7 F. e. a; P        0053BBFF  |.  0F87 41020000 ja      0053BE46# [, L8 `0 D! `! ~/ X/ t
, U4 |' y1 r5 p( L5 |0 p, W8 Q6 i
    eax 这里是3 一路F8比较下去到下面这里
1 b  s0 R7 B4 q7 ]; C2 K
  @* s9 S  {3 ~        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC) F) ~7 _" l+ o5 l4 q. K; d- ^
        0053BCDD  |.  66:BA 1F00    mov     dx, 1F7 c4 Y% m' I1 T
        0053BCE1  |.  66:B8 1F00    mov     ax, 1F3 x- G. s: n2 {. z
        0053BCE5  |.  E8 EA54F2FF   call    004611D4
- F% X2 Z8 B* v+ p: K0 ~4 R3 g- n# f0 d
    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数
1 w% Z5 S( \3 z# _, _   
  J4 Q2 T  W4 o  }    call    004611D4  就是调用 winrgb
: p+ r" K( F$ y. B9 F) r: E" l% X" u# V( C

- |# C' j* Q* h! k上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
8 ^9 l$ a0 K: I+ @/ k

- \( f8 a& W+ C" J  ]
    dll里面进行内存地址读写# y+ y9 n4 ~0 z! o1 g, D7 X

- g& P5 T- G/ B6 Y3 \
    我是在
! {/ W1 Z( |# |
   1 Z0 j. \+ B% }2 B
    0053BBFF  |. /0F87 41020000     ja      0053BE46; d! {1 [: P1 f1 l) @

* t5 M/ l' Z, n! w' R3 g
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写
  l4 d- Y1 @. H, x

' A# }+ {- `& p* v
    procedure InitDll();( |: f- e, W0 w7 J
    var: b) {+ D  Y/ t, s2 n/ d8 J
      p: Dword;
; O: z" X1 J1 G( D& o, U+ p
    begin
4 }2 ?' J- w: J: k- y9 T: `, y8 O
      p := $0053BBFF + 1;0 V+ s; Q' E( s. \! f) G/ |
      PDword(p)^ := Dword(@proc_0053BBFF);" B" ?; B  \1 a6 I8 C, [. O
    end;4 Q; @% y" c* L
  y9 q3 v# T1 y7 Y& O9 T) c: t: W
    在自己的代码里面写一个色彩增加的函数判断比如
1 I: }$ c# h9 O* F, e2 w! }/ w7 r

! A1 }+ }- ~' b2 V7 D( F# \4 ~4 Q
    delphi代码:
8 \4 I1 ?0 V( s' g4 e1 T: @( S

0 X, S; g0 K2 d, M
    var  h  \* l; ~' G
      EndAddr1_0053BBFF : Dword = $004F470C;% P" J) }+ C1 k3 Z  y3 E, e3 i
      EndAddr2_0053BBFF : Dword = $004F44CB;
" m3 A# O# ]- ^9 E7 N$ j
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转
( P9 q4 S" Y: X  _! _  c- D6 l+ q2 S0 n" a
: q0 [( Y1 f. A1 f, }: \
   CallAddr1_0053BBFF : Dword = $004611D4;
8 h  o7 v, Z0 T! ]5 T
      CallAddr2_0053BBFF : Dword = $004611D4;$ I* L0 x( m- R

' t# D0 Q1 k8 y, S1 D
    procedure proc_0053BBFF();
0 m8 n' \" r5 ?) o& r8 y7 C+ j# k
    asm
$ f) ?+ u& F. R9 C# s6 ]
      cmp     eax, $10                        //与预先设定的 最大17比较
% S+ m1 T! ~" y
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值2 C! `" t& J% i6 \9 {3 N) G: w- n' M
7 t. P2 A; g' i6 ~+ {& Y* ~
      cmp     eax, $10                        //比较是否等于16
8 R; C1 C' R5 n+ Y- ~
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分
2 Y: G5 d  e/ |2 z
) H& |/ F' e. [" X0 [
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
9 P' l( }: g4 {( ^% ?: p9 q
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
+ G8 m( f" f/ E- d: u. R* ~9 J
      mov     ax, $A+ T* C- f% t7 Z( \/ y$ M+ T& g
      call    CallAddr1_0053BBFF
. T7 V# q) i+ M9 K5 L3 e+ F
      mov     edx, dword ptr [ebp-$14]
  i+ x. n  H9 R& E
      mov     word ptr [edx+1], ax
' z4 [+ l* j- R& C# L
2 d# G4 ~) W, S6 `# P
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试8 d7 M) e/ U7 j( G# R' X1 ^$ L) E
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF: C/ ]  f6 t% P6 _9 ]
      mov     ax, $10
4 f* @! h, [! P3 j) Z( D6 I9 E
      call    CallAddr2_0053BBFF
- g, S3 N1 \+ n/ m7 a) {+ {& j
      mov     edx, dword ptr [ebp-$14]
/ L7 P% V' K5 }. E
      mov     word ptr [edx+3], ax) {0 Y5 b+ g# O5 R
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs" ^  l7 g3 y0 P+ F+ H  A+ v

3 X& w4 B4 I9 [) ^$ S/ j
    @Seventh:
% m& Z* r; r; m$ A& _
      cmp     eax, $11                        //比较是否等于17% i$ g* a  d/ m+ r5 f
      jnz     @out                            //不等于就跳转到默认部分
! z. S) t$ i" j4 y+ A" |

- y2 j# V  V% t, U' h
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
( E5 W+ n3 s: C1 m) T  r, ^" a
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
' j# x' \; M: }4 K7 e
      mov     ax, $A
0 y, e3 h" \9 h/ X& m
      call    CallAddr1_0053BBFF5 T, r- P8 x" ?
      mov     edx, dword ptr [ebp-$14]
8 C: ^4 }. ~9 w; Y; k% {: N
      mov     word ptr [edx+1], ax1 e; X& Z6 z) N, Z7 [, M% g

; |( V" N% a: h5 F2 `5 U1 H: X. ^7 `
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
: W! B- |7 c! H% j
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF; {' I/ u  ^& |; `/ K3 ]' E
      mov     ax, $10
, L7 v1 L; J3 n6 ]$ w4 m
      call    CallAddr2_0053BBFF4 {3 E* {5 Y/ {# h; U
      mov     edx, dword ptr [ebp-$14]
. M. Q2 d, X1 c
      mov     word ptr [edx+3], ax
0 w% e" d' T$ H# H
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
1 P7 a& Q( I. T" S
                                               //* E# s' u1 ~* c, v7 u/ Q" ~
    @out:
& L$ W! o6 a" ^$ u; `) @
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点' X( t( F7 A: Z6 O( E

: j7 m4 N* p/ {
    @OldCor:
7 {" ]1 V1 q. d9 \  R; b
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值; h6 L2 P9 M  V
    end





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