三千论坛

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

作者: 异仟年    时间: 2022-9-5 20:27
标题: 初步了解tgs插件的写法
本帖最后由 异仟年 于 2022-9-5 20:28 编辑
8 V2 R$ Y- k. V- s7 A
; R, z, h6 ^- P
编写需求条件:
; ?" d. Y4 y3 Y  S2 o% x. L; x5 D3 g5 Y
    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)6 B! Y% [/ f% d9 K! N& ^8 m/ P

+ J9 [" u6 e# c, }2 a9 |
+ r: z. |8 m! x/ Q* |, A" M6 |& W, H3 F编写过程, p% i1 i- H' g4 p
5 k/ W2 ~) `% n& x& p7 O
1:
8 i- m  t$ _8 `7 L9 P; J7 c- P$ p3 a1 W  n
    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面' H/ l! W9 [; y' R& r4 O
0 ~6 [- ~2 [: }  Z: e
% m& _! K# \3 q$ n3 y0 }
2:5 x  d5 {5 A0 Z3 G
4 s2 u; P0 b" N1 |
    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序; X. M: b7 E2 I# s* [
2 k$ c: u: q% q# M  \
    启动客户端进入游戏(后面要用客户端)
4 h; K, R. S+ c+ ~; ]; s! D, Z3 b# y. z% T- T
    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
8 j, f+ u4 l; t0 g/ i; O4 e
+ ^/ I0 r$ u6 b    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序 . z+ |2 J7 ^% b8 W9 c# n! U  y
/ X; x7 j0 Q  I: k
    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到
/ g- N: E, g. ]9 @/ `1 @" h$ q( A1 y, [8 B# k- Y
    od停在
5 ~. h& B; V' B& @+ @- Y! a( s$ T8 {: n4 X. x& ^, N
    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: ") D9 U5 y8 ]% W4 M
1 k5 y/ C; w9 p7 U. H4 m: i& T
    双击这一行 再次看到od定位在汇编代码显示页面
8 L% W" C6 {* g8 H2 Y; n/ `4 U' ~, T9 M4 X% i$ V

( g' g, q4 q% l: ~6 q' ]        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: " & I3 Q' ?# e6 k% T2 h
        0052A0CC   .  E8 C7A5EDFF   call    00404698                                
4 C# W& s' ^# d        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容
" n( \1 m0 ]. A; H. u9 S# T        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用7 ~7 z" T  T! A, X8 K
        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        
& U! r% O8 L6 Z! l5 ]3 N        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB8; B" e) ^8 [8 f+ M8 ~
! f! O. p) L( k& M* R6 @
    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????, \1 K9 ]1 u) g3 d8 C
   
+ T) n, K: q! [    这时od会被中断, 断在刚才下的断点处, 这时按下F8
' S* @+ x9 k7 L0 h& ~
1 N- X* X& @  I7 _/ w, D0 C    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩
( y: n+ H1 E* ^6 x& `7 g4 t' R6 @9 G$ t- f. n. {( p1 u' C* F# ]0 d
    同时发送数据给客户端. B; y# r) K# G( X! S  Z# R5 M
4 |1 u5 i, A/ s) B, k+ ~( u
    & r0 `, \6 T0 S
    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过" N  d( `$ `" y6 K5 n
  % h2 i* V( i+ i" _
        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)6 D: W- s% L8 [; e
        0053BBFF  |.  0F87 41020000 ja      0053BE46( M9 @' o5 r, g" n8 W, Y( K4 C* z

# U+ j4 g! P5 }! }7 v$ s: O* V& ^    eax 这里是3 一路F8比较下去到下面这里
! X5 N) U) O# {$ M- W  }+ S+ ?# g, v9 M. B' P0 I# e
        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC
! ?) K3 w" |, W+ ~" f; m4 H4 M        0053BCDD  |.  66:BA 1F00    mov     dx, 1F7 E' _6 w4 ?, ]$ H  A8 n0 J
        0053BCE1  |.  66:B8 1F00    mov     ax, 1F- p/ @$ R6 Q: u; ]7 I
        0053BCE5  |.  E8 EA54F2FF   call    004611D48 }  [2 y( M: K7 o/ p5 y) j8 g. w
- G* A0 A) c. n9 F' k: N
    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数
3 T1 H1 I+ d9 Y    9 I0 E9 L5 @+ ~- e' M1 e" x- s9 W
    call    004611D4  就是调用 winrgb
' b1 R; c% L9 d. c6 l
2 B+ m  w4 I4 d5 r! y2 T
1 L# h. L0 [4 s2 f% \* B上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在8 s6 i4 D2 Z) e' }

6 e: r5 e5 B) u  }5 D' ^
    dll里面进行内存地址读写. r& D; t+ S4 S# {0 C- F, f8 r
8 d- ?0 u$ J0 L3 {" j* e" z* [
    我是在
/ u9 y9 X) O, P% p2 q
   
! a8 R7 ~& z" W3 f. q- _# ]
    0053BBFF  |. /0F87 41020000     ja      0053BE461 K3 v5 y( a* s; S4 {- ~
$ Z- ?" d) K3 ~/ d+ B- E
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写& ^8 z! U5 l8 y2 f

; c0 _. o5 s! @) \; a; G+ k$ |9 c8 v
    procedure InitDll();
7 V( ~# _2 c/ |4 g; S1 ?
    var
+ M4 D: O6 ]3 d% }8 |) c
      p: Dword;2 S! H3 t( Z  c* X9 i) X, e
    begin4 D9 f: ]3 j% ~: E7 N
      p := $0053BBFF + 1;# Z$ i; I8 {) s8 ?+ \: h& r, i  Z
      PDword(p)^ := Dword(@proc_0053BBFF);
0 y5 l6 b1 H" S) ]
    end;- k9 T* q* F" s* J9 X/ C4 t

. X) u& U# ^$ L) {+ a% V+ S$ O
    在自己的代码里面写一个色彩增加的函数判断比如
' K1 t# c1 r* M/ k2 q. M6 N4 C

; W3 S$ Q- u: n! Y% ?/ P! j# E! \( {
    delphi代码:! P- n5 u2 h$ Q$ v! N
: W+ |8 d3 q. k& u0 E0 {
    var
) ^" Z$ x6 Z& I1 E0 _
      EndAddr1_0053BBFF : Dword = $004F470C;
0 R* z6 c. J9 X  S% g$ m* Q
      EndAddr2_0053BBFF : Dword = $004F44CB;
  a3 j  @8 L' \
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转# a% l9 p- c. x" s

5 C% i' m. Q1 k9 S1 X) P0 U3 G. D
   CallAddr1_0053BBFF : Dword = $004611D4;  a7 @7 g1 |& v) a
      CallAddr2_0053BBFF : Dword = $004611D4;
4 p. g) A- x; J/ u0 [  D

0 K1 S8 `% ]7 g* T1 l
    procedure proc_0053BBFF();5 C1 n  p$ p  I. ~& f
    asm; ?6 i; o5 o7 n7 g; [
      cmp     eax, $10                        //与预先设定的 最大17比较
5 h7 {# I% L3 W  _& u
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值* E; B" V: K: }6 k4 @# [

: v1 z/ R" R$ Q  C1 [
      cmp     eax, $10                        //比较是否等于16' N( h8 t- M! g& W2 s: c
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分( L1 y6 \6 n: W

3 |2 P3 ~6 ^' b+ E# \6 n
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试3 t. q, S/ {$ }  O9 G9 I
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF2 ~2 g" N/ x3 l6 h
      mov     ax, $A
5 w, O, M) w. y3 g
      call    CallAddr1_0053BBFF
# Z8 y7 Y/ W1 O8 I
      mov     edx, dword ptr [ebp-$14]
0 ]8 u6 [% g; p! u6 v# l* C
      mov     word ptr [edx+1], ax
2 p  l# B& W3 O- z- d0 p- y

" d" Q6 `) ~% i! O7 k
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试0 A; O, t1 ~3 P: n' M. B
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
- u6 q8 C" S* r7 ?: C& c1 M  x
      mov     ax, $10- K6 m1 f, c- \$ Q, m  P
      call    CallAddr2_0053BBFF) E( p5 a" I# T9 ^4 k# W
      mov     edx, dword ptr [ebp-$14]) V& P; Q- D0 e5 z
      mov     word ptr [edx+3], ax+ ?5 C! t! z# @, s+ N0 F
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
3 e: [- F6 ]5 C( j8 o

, d* A7 d; \+ C8 ^
    @Seventh:) t* S" ^- k9 |# m
      cmp     eax, $11                        //比较是否等于17
7 ^6 k9 X( E8 [
      jnz     @out                            //不等于就跳转到默认部分; c1 B+ n: \5 F" }9 a
8 J- d# s7 b( K
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
5 [' e* C' |5 R% M6 `" c* V
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
' h3 c+ ]. v4 P5 J" {
      mov     ax, $A
$ J! n5 u/ `% ?- d( s2 O% C/ O1 K: I
      call    CallAddr1_0053BBFF4 W% Z; p/ z( {( n  Y& |' D
      mov     edx, dword ptr [ebp-$14]2 M& F$ U7 e4 K4 v) x) W! _/ h/ D
      mov     word ptr [edx+1], ax
; R6 j, h+ G  \) c0 j

" J; f5 @8 W$ ]1 [
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
+ ^* L' \& C1 ~9 G/ Z
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
# r  G% U  Y) w# [# x1 d
      mov     ax, $109 r( f0 x8 q5 q5 b) l7 G! D
      call    CallAddr2_0053BBFF
4 P, O$ V# m& A. Q1 J' @
      mov     edx, dword ptr [ebp-$14]
  W8 z4 |1 K& M& y' ?
      mov     word ptr [edx+3], ax
! @4 c, U# \0 e+ w
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
# B* w% e0 p) r
                                               //
: ]+ V( S, e# M9 O0 i  b
    @out:
3 |4 m4 a4 R' b9 {% q8 E
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点# `3 O5 J! V) R+ E# b9 c

  S; r& `; J; ~5 U
    @OldCor:6 w$ A8 R9 c: ~! d# _( S5 x6 t
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值
) c2 u- {' r4 O7 @2 y/ _/ v& h
    end





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