游客您好
  • 点击联系客服

    在线时间:8:30-18:00

    客服微信

    Wkr-3000y-kf

    电子邮件

    3000y@wenkeruan.com
  • 手机版

    随时掌握游戏动态

  • 扫一扫二维码

    添加微信客服

Lv.7 版主
8号会员,9活跃值,2022.09.01 加入
  • 127发帖
  • 123主题
  • 0关注
  • 0粉丝
这个人很懒,什么也没有留下。
独家推荐 更多>

初步了解tgs插件的写法

[复制链接]
异仟年认证商人 发表于 2022-9-5 20:27:36 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
本帖最后由 异仟年 于 2022-9-5 20:28 编辑
9 |8 X; B! Q6 L2 }8 n) Z+ H9 }. q% _: F% `
编写需求条件:5 c& F8 F* Z" M

: O  [. f2 `; {2 k* A. ^5 O    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)
- G& k+ f; ^& V5 n9 F  Z$ S
% r' @) r; s2 b& b" O; S
5 V3 Q3 {8 t* I. [: A% }编写过程
9 o" I. w5 Z0 z# ^2 e: V. u+ V* H% q0 P' L6 r% P4 e5 n( z: e/ I0 M6 E
1:; |- {: n' R: K' X
0 J) a, ^9 c; x7 J
    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面) J2 b' T& P" S/ b$ b  c

$ y) ?  v- [! S) i
& M' d* W: b3 I0 N$ H3 \2:
+ I3 t3 @8 a- i# l0 R3 S5 A3 w8 O
    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序& p; A) G1 J- Z  `

2 {% {3 W+ x3 h! J3 u2 {+ W' `    启动客户端进入游戏(后面要用客户端)
& w% H1 }: G7 b$ q* r* [4 V' A
4 ]% {! i1 W/ a$ J4 t: O% m9 ^    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe5 b0 ]3 W4 v; I' C2 F4 O
3 L* J# O4 S0 W( l' r2 P* r
    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序 ' G6 \' p2 ]! e
# s1 g5 h8 w" H0 z+ L2 D& H4 f
    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到3 L& a4 h( x, A: z9 E3 ~, v
# b1 p4 l8 m/ O0 L, a# U- h6 Z) n* |
    od停在# E+ u8 k" s) }: a% H# s8 G

% b. Y4 @8 }2 c9 B& R3 v1 _, v    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "! D1 u/ B; C6 v6 `* Y1 S% i

9 X, M6 m, B4 f& s/ |& b    双击这一行 再次看到od定位在汇编代码显示页面
* t. z  o2 R3 B: v0 M/ V
3 n5 h" x# e+ c: Y* F3 J& X% _; X
& u( Y# M5 ^8 ?5 z        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: "
% `/ W* W, e% B* y        0052A0CC   .  E8 C7A5EDFF   call    00404698                                  E0 s' @! v- `4 @
        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容
, y  f0 T& K: |" v% X# O        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用
" ^$ v5 Z6 G1 I1 ^        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        . r9 Z6 `" _! @* L: p
        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB87 Z% W8 w; L, {( m

6 T, \$ A1 x# Q7 \" S) y, K    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????
9 G- k* |, ~0 A- U    " P5 R  J/ X- i% f7 [; m* p
    这时od会被中断, 断在刚才下的断点处, 这时按下F8   h. x% Y: W2 _- s0 ?5 J

3 E7 F- X3 v% J' L    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩6 R/ V( i: w  Y5 d- q% g& O5 c

2 c% O3 m1 t/ Y: |    同时发送数据给客户端( r6 m' e7 Y9 I( _; K) o2 d

: A0 O4 Y8 s. b$ I$ m9 C: l   
# W- o+ H4 L0 m- t& L9 f: o! S# l    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过
# Q/ t& n7 t/ O' O, h  
4 d  l9 B3 s, |! W        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)8 n. J# f- R. D' C8 D* O5 J
        0053BBFF  |.  0F87 41020000 ja      0053BE469 A0 K& w5 O1 o/ S% v

; T* u$ C: L6 Q9 O6 D7 A# I+ ^    eax 这里是3 一路F8比较下去到下面这里
. K2 B; S& D: ]3 C# t( y( L+ O1 Y( N" A. u4 e. j' ~$ ]- q" o
        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC' a/ v# K8 }4 q0 d$ H' C
        0053BCDD  |.  66:BA 1F00    mov     dx, 1F( {4 B3 P4 H& S
        0053BCE1  |.  66:B8 1F00    mov     ax, 1F9 u4 l& n$ T$ Q) a! k2 Z7 l% y8 z
        0053BCE5  |.  E8 EA54F2FF   call    004611D48 ^" ~& `9 I+ M) Z: P) c2 _4 h  N

* z# A, c/ z/ `6 K# L, U" M: O5 v    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数 2 \0 u$ v; x- G) E2 h
   
6 b+ j3 ]- I% ?    call    004611D4  就是调用 winrgb) k% u3 K& c$ n# z

7 h! F' @) y" P2 a$ v& y
, C. L/ S2 p9 H! `0 Q上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在" _. Y1 D: E( |" S& l

8 @2 A! T$ B8 v  Z. J
    dll里面进行内存地址读写" }& _" I3 m4 I- z& `
% C  z, F: P' j; Q
    我是在
! s3 g8 e4 ]) g5 l1 U; e( |
   
% p' I+ Z% j% y, d
    0053BBFF  |. /0F87 41020000     ja      0053BE46; a+ l2 `( _! }/ o) Y

3 ?$ [8 ^4 F# |6 d$ q
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写
! F2 Z0 o9 `7 c# J
% `. J. j4 _3 \
    procedure InitDll();
$ u3 Q/ }5 ]8 |' A2 y
    var
6 L: `( d* {6 z4 T* Q
      p: Dword;; v% ]% x) l5 E* v8 G! ^
    begin
$ A7 I9 D; l* W# O- S, n
      p := $0053BBFF + 1;& J/ I9 r# `' F, w+ ^
      PDword(p)^ := Dword(@proc_0053BBFF);
* h6 ?$ W1 I# B3 l; M
    end;5 i! o2 }7 }( g5 G
) V& E+ Y9 w0 i; W5 @
    在自己的代码里面写一个色彩增加的函数判断比如1 d" _7 j0 A0 K" K

+ h  v- v0 _( L& |
    delphi代码:* u0 g  U/ u& R1 ]3 b5 c
, T0 K1 \0 a7 [! {& p+ b
    var
) Q3 f. d3 F0 I& Q, ]0 f
      EndAddr1_0053BBFF : Dword = $004F470C;
! u+ f) k1 W. l% L$ q1 E
      EndAddr2_0053BBFF : Dword = $004F44CB;
. l% z4 p. B; h& ]( w
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转
2 U' z) j' q. z+ \( S0 V
' T6 W  F* ^1 T& Z2 P2 E& T
   CallAddr1_0053BBFF : Dword = $004611D4;
3 D4 g* e/ d9 C" [" T
      CallAddr2_0053BBFF : Dword = $004611D4;5 G. \2 V. P$ i" f3 a

8 k% J& U! F  B1 N% ~1 w2 V+ u0 K
    procedure proc_0053BBFF();
* L5 R( e% J/ M) y
    asm
) e7 e# F6 d: Q" X3 D2 h
      cmp     eax, $10                        //与预先设定的 最大17比较$ |7 S( S; I8 f) I9 m3 S( @' J
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值% }" ~( I: A. K5 |5 k6 g

& P" ]. m7 \2 Q+ @. m
      cmp     eax, $10                        //比较是否等于16( z1 u7 u5 k/ Z0 ?) ~% \4 X1 U6 I9 u
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分
. f5 ]: f8 r: {. x# O
" R* e& `3 ~. j( j, q) W
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
: v* W2 B. W' z% G; q: u
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF9 k1 x0 F  ?+ X9 J  E1 o& R
      mov     ax, $A1 o% v2 b" b7 P4 B  ]+ p$ f
      call    CallAddr1_0053BBFF
9 h; ^) R+ B3 J! e* z
      mov     edx, dword ptr [ebp-$14]
0 z4 U/ f: R! j8 s9 l
      mov     word ptr [edx+1], ax
/ F8 T: h, v, U+ P$ t: Q1 c
4 {- f, q% c( a# O
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
" }' y9 I3 @, `) S4 n& l
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
$ u& K+ X2 g) t- e! X4 k2 j3 E
      mov     ax, $10
8 r, ?: n, M1 ?3 d) t8 z' }' v; k
      call    CallAddr2_0053BBFF+ o; U/ k" v, E0 q/ p
      mov     edx, dword ptr [ebp-$14]0 q2 \( b, ?( F3 S/ C
      mov     word ptr [edx+3], ax8 T1 r1 ~, i: Y) L
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
, b% B" [- n% N* a& R; E8 [" }

. B1 B3 b3 |+ [3 z$ p) c1 S" V& m/ q( d
    @Seventh:, x9 T9 {: ?( h& z( O
      cmp     eax, $11                        //比较是否等于17
4 r4 y0 c; C! |1 P/ s( G6 d9 |( r
      jnz     @out                            //不等于就跳转到默认部分
( R; F$ n& q; W$ E3 R0 s
$ ~( D( A; p* h5 N( q) D
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
) X' t/ C. y  C8 [
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF% v! |7 X4 n4 V4 P9 @
      mov     ax, $A+ n9 _( ^6 q8 x2 }- h8 \
      call    CallAddr1_0053BBFF2 p) N& B% J, x
      mov     edx, dword ptr [ebp-$14]2 L% I$ U9 f6 K7 M  i
      mov     word ptr [edx+1], ax% @% c8 O8 }  z( ^- a

( ]9 Y; X+ s* q3 T" I2 V
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
, T/ \- Y/ X+ o4 e
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
/ X, V  H; V1 S" C6 u
      mov     ax, $10- N, |* t- t  U+ B  B1 b5 J
      call    CallAddr2_0053BBFF
. p: T- h& Q) l  ^: O
      mov     edx, dword ptr [ebp-$14]
! V' |: w( F" t1 D% Y- l$ C# w8 B
      mov     word ptr [edx+3], ax; L  T  E' J% a
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
% ?9 e# e5 `7 J. E/ R4 i
                                               //
( P+ t9 w) Q5 c: J
    @out:! |% o2 a" N6 P. ]6 z) C4 [* h/ D
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点
% S5 W0 V2 P  C# W

1 R. \4 m( z# I" S
    @OldCor:- V% I) A. `7 }: E' r, i' f
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值
/ U/ o+ \: s. \& V) n
    end
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

Powered by Discuz!X3.4 ©2001-2013 Comsenz Inc.闽公网安备 35099902000100号增值电信业务经营许可证 闽B2-20220593 闽ICP备2023014375号