三千论坛

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

作者: 异仟年    时间: 2022-9-5 20:27
标题: 初步了解tgs插件的写法
本帖最后由 异仟年 于 2022-9-5 20:28 编辑 / }2 V8 C& \- j. d: d5 }8 G6 j/ n1 C
$ w' G: b( b9 K5 e4 U
编写需求条件:
& Y2 F# ~: Z6 C  h) L8 L' g8 q3 B6 Z6 E$ A8 v) z
    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)
% A/ J8 C# q9 o3 a& `
( _; d; J! L8 [) ?$ b0 }, l9 J2 O) R/ n/ j9 n- c9 ]! c
编写过程
8 T% \2 P5 N$ `/ x
/ d( }8 o/ K7 d0 A. X, Y8 ^2 @  L+ M1:
7 t8 g4 m  r4 S% }7 u
2 n$ h4 J3 D2 N- u    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面
% P+ _" u( ]+ _
2 }; u) ^  u( r. U5 P. j6 ?
3 ], t* |8 }4 @2:
4 J4 j+ O5 B1 U, X' h! J! `5 |
  |( j- v) w- `) W$ p' p( P1 Z; I    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序
. h! d3 u/ a+ A% s" Y" X" J% @, T0 O/ f' c
    启动客户端进入游戏(后面要用客户端)5 U* f, M. h% s( n

' ~: M. M# L. k- H7 O9 v5 f. y    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
/ f$ ^0 \+ q+ J. P2 R* n
" h3 l  ]3 D! B    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序
+ P+ c  J  _6 j1 G! s/ U
0 w& f0 q# Z0 |' o) Y3 E* h0 ~1 P    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到
1 ~) s$ b1 r% C
2 B9 @  _* U) g. R    od停在
) Q6 ?* Y' B3 n, N5 J  z1 Q8 \' y2 {$ T$ S
    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "
! Y) _1 G. `1 e; V
6 q! ~3 U$ R$ x- @; r) F7 Q. g    双击这一行 再次看到od定位在汇编代码显示页面/ v& o  B, p& P) e

% Z* y; d& D( v( p
' d9 y# y3 G1 F( s4 }        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: " 0 g1 _3 ^3 Z+ h
        0052A0CC   .  E8 C7A5EDFF   call    00404698                                
8 v+ U# g* i) |9 W; \        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容
7 S+ K+ }4 T5 w+ G        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用
+ Z& H3 G  m* S9 @        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        4 Z* Y7 Z0 V( b' O
        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB85 Z: \- L* T7 v! K' G2 o6 F3 |
9 F& m& c, h7 ]# h4 f( o6 ~
    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????
1 R" m  ?% Q, x- ?6 Z/ r5 r, u/ c   
! q; _8 W2 j/ d4 _* [    这时od会被中断, 断在刚才下的断点处, 这时按下F8
, y" o2 s9 r1 w" S! B* |) Q% Q
" v' v: p' P$ n7 z# U& N4 d) \    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩* f/ I9 J' o: b! W9 T

/ F& ~5 z6 ^' m9 X8 j* V" W    同时发送数据给客户端
( F6 p1 j: M2 e& P/ V* P9 S
- ^- M4 D9 }% o    - ?: A* x0 Y3 N% P' T- f
    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过
! z& Q* n" n, S! J  7 ~) J' j1 i4 z: z2 y
        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)# M* Z+ W8 J& C* v+ \5 M8 J
        0053BBFF  |.  0F87 41020000 ja      0053BE46
$ w% W" x' h) t4 Y: x, Z9 B
3 J  |" q* u' u0 K4 _! |6 l: V    eax 这里是3 一路F8比较下去到下面这里
% [5 X& b4 D" e! w% O8 _' ^  P
1 z9 x- V, O+ e1 e9 T0 O        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC
2 D4 B7 e7 C( ?        0053BCDD  |.  66:BA 1F00    mov     dx, 1F4 l' d8 Z& a5 E* ]' j: r* y7 h) b
        0053BCE1  |.  66:B8 1F00    mov     ax, 1F! d8 D$ Z1 e& c, g2 q
        0053BCE5  |.  E8 EA54F2FF   call    004611D4
* {3 F% t6 Z& I, l
2 j8 u; m1 O+ Z- N1 x0 u* U2 h" S    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数 ' ?* l3 U# P2 @0 G2 J' W* |- S4 h
   
' y2 U3 }4 Y1 ^- f8 Y    call    004611D4  就是调用 winrgb
6 H7 z9 _' N, G' Z
3 J1 ]+ i8 K( t/ L) @( B* Q  i" ~2 p+ X$ m! X- i) _/ t
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在6 V% b# b/ F! j6 g5 O
/ O' H' r8 |: g' l1 N! b
    dll里面进行内存地址读写* U8 Q1 F. Y1 @4 t! }: i' y$ |

. D5 [' P2 j$ M' a9 B+ B" y$ D
    我是在1 h- M5 I# D) r% a/ d' R" n
   
) C$ d( ]# D8 B+ j0 X
    0053BBFF  |. /0F87 41020000     ja      0053BE467 U/ ]; d: I8 Z% V+ p
# N+ E# ]% J& E8 P+ p5 c' I1 o
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写% E% J' H) r' d$ O& l( @- s, e

  ~2 i2 u% B9 e' z+ k# t
    procedure InitDll();. \- ~. ]' F& P9 y5 V
    var1 e- [* n" i$ P3 \: e+ z* l
      p: Dword;/ s& o0 C# n4 [
    begin. \$ e3 N4 _. A0 a
      p := $0053BBFF + 1;3 \8 w5 K8 ^6 U: ]# @
      PDword(p)^ := Dword(@proc_0053BBFF);
) v" a8 `2 r% E9 ~% F  m% K
    end;5 P+ p+ }9 V9 M
3 ^& ^$ P% v4 ]- @5 I! A
    在自己的代码里面写一个色彩增加的函数判断比如* T9 ~5 H5 O' c! V5 b

) p; y# i+ J+ o5 I
    delphi代码:
$ b& e5 Y& b( S1 q

! g. s0 N1 F" S1 M+ Q4 B" _( R
    var
! t. Q5 s+ t, h7 r
      EndAddr1_0053BBFF : Dword = $004F470C;
! d9 v) A* S2 a  X. A4 \
      EndAddr2_0053BBFF : Dword = $004F44CB;& `; R4 I0 Y- F6 z8 G
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转: w% e. u( q% E' f1 W7 g* L
% X3 r8 r9 I: `, s
   CallAddr1_0053BBFF : Dword = $004611D4;
" q% @! ]% g8 G* a
      CallAddr2_0053BBFF : Dword = $004611D4;5 [( H  q, k2 a
! d! z* G! `% q
    procedure proc_0053BBFF();# E6 E0 w+ l$ T* m, k, z" o
    asm
" v9 T8 D$ `* L; c7 N7 K
      cmp     eax, $10                        //与预先设定的 最大17比较
( g# j$ R  @; j1 F; q9 f( Y
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值( m0 Z' f/ t( k, c; v
7 W' }# K6 H6 Q/ }2 e5 J* r! Y
      cmp     eax, $10                        //比较是否等于16
- v! {5 ]0 X9 L
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分
( Y6 C, g7 _6 o8 @$ j9 s
' m6 \- j8 @! e2 Z
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试3 B& c' V' [( e
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
1 ^* K7 t5 M+ i8 `  F' B3 P8 z
      mov     ax, $A
4 e+ S% Q4 S- m4 V1 T
      call    CallAddr1_0053BBFF* p, s! M* g0 @7 ]5 [6 v8 w
      mov     edx, dword ptr [ebp-$14]
" o, Q; y) X5 k4 @& ]
      mov     word ptr [edx+1], ax0 a! b( h" Z5 p' V% W3 ?
( ~- Y) T- s) v4 F6 d2 W/ k9 K
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
. Z/ }4 t; M: Z* }6 h
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF2 V5 n0 ]0 E+ a6 `' i% L1 {
      mov     ax, $10
  W' i% m$ k# n: `+ E& D
      call    CallAddr2_0053BBFF
4 ?4 [; s5 n1 G# {- Z' a+ T+ g
      mov     edx, dword ptr [ebp-$14]
  R" x, L3 K9 A4 K6 m+ {' I
      mov     word ptr [edx+3], ax8 [2 G0 I. w! e0 Q
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs/ \: D; A5 E3 W. y2 I" O
, C% ~4 D& I" O7 W4 O
    @Seventh:/ Q; r2 u$ g! l
      cmp     eax, $11                        //比较是否等于17; }) e, @" h" Y8 c* i  x
      jnz     @out                            //不等于就跳转到默认部分0 p$ ^( ?. m& I; `7 v

3 N3 o8 ?2 C: [
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试# b" ^" e# O" \5 Y5 A9 d
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
" P& Q! E' r- c4 }6 M4 n
      mov     ax, $A6 x$ e' k7 x4 B
      call    CallAddr1_0053BBFF' D; l- B+ \8 u8 \4 I
      mov     edx, dword ptr [ebp-$14]
" U5 M' u3 v" E. F
      mov     word ptr [edx+1], ax* a( F  V9 G8 c+ _5 i9 g& {
+ u# I, ]% g, B1 T! \* K0 Y
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
* Y5 s+ y: y* Y; \2 c! @9 N+ M
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF; W) O  k3 [! ]
      mov     ax, $10
1 W- G# ]/ n3 z, h
      call    CallAddr2_0053BBFF3 q" a6 b5 H" E/ `1 ^
      mov     edx, dword ptr [ebp-$14]8 a' k7 g# k( _: W8 _, l4 J! l
      mov     word ptr [edx+3], ax
" u3 }+ }& k1 I" l" f
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs2 I1 B: G7 T5 q# b* }* h
                                               //( x3 J2 Z! f7 f$ P& v# T; d7 N
    @out:
4 u: b, ?# [% r* w) ?2 }7 t  \
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点+ ~( u% M) V4 _  k2 F- i

6 a9 x/ g, W7 h8 O
    @OldCor:1 G9 i! K# d! K! ^
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值
* p+ n% r* U* p# S
    end





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