三千论坛

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

作者: 异仟年    时间: 2022-9-5 20:27
标题: 初步了解tgs插件的写法
本帖最后由 异仟年 于 2022-9-5 20:28 编辑 ) C' r5 U9 u' A

/ H+ |, F" [! @% b2 F
编写需求条件:1 K2 Y# k: U) C
0 S$ t: O1 H3 r1 m( j0 Y1 D7 V5 A$ x
    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)* F% f* r7 T8 n  o; {: h  R0 n
9 }4 M0 f9 L" U- G+ X2 F7 S
6 k1 U' E) \3 D* D) G
编写过程1 G; {& s! `8 I

& G+ e. G% ?  y! g1:: q+ C) [+ m5 U7 ~/ d' A

6 C4 T0 z* Y. t, y8 W, F/ \/ n    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面; _" G+ f$ }% i
- H, ?2 m# |7 o

3 p& c" T% i- a0 o2:
- M: u( Y" d# D, e% M8 a) B
1 A% p1 @- Z( |" _6 Q" e    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序7 I& T+ |. J9 @: F) F" Z
: |% K' C# h8 `; i' v
    启动客户端进入游戏(后面要用客户端)2 u# q; Y/ `+ L8 v2 d

0 D' u, E! H0 Q7 a, _1 K/ M& X    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe4 j; O4 [+ {3 b- R4 w, F
( O. j  }. v1 @6 v9 P1 O
    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序
. Z2 D9 I- @/ y6 K. y' {
/ n! W- p! _6 L4 J  V; n: K    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到4 w$ x+ |$ |( J# u  O) z0 `( f- o0 m
4 f/ x1 n) g+ V/ u! W9 g
    od停在9 z9 p/ F& G# z/ _

3 I' C' L+ }: C1 M  G4 r/ K    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "
6 v' n' R8 g6 `- v2 z% U. [" X; Z! Z) F% w3 Q
    双击这一行 再次看到od定位在汇编代码显示页面
6 c( B- L- \, J% m2 |  }( p# `3 `/ }+ A. @: \6 U! M
) [9 I6 Z3 R1 ~+ `2 U1 P
        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: " , ]0 p. |: Z/ y- o$ \+ X
        0052A0CC   .  E8 C7A5EDFF   call    00404698                                
' T2 y) s: q" J, P- v! T        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容' i. Q5 o: t- F
        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用* F& Y5 g1 O, s! f  K5 i" A
        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        
; \0 P% V1 }( T7 v5 ~. x2 C        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB85 k8 d+ r4 B9 q  A
1 K- R+ S7 j0 v2 W
    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????. }0 t; |- m9 P2 `% q# b- a" _
    ; \' D! F% \$ y. O, ]
    这时od会被中断, 断在刚才下的断点处, 这时按下F8 ) k0 Q% o! n  E, `* u. u
. z- M3 y0 T, m- k
    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩
* n5 Y  K7 f" e4 t: W
6 S; S- `) X/ z0 R6 `* {9 }    同时发送数据给客户端
/ q: T" @# j9 I4 M. z3 [3 [8 Z
2 z" j# k: T, G) F    , n/ l- s) h  N) g( G9 a
    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过% r5 W& R7 Q- P
  
. u4 G5 W: C. N. G& M) C        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F), F5 R7 p9 `" @
        0053BBFF  |.  0F87 41020000 ja      0053BE46
/ D+ U) f) S+ D2 p( t& i: L9 t+ X8 [( y9 |9 M9 g) X: M! ?$ b6 v& T3 D
    eax 这里是3 一路F8比较下去到下面这里
- q& t8 O" d8 I5 x5 h  |$ k6 ?7 T7 R
        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC
7 G3 y( G  K& `$ b: m2 V        0053BCDD  |.  66:BA 1F00    mov     dx, 1F
+ l" j5 U/ M, e! k  V, \/ T8 w        0053BCE1  |.  66:B8 1F00    mov     ax, 1F
8 [% J) K& R9 s) @        0053BCE5  |.  E8 EA54F2FF   call    004611D4& O$ Q! P3 D& G

) }9 i7 F; B8 v; {9 b( f1 N7 J* ~    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数 % S$ N3 q# X1 D. b9 f. w8 T
   
$ g, o5 q2 l5 j# _# b    call    004611D4  就是调用 winrgb: p/ t1 l; J! W- ]. L% G
& O- K/ Q; ~3 b5 O8 V- U" `" N/ q
/ K1 d/ P$ l. K+ `  `
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
* v" ?9 z# b2 I& p

' n. j1 u4 d1 t7 d  Z% Y: H
    dll里面进行内存地址读写+ ~" Q2 e0 f$ N3 B

  j( h* M  Z! r: l; N3 d! z$ @
    我是在
! p. |1 _% C$ G; S8 N
   ( J6 V1 b% u/ B
    0053BBFF  |. /0F87 41020000     ja      0053BE46
+ e( G; U$ |; r
: k' q" |) C9 v$ Q6 {/ x% i
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写* A$ b0 t# Z; b0 U/ j' ~

$ P6 b: B9 u! x. ?3 j: J  L# T, S
    procedure InitDll();
9 p, i( v& r0 e$ e6 H3 \# U
    var, o( E1 `- C0 S5 ]3 [* U
      p: Dword;& _+ D4 h& t# @( w
    begin# s" y& _3 J$ U! T0 J- d0 A# y! E
      p := $0053BBFF + 1;/ N$ b$ T" F  C
      PDword(p)^ := Dword(@proc_0053BBFF);
9 \% K' c4 ^, R8 j7 s% V: R  x
    end;
2 m" t( ^# t$ @" e  Y! D: `! F# G
6 ]) ]% n) D1 a* R2 e# L
    在自己的代码里面写一个色彩增加的函数判断比如/ Q) @- q; k" h& X: c2 k( H; [

- O8 h$ _/ D8 }: D' l
    delphi代码:/ x  X: x7 e% b( c1 q- E
0 b% M* |/ z+ z$ s3 K
    var
: t, l; x% @  g- _) j
      EndAddr1_0053BBFF : Dword = $004F470C;
' {; R' z5 v; F0 J4 ~
      EndAddr2_0053BBFF : Dword = $004F44CB;9 K# V; ]  s7 T( b1 J
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转
% f% c4 W3 f3 L- _4 c4 |4 |  K1 I4 s
1 {$ ^6 }+ d3 P1 b* Z  D4 _2 a
   CallAddr1_0053BBFF : Dword = $004611D4;
/ V8 n2 B# K- @$ i5 O7 Q
      CallAddr2_0053BBFF : Dword = $004611D4;
% k4 q3 A; |/ x4 n' S$ @

  p+ U8 p& N) N
    procedure proc_0053BBFF();! k( z) q" ?# f1 P9 n. ~
    asm
( e6 }) J+ a0 o$ \3 @. S- t
      cmp     eax, $10                        //与预先设定的 最大17比较
) u- S. F8 k0 o! e
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值
" M- x, E' D' t" X: K$ S
" K* g. F6 }( ?6 G3 u
      cmp     eax, $10                        //比较是否等于16
! h" T' d1 S( f  N
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分
3 S' j* n' ]& b8 E" X1 g6 o, e

/ T; r+ A9 |: r% C( o
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
+ _) f) d, k' `& `$ S4 b' V8 ^) F
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF% ^5 R, g3 o7 `9 ?) u! {0 B
      mov     ax, $A
5 L4 A& S, q8 X+ L% i# l
      call    CallAddr1_0053BBFF
9 l0 Q; O' P  o
      mov     edx, dword ptr [ebp-$14]
% U) ]( j! b/ Y- h  u0 k
      mov     word ptr [edx+1], ax
  y" P) l! {* ~# D  Z
: e- t1 j" A/ ?7 V% @
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
2 ?$ [/ m7 y  ^+ i8 _, V
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF: y2 ^( J4 B; p
      mov     ax, $101 H3 \+ ^% c3 R" S/ h$ _
      call    CallAddr2_0053BBFF! D' K5 v6 s0 h/ e
      mov     edx, dword ptr [ebp-$14]$ c/ [/ ^! @+ b  B4 B
      mov     word ptr [edx+3], ax- a& R! F' n! k2 W& h! d3 l. ]
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
, Q7 j3 w3 t1 Z! M2 q! D

# S, l# @/ `  n' t0 S  [
    @Seventh:
0 F1 {3 E+ Z% b. Q8 ^; a/ S
      cmp     eax, $11                        //比较是否等于17
1 O6 {" |- d5 y( W9 K
      jnz     @out                            //不等于就跳转到默认部分
9 ~" R% q2 [; ^1 \, P

' k2 j' C' t8 C* J
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
( ?- I8 ^" [2 `
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
1 i! n- V/ t) o% T
      mov     ax, $A6 v. c) [3 j. H# m# X# n
      call    CallAddr1_0053BBFF
4 [7 f) Z/ R* c' F. l9 `2 W4 O
      mov     edx, dword ptr [ebp-$14]
4 w" N0 ~+ [6 S  M6 u+ _) K
      mov     word ptr [edx+1], ax
4 V/ ]. \5 [$ m0 _' b

% U( c  r* q% U; w
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
- _; h& W# U8 V
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
3 ~6 D7 ^* Q+ d. _& O! f( H1 c5 J8 f
      mov     ax, $10; S; ~3 U. O0 [. y
      call    CallAddr2_0053BBFF
) R  L0 E6 H9 ~' a; q2 v2 P
      mov     edx, dword ptr [ebp-$14]5 |$ q. d& L0 T- [/ T6 Y
      mov     word ptr [edx+3], ax1 n. q! O  _0 f$ U0 b! @: ]
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
) C; ]) X! n2 }2 o
                                               //
4 x, f$ R9 ^+ R, ~& x0 A
    @out:4 j, Q6 r; ]( d4 F5 c3 Q
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点
; |- q9 ~1 K2 f- A8 b, A

; ~, D# z: j: U2 Z4 P
    @OldCor:& L1 m! r' }4 u0 g* f6 `) F
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值
6 E: ~4 w* W) T" m
    end





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