三千论坛

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

作者: 异仟年    时间: 2022-9-5 20:27
标题: 初步了解tgs插件的写法
本帖最后由 异仟年 于 2022-9-5 20:28 编辑
8 I; c. |; \4 B5 t* S0 n3 {. i/ p
  o+ R5 l' R6 ]  g9 b" {. j
编写需求条件:+ ^  M, |% X  A+ B- j( X

* p9 r. n: _% D    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)
, O; ~5 Z; t  p) I* Q
2 `# x  D, O0 W( q, g; E1 _/ J1 e$ T, M: }, d% {3 A
编写过程2 n, J& a/ s; D

# [! r7 D/ i6 Q& s" Y1:$ @5 G' J& W2 V8 G! z& N  k
  `1 o- D% ]4 D9 y* g1 h6 Y
    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面
/ k) ?/ E; z, }" l  z1 R; p2 L& T" w
, E! O- S3 d4 Q* o" z3 h% x8 l- L8 Z8 {0 P/ O
2:0 P  b- W% S* j! {5 q& \

, [  R2 O1 O% U. H+ I# y    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序, a# v  b/ p. h0 L1 v6 r
8 [* p4 I/ _( o/ o6 E$ q  s1 W; v
    启动客户端进入游戏(后面要用客户端)7 I6 j9 m0 U& K$ V$ {6 x6 k5 p; s' ?* G

# J2 D. m" b7 G* a$ A  L    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
$ R  \$ H& U) j! d9 S; c- a4 K& m! G
    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序
1 F! N1 d6 O" e$ }: U- l. H8 b6 @* U; p8 ~! H& Z, U
    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到
! [( b7 T+ A( C$ ~: U5 [1 p5 `- t  {# C! I4 E# ~
    od停在
* D6 ^2 }7 I% K  z' `
4 i! t: S9 U5 {    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "6 w, r) \" G7 N$ X/ d* |
  p6 }/ ~3 Q4 T1 t
    双击这一行 再次看到od定位在汇编代码显示页面
7 w, h' L) T% d' ?' x# K
6 ]* M, r; T. j, c6 m9 d! L0 _; r& U) D1 P  a- B" _8 V  w6 Z& o
        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: "
0 W) @& ~. m9 z0 T( H        0052A0CC   .  E8 C7A5EDFF   call    00404698                                9 I2 o- C) T5 [
        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容
8 M* H' f8 J5 c) X. v$ E+ G, f5 v* K        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用
# x* R; A: D9 P" K& P8 \        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        
# G, P" G, _; J* j9 b1 H$ h7 G        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB86 E: I2 P$ A. j! g

4 i4 O1 U% H( l2 H6 H3 Y/ R    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????% u, X% B3 F0 {! B" ]- R) L
   
; i: ~5 u& ]' Z, }) Z    这时od会被中断, 断在刚才下的断点处, 这时按下F8
& g* ^4 ~- d9 N2 C- V4 P: K, V
9 |  o6 O+ P- ?* H7 l7 q    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩
) v/ K" l/ A- s* |) o" D$ R. I7 C4 l* x, V8 u$ z7 x6 B" ?6 T
    同时发送数据给客户端  W+ ~3 t6 s' Q  i7 i

% R" v3 A4 ^* q* ]    4 N7 N: A* a, H( B
    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过
7 t& r# @5 r: U( m  h  , w$ j& D5 z5 S4 h
        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F). b8 O  ]- X4 R9 s/ r9 z
        0053BBFF  |.  0F87 41020000 ja      0053BE467 H' {; b6 W6 A2 u& M5 y8 m
6 h% i* h: ?4 S, Q
    eax 这里是3 一路F8比较下去到下面这里
" m' ?( W8 ]3 w0 a$ D9 X& [3 q5 Y6 f9 Y. H1 D9 A8 j% ^* H
        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC
! F* V& ~  u2 J8 p8 [& o7 c        0053BCDD  |.  66:BA 1F00    mov     dx, 1F
8 m7 z* F  B# U        0053BCE1  |.  66:B8 1F00    mov     ax, 1F
' p* J: w1 Q; X9 m3 s  [* C        0053BCE5  |.  E8 EA54F2FF   call    004611D4
, b+ X9 A/ t) d/ t$ [0 ]7 A1 k0 [. J) g& V- h9 m
    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数
; |+ }) m1 E2 T  L+ O! M  }4 U    9 \8 {! {' n, d3 F1 U8 H2 P
    call    004611D4  就是调用 winrgb
' c. N$ K, i9 E( a) l. U; R3 x; b, y! I' Q- \/ O1 d
5 J. n" K! h' M& O( c
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在6 y4 u! R6 a* x; _' q7 y) \4 e! a

" y- c* N2 J) k) ]4 H+ [
    dll里面进行内存地址读写6 Y, H7 W% D: t8 P8 ^8 \. m4 a# A

# r) S+ T& @2 F$ F* n# C  o/ R
    我是在% X9 r" O, ~! Z9 _/ i5 e2 ^
   
! X8 y+ b; Y% z: @( g( c
    0053BBFF  |. /0F87 41020000     ja      0053BE46- Y1 e4 j, y6 c# W5 t8 X: M/ `; M

6 v4 T. z2 }: k- o  A% D' h  s# L
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写1 V, c5 f8 C, G

# ]( W7 D" ~+ H9 ~; ^: t
    procedure InitDll();
% v# D% {- S! _" {" Z
    var0 w1 ]( B& b2 c% ?& {+ ~
      p: Dword;# W* t- t+ u- v
    begin" s; z) ^3 }! ]6 G  I
      p := $0053BBFF + 1;  m0 \$ i  x/ k; |! M# z
      PDword(p)^ := Dword(@proc_0053BBFF);
% v3 Q7 p2 m3 u2 q6 q
    end;2 n0 @6 a. m: }& g8 y3 v

9 F, x  N2 F' [2 L
    在自己的代码里面写一个色彩增加的函数判断比如
9 j2 h1 c% ?' ~- I

2 x; U3 t6 B2 P/ ^
    delphi代码:
0 [1 P( c; U2 ^1 X; P
- a, F7 h: m" c' f; ^
    var$ Q6 A7 D" f: A& {; v3 a. ~
      EndAddr1_0053BBFF : Dword = $004F470C;
0 p9 K3 X( [/ [
      EndAddr2_0053BBFF : Dword = $004F44CB;
1 D7 z6 L2 n& t, X4 p& w( N
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转
  J* i1 s/ p4 I$ u
+ R) [: x; V* R+ u
   CallAddr1_0053BBFF : Dword = $004611D4;
' N6 h8 a" Z6 c3 d' L5 R
      CallAddr2_0053BBFF : Dword = $004611D4;
1 [- b5 y! Q4 q2 V
; Q7 [) J1 o1 r: _! m
    procedure proc_0053BBFF();* m# f1 G3 _+ o' w
    asm  I: b, O  G: y: U8 ?; D! J/ }
      cmp     eax, $10                        //与预先设定的 最大17比较
1 o, A0 X' J5 S& {  X9 m
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值  Z* d  T) f! N5 t

, z7 a. s9 Q6 g8 @- H  j; V
      cmp     eax, $10                        //比较是否等于16! y1 C. ^* V: D4 O0 u/ s9 A
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分
- S2 i1 j2 g5 a

6 ?) f4 ]7 Y* {7 L
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
9 I' w; c) }3 c# ~
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF9 k3 M  p  P  j5 D) Q7 c2 J& z
      mov     ax, $A5 Y+ J, |# `# x5 H
      call    CallAddr1_0053BBFF
% C9 }+ K2 N2 I: t9 d4 b7 i* ^9 h
      mov     edx, dword ptr [ebp-$14], m# K6 y+ W8 T& b8 E8 d2 O
      mov     word ptr [edx+1], ax: {1 N  Q; _+ ^9 \# |7 U* w
/ _1 f$ }$ I  x; A' r5 b
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试8 ?" N; ~  L% U+ p& L! Y! R  W+ F0 K
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
. ^" X' Q5 T* O. z0 P- {
      mov     ax, $10" ]; E: Z- N5 Y) \
      call    CallAddr2_0053BBFF% g# k7 f3 R$ d& \6 z5 t+ M# f
      mov     edx, dword ptr [ebp-$14]
* z4 I8 ~+ L" B) z8 H3 L
      mov     word ptr [edx+3], ax
7 M5 ]3 _+ C8 b; _
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
0 u) S9 [- Y& u5 l0 {2 u5 G8 x' B# R" t

' f, s- r1 s$ u* F( ^' v# z
    @Seventh:6 q' A3 e  l+ q# n  B
      cmp     eax, $11                        //比较是否等于17/ R% |; ]( ^4 N3 n9 C4 V3 n
      jnz     @out                            //不等于就跳转到默认部分
2 Q1 o5 C3 R+ |# B( ?
: {6 ]& ?, C3 u6 N- }  O
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试9 c$ Y$ `6 w- m6 ~
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF  l  j, E, ~- @  o! d/ z! a
      mov     ax, $A
- z8 J0 M* Q( J2 M* b
      call    CallAddr1_0053BBFF
# C2 D. M+ Z- u! J+ E4 f
      mov     edx, dword ptr [ebp-$14]( |! m( r9 l4 I2 I) F
      mov     word ptr [edx+1], ax' s0 S% `: U( s; k8 y* E
$ \; Q5 A* k6 P
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
/ t2 {% B/ \8 l& h( l& i
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF0 k5 p8 l" M  y4 Z
      mov     ax, $10
7 g* U. U9 I/ _  }
      call    CallAddr2_0053BBFF$ _* ?) j% i7 d" }0 J. H
      mov     edx, dword ptr [ebp-$14]
+ T- h& S  T+ J2 B$ @
      mov     word ptr [edx+3], ax$ o7 k) _1 f, P1 x9 r: n
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs2 m. l# n: P& r0 I3 l
                                               //
+ q/ a! ?" \. E0 J4 a4 {
    @out:! j6 Y4 r) m& z* T3 w4 P" D
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点* S" h' x* E+ M' d" B' B
) H$ F9 P! E  M, \
    @OldCor:
  S# X8 Z4 G; o4 z& e
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值
) @9 n0 n" o3 e
    end





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