游客您好
  • 点击联系客服

    在线时间: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 编辑 6 A: v& X* ?+ @) |6 ]

( o1 I" t5 f" F: d. O8 n
编写需求条件:8 f) u$ b% }8 N; n  F
+ M: P5 f+ Y- \& r
    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)
3 R1 j7 T# r) F" X
+ u5 O4 P1 h' p# w# P$ _, S0 z* P: b
编写过程
- e; V' r" V4 L6 ^0 k* h3 X9 ?# m
1:
  h( V& n7 b, i# f& ?4 R  X
" x2 A* b/ Q. a! o8 I+ t# Z    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面6 w6 d3 A0 C) w/ X, g

2 I) I/ p; a2 g& F8 l8 r/ c5 K/ n  k# K* F' [. H" |4 Y& r
2:7 o" B9 f% e3 Y$ k! `: U

! L. ~; k# \/ B) v3 m! E    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序# ~, t+ e+ @4 _/ V1 I" O
! @0 J! N! t& o
    启动客户端进入游戏(后面要用客户端)' F& Y& I) b0 j" Z; u9 |; i( d. t

! p7 H5 r0 v/ H$ s- x    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
& u, i. Y, ?# L3 Z1 X7 P1 p: s6 @! P) W
    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序 ' j( c3 S  S* N( t( T, F8 ^/ ]6 C
4 {* W! F3 g7 ~
    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到5 x. G' U/ O4 j

/ y4 x% Z! U, d3 p1 k    od停在
# y; x9 O* I6 x; P( U1 M
4 }7 B% K/ P: i: d6 ^3 B. Q' j# V9 a    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "/ M; Z: @4 s( n# S# {
  E4 a" _+ K" V9 @+ G9 Q
    双击这一行 再次看到od定位在汇编代码显示页面' b% M2 ^; t" t" ^# I
  d( k2 k3 y! N, ?- T5 v* u  i$ I
& p4 `7 r! y+ O$ o) d4 \
        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: "
: b9 e  ~/ G! H* m        0052A0CC   .  E8 C7A5EDFF   call    00404698                                / F9 T' ~9 G: Z" m7 ]" ]2 Y* A
        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容
, @* |, N3 R) X( b0 i* P        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用
* J  g' R( W9 L! a* W6 m        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        2 j; e) s/ U3 x' {  _7 i
        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB8
) B+ A  F4 j9 w: R# n0 `4 X: Z8 H% W, e/ u
    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????8 q6 L: `( [1 b1 j
    , \$ h, t$ I0 R5 |5 v0 i2 `& P
    这时od会被中断, 断在刚才下的断点处, 这时按下F8 - O4 c, R' `$ |6 j  A* m" Z

, c* P5 j, s# S7 l% g0 @    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩
& @- \  x6 C& ?  a7 `- ^( y8 C- Q8 ^1 i- W# b8 Z
    同时发送数据给客户端9 ]9 ], d' N" v& ^

% _  B/ U# L0 x3 u% I& B( B4 m) D   
  d3 n1 f5 X8 S4 s: R0 T    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过
8 a) C& Y( Z' l6 A  
& P- K! j; s6 V        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)% K* U$ [6 R4 V3 p8 i
        0053BBFF  |.  0F87 41020000 ja      0053BE46
! O& A0 L3 J2 s% }$ k! Y( [( {2 v" p( h* x
    eax 这里是3 一路F8比较下去到下面这里
( b) V4 b4 B. o- N/ K, j7 L, y' j/ D
        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC
* o& y8 C! Z$ q: G+ O        0053BCDD  |.  66:BA 1F00    mov     dx, 1F
/ y7 {0 y6 I: A* o) R1 ^3 n2 w        0053BCE1  |.  66:B8 1F00    mov     ax, 1F
: @0 o% x9 V, i2 W& V8 t0 d        0053BCE5  |.  E8 EA54F2FF   call    004611D4# F% w: }( Z" a

8 k8 {5 _& v2 ^4 R0 v  M    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数 + ?( d3 j$ n. m( c, b
    + q5 E( a  e3 M' y
    call    004611D4  就是调用 winrgb( B5 `; `1 x: _7 R7 m

) u( h$ U- _0 W; f0 \' H8 f0 S
1 t8 v8 o* C& l0 @) S上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
5 f. h: s% B$ G' P6 y
# U% T* @" G6 |. e
    dll里面进行内存地址读写
) E8 z: w: U3 A" S1 [  ]
$ n0 U3 b, Z( o! W+ Z; x# y" p
    我是在
% k' J/ j) J1 K- S
   
4 C$ w# h7 [, B
    0053BBFF  |. /0F87 41020000     ja      0053BE46
8 A3 T1 s/ ?; s# m4 S1 ^* \( n, A
# B. j. f( n7 ~" e1 L
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写
0 d" `  J5 s7 W7 V! t
# w5 d+ L- x* N% p
    procedure InitDll();
  ^  O$ B- \2 ~/ a
    var
! Q9 C% c8 p" r5 i/ X1 H
      p: Dword;/ I9 o# g% R) c$ k
    begin/ p% ^/ I: \! k! J  y& E/ U
      p := $0053BBFF + 1;5 q, {( h% W5 M$ I
      PDword(p)^ := Dword(@proc_0053BBFF);5 b' v, B' w. D0 g! o" ^* k$ e/ w, V: [
    end;
" Z. q1 s! j. a) }  H

  }$ m4 O1 {8 S) T5 |# n+ G  ]
    在自己的代码里面写一个色彩增加的函数判断比如, Y6 t2 D, Z* k7 Z7 `& ~8 ^
4 J' N  A; ]! f
    delphi代码:% `; e7 D1 z- h  h& e8 B6 P

7 }5 K* v* S9 B" i0 X! Y
    var" Q- v; D6 C; N+ b9 V
      EndAddr1_0053BBFF : Dword = $004F470C;( x* ~# B2 G8 K, E+ }  _# c8 W) g7 W: Y9 j
      EndAddr2_0053BBFF : Dword = $004F44CB;
3 S& X/ O/ z. Q8 X3 x
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转  V, q! O5 ~$ F& z; {6 x: w

  F# r9 O9 k& |0 |  j% j
   CallAddr1_0053BBFF : Dword = $004611D4;
% C5 d  ^7 S8 l& a
      CallAddr2_0053BBFF : Dword = $004611D4;
( F4 M+ u" z' [) Z+ Y
$ E: N  _7 u  |/ U. H
    procedure proc_0053BBFF();4 V0 r* Y, D# N1 D! q
    asm) ~. E7 s! Q4 L8 \
      cmp     eax, $10                        //与预先设定的 最大17比较
) u7 ]; V% r0 }. c* K5 \3 w
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值
& L0 n0 z( F) b5 ^4 O1 C
1 Y/ W' v4 \1 p0 J
      cmp     eax, $10                        //比较是否等于16- i$ M3 j! Z$ }  }
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分; o9 X, b7 z8 f3 P: V
+ M! U% t3 M( u* j' X
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试) k3 g& A7 M9 {$ k. n
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF- s: H0 W# I0 t4 d) O
      mov     ax, $A$ J) G1 q, J4 c/ \) ^
      call    CallAddr1_0053BBFF0 X5 _4 L7 r: ]
      mov     edx, dword ptr [ebp-$14]
- d1 J7 ?; ~5 g$ g& d/ _8 ^6 z
      mov     word ptr [edx+1], ax6 R1 {5 I& A, j$ Q% h
0 e- H% X7 [6 ?$ _4 A. h7 E, X
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试, r. ]7 `+ H* C! P" [
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF; T, D! B  J# Q' X5 N0 ^
      mov     ax, $10/ N4 g2 K( E5 M
      call    CallAddr2_0053BBFF
: K1 K1 {+ j. |. J
      mov     edx, dword ptr [ebp-$14]# ?$ W9 _2 M/ b- ^% v1 |# X
      mov     word ptr [edx+3], ax
1 P" w5 H# Y( [' Q1 B) [* E1 a
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
8 @, T  ?* M# E0 P3 g. O9 \; F

3 Y9 ~" g8 c$ B$ ]
    @Seventh:( z$ N( x' i  k7 h' A
      cmp     eax, $11                        //比较是否等于174 S" e/ x: c- \6 h; c0 {' a5 x
      jnz     @out                            //不等于就跳转到默认部分
+ C3 c) p" |0 E  g
" r; v3 z1 q2 M; o; A
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
8 J. T8 T- K5 Y& @9 g6 @4 l- h3 V
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
& P9 w: s- l0 ~# L& J) U
      mov     ax, $A
) @& ]' w- w/ y$ J0 B, `/ w
      call    CallAddr1_0053BBFF$ B) H, O% }0 f! E* P! ]+ d
      mov     edx, dword ptr [ebp-$14]
1 L& J, l- X" }
      mov     word ptr [edx+1], ax
- l" A% {' k  n

4 z6 s' ]9 ?) C7 u8 y
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试  B" C+ \1 [/ X( k6 t
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF! K: a) z) b' ^2 t7 Y& w' E, t5 a
      mov     ax, $10
& e% R( x# C# B7 r7 d6 D/ W
      call    CallAddr2_0053BBFF
6 v7 O3 d* J* [5 a
      mov     edx, dword ptr [ebp-$14]
; s, s+ G8 ]7 L- ]
      mov     word ptr [edx+3], ax$ A$ ^0 |6 B: c5 E7 s
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
3 N$ |4 Q& x8 l! g! R% Z
                                               //  i+ b6 r1 u" y( F4 }" N2 n1 u* Z. v0 U
    @out:
8 a1 ?  p' T+ ^" i
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点
& e: y/ }; u1 _! a

" O8 G3 S! ^1 z
    @OldCor:+ [! ~8 Z- r; b* J2 L* ?1 W% t6 |/ A
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值  B4 y) @$ G4 X7 N# U! _# |
    end
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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