三千论坛

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

作者: 快要发癫啦    时间: 2023-1-4 09:08
标题: 初步了解tgs插件的写法(一)
编写需求条件:
6 M7 |7 }. j4 u  `/ D
( ?2 Y- i' j0 i# h; R! d
    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)$ t3 \- C- q. D- @8 |5 \

3 H. N1 U9 Q' A$ ^

; W& M) p/ k8 R8 U
编写过程! o) t9 f" E9 e/ q, |
3 w' O* m9 a) U: R3 i3 X+ z
第1步:; z" \4 l5 H: P$ x' j0 L

+ _6 p  y+ ]- g2 t8 K) Z! i" k
    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面
: o8 `$ H; z9 j1 X; P7 k
5 L6 m" m8 R1 f

5 d  e; s; t* o& v$ k
第2步:! b: F3 S! Y  ^- L- t' w

7 w7 @8 n! |0 P' M% A7 I! y
    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序# ^9 a7 l2 x& R& R2 w# Y
, j, i( `! J! E0 g' a; b
    启动客户端进入游戏(后面要用客户端)% o  `8 W* r& x5 t0 e& P

+ G& ~2 g4 L/ X0 x
    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe1 t- l) E9 q2 E7 M( C
6 t5 _( R* y6 f6 o/ F4 x
    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序 1 X# @4 g+ F4 P" K8 X' k! l

* U0 S, p; s% d1 M! S
    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到
- Z% V# _3 S8 q$ ~- r# A  \7 Y
, _% m. e) g- e6 S( E) }' ^
    od停在. l$ H' D/ v- J( N% q" N8 ?$ A7 J
$ A* k0 e9 D) ]" E+ t% N  T
    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "
) P$ X# z- G1 q* E# c$ ^3 @

" w8 ?+ G4 B" r$ r1 {, W
    双击这一行 再次看到od定位在汇编代码显示页面
$ _( x7 G& y+ @! l/ j8 R( s
' f' f! A0 C+ E5 P

. f4 w7 e, I1 J" p. }) k
        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: " " ^% V$ s( H# e* Z1 P  ]
        0052A0CC   .  E8 C7A5EDFF   call    00404698                                5 I! ?$ j6 m9 x! |+ r8 Q* f. ?% S: V
        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容# P; Y/ p( F' `4 x" P$ }$ E6 S5 i
        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用
+ d! {7 Z6 H. I7 i- \
        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        3 W9 g7 j' D* u
        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB83 e5 v0 m/ M5 z3 V) ?  L
$ w+ C# t2 X4 E6 V6 Z
    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM喊# ?????% ~" r: M6 l% O0 r& a
   
6 `$ z$ m' D0 Q0 f  u
    这时od会被中断, 断在刚才下的断点处, 这时按下F8 3 g, W  A7 r$ }/ g# N- Y

4 D+ \& G2 f) O* c' b
    到call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩
0 K" r* d2 V) c  L5 D4 [  \

. x3 q% p! r2 [$ e6 m! T1 E
    同时发送数据给客户端  s  k9 u% k6 @, m* _5 S' o" {

- G# p: @9 |& m( f/ I
    . S/ Y$ a: r0 T& Y: m  r; @9 c+ Q5 M
    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过
0 g& E; Z( H, g3 `3 L  k# F( j- G
  7 l# V, Z5 u  ~9 `0 a5 c9 Z; s
        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)
" h$ H8 e. j* J! v+ Z: K9 q
        0053BBFF  |.  0F87 41020000 ja      0053BE46+ w: J0 B, d' u) N3 N" S# S

" K2 m- X. c( F1 D
    eax 这里是3 一路F8比较下去到下面这里
6 Y2 D" H0 b7 i6 W& p

* {0 {& |- Q8 o0 T* u
        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC
9 o' C3 s) J* ?) F/ u3 o4 @9 |5 R
        0053BCDD  |.  66:BA 1F00    mov     dx, 1F
0 X2 H3 a$ w. T8 A; Q! [2 g  K( N
        0053BCE1  |.  66:B8 1F00    mov     ax, 1F
/ k, T/ A+ W6 Y4 p
        0053BCE5  |.  E8 EA54F2FF   call    004611D42 R( |8 G8 l0 b, E0 D
2 u; \# F) D+ |& V; K" l6 |
    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 的3个参数
* E/ ^4 A: Y3 P# J3 ?
   
* f: P' T9 [" B; k
    call    004611D4  就是调用 winrgb
6 j/ E9 C6 D) ?





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