游客您好
  • 点击联系客服

    在线时间: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 编辑
2 u. H, }! v  ^$ V, y/ d: ^0 @
. _* o9 w/ l/ h- J5 x
编写需求条件:
+ q+ |" @- G0 x) ^
3 ^! F. I8 i: Z! d! W  `1 `    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)
' S' S% F% x4 Z5 i5 ]# C! F. e/ J( \$ G. [+ B
, Q* |: T5 k6 k: j3 V- x$ Z
编写过程
6 \; b/ o! K) R  b1 H' |: [: ?' m2 X+ ]8 a
1:
' F/ ^$ G  E8 n) ^( \
% I; @+ p( K/ A    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面- L6 x$ L7 Z, _0 `
0 b4 ]: ~! Z3 P( g7 k
0 J5 S: j* T: x0 J7 R
2:
: m) _8 x- q6 C5 Z) [% ?' i0 \1 ^/ {! h- ^5 d1 s' K/ n
    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序4 r! L$ _2 B& j2 Y, {
6 o! _0 M" V7 ~! h) _
    启动客户端进入游戏(后面要用客户端)/ C" M: @. Q% s' k
7 ~0 D# Q, E& }
    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
: K, @" M) o* a% {6 O/ c5 F: }" j0 ?
    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序 2 c- ?; e$ d" \

/ q* ~  `. s( _+ W: n1 \    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到+ ~8 u* n% b8 \
- |6 P/ M/ n$ H; d$ x; I% o
    od停在
3 t4 O- \9 F2 b1 m0 k* n3 C7 y# @5 x2 g# {* G1 M- a6 u* k
    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "
! G" n% @& w( S) k- ?* Z# J5 P1 s/ I5 `3 j0 Z% K
    双击这一行 再次看到od定位在汇编代码显示页面# s' V$ z! ?& x; l* U+ a/ d
% L& \0 @) n( b% |; v6 i
! n( t1 c) ?4 V7 D7 o
        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: "
0 H8 X, j" D9 r- J  h& _        0052A0CC   .  E8 C7A5EDFF   call    00404698                                # b' N# w# ~4 [# ^* L
        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容
( s% r2 z; u$ M+ y        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用
: p" r1 w) I) R1 o* x        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        : Z0 C' H- ^: F9 A
        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB81 p: ?1 X+ K* r3 Y

5 H, ]! u1 N! U( N/ {  L4 E    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????
0 r& i5 t6 L4 U% W" s" a( H   
9 n7 S$ m6 M2 }$ f    这时od会被中断, 断在刚才下的断点处, 这时按下F8
. C% a8 C: `7 U  k
9 |. H; i, S. ~1 v! N2 u5 W+ t    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩
  N6 Q+ j' C! Y: J, U7 W# ?6 b
6 [# r1 e1 k/ @" a- _4 J    同时发送数据给客户端
- V, t% w* @7 ?* W4 c0 j# T4 I; T7 G7 n" ?9 P/ i) f9 l. |
   
' W  o8 J/ ^4 F% p1 m& k) [    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过
& h5 S0 P2 T4 R9 v8 l0 S1 ?  
4 c9 z: \2 \( L7 s$ z1 g8 I8 Z        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)
7 @$ o. i( S% T# m6 d        0053BBFF  |.  0F87 41020000 ja      0053BE46: x# o8 M$ C9 `" m2 Z
+ J4 n! p- B( U
    eax 这里是3 一路F8比较下去到下面这里$ ?. u2 X, F+ N( ^' K
% V2 H9 o2 B# Y& |+ H- [7 {
        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC' f0 @$ l7 v# n
        0053BCDD  |.  66:BA 1F00    mov     dx, 1F
0 [6 P, i4 w: d' M        0053BCE1  |.  66:B8 1F00    mov     ax, 1F
, A! x& l9 X+ t8 p  _( S        0053BCE5  |.  E8 EA54F2FF   call    004611D4) K, Z8 N% G" b! f; t

) a$ I. G" O+ `" W    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数 $ o  a* D/ L/ r6 M
   
  ^5 G& T/ e3 j    call    004611D4  就是调用 winrgb
4 ]' m4 s7 J3 s3 a8 Z! e! h+ S8 ]
/ l1 R$ ]' n9 F! Z( Q5 ]
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在: u5 A1 p0 M: Z. o/ \6 k- @
" C. ?' q: g7 C: p
    dll里面进行内存地址读写; Z+ x8 o0 q, q& t

0 G- _5 H* n% I+ C  G
    我是在
6 h7 G% d0 ^# |  S
   " B# w2 I6 S' n  j9 N. x: a9 y
    0053BBFF  |. /0F87 41020000     ja      0053BE46
* i/ m& x, c: B0 r; q
6 Z9 c' a5 d5 C2 b2 `. P0 _, j2 K
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写
: D2 A' i2 C, n

) t$ ]8 |. X8 l/ |9 {
    procedure InitDll();  P, P$ O; ~- S5 t5 L$ n% {- N
    var$ {7 ?" U5 [* r+ h
      p: Dword;5 [0 d1 M2 D% @3 f: l2 J
    begin
9 @) a9 }2 l8 }6 d  P# N
      p := $0053BBFF + 1;
$ ?3 R- D$ Y3 j3 q) ~2 r3 E' q) ]9 s( f
      PDword(p)^ := Dword(@proc_0053BBFF);) R: }( T& ~! ?( i! b
    end;6 Q5 D0 }: f3 Q

4 m& a/ l! m; e
    在自己的代码里面写一个色彩增加的函数判断比如
6 a* L5 O$ l3 H+ u5 ^

9 f+ |( D# m3 V& q$ R8 `/ y
    delphi代码:
; [- y6 V' c+ R+ s

7 I8 d8 d5 a7 p
    var: ^; r: F; n: v& u* i" S  k
      EndAddr1_0053BBFF : Dword = $004F470C;) @8 e) E6 d# l
      EndAddr2_0053BBFF : Dword = $004F44CB;
) U/ x* C6 X* l. d
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转
3 G0 T. D( ]& R3 v& _+ J. P
5 D1 b( P- q/ _8 t' t% t; P; z
   CallAddr1_0053BBFF : Dword = $004611D4;" {' k, D) j2 Q' j  `) _8 U& ?
      CallAddr2_0053BBFF : Dword = $004611D4;
, z! b) I5 x7 `1 a% c9 {# A; b& l
1 \. Y/ g+ R& }  @0 o$ N  r! h
    procedure proc_0053BBFF();
" y7 P2 |/ U6 F8 p7 ~/ t& W8 ]7 H
    asm
- x) v4 v3 _* f* C* m
      cmp     eax, $10                        //与预先设定的 最大17比较6 S* i) m6 d9 \% x1 d
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值
- K! i6 x. \; [0 E! p
4 |* [/ ]3 z- C' |
      cmp     eax, $10                        //比较是否等于16
  J- c" [0 @% s6 _* N
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分* B8 a5 V4 x1 |+ q4 W! y

. e3 S4 W& R+ |+ p
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试6 P) \4 ~3 _9 d* v
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
8 T; Y2 Z5 f  s0 z) Z
      mov     ax, $A
. C3 X$ r, [' }5 K
      call    CallAddr1_0053BBFF
4 w. u" h5 R, x  ]3 j6 Y, N; \- M
      mov     edx, dword ptr [ebp-$14]
' R, L3 x# H/ A. v3 m, F9 {
      mov     word ptr [edx+1], ax
+ M9 a' G8 v- |( W+ W/ Z/ |) ~
9 ]5 E0 A9 s3 T+ k1 V
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
% Q( M( c5 R* m
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF) Y! c, Z  A) U0 g# J/ Q; ]% _4 w' b, l
      mov     ax, $10, v! L' ^/ V$ b" u# h7 h" I
      call    CallAddr2_0053BBFF
* p8 E& K% i# i  r
      mov     edx, dword ptr [ebp-$14]2 C+ _. i6 Y. E! D( M1 @  S
      mov     word ptr [edx+3], ax' y: P9 y  J0 v" M2 A3 {
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
& m1 p# i# b: {" H, D

5 W( e0 y* i4 s
    @Seventh:
: {( a8 y: _! c) h6 h! ^* t: M0 F2 n
      cmp     eax, $11                        //比较是否等于17
1 k( {9 s) p' ^( e" z# s: t
      jnz     @out                            //不等于就跳转到默认部分6 ]2 m, i. |6 ]4 }
/ ~& G( N6 L5 ~, b" F# Z1 e* h$ K  @
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
9 S) _6 v( q5 H
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
: a' v  r% P5 Y+ q: O) _
      mov     ax, $A
: J7 B; v) y4 ~7 W7 f  c
      call    CallAddr1_0053BBFF+ v* F& _% n: T# m2 r
      mov     edx, dword ptr [ebp-$14]4 q4 ?7 G4 h( g9 u
      mov     word ptr [edx+1], ax
2 r0 f% Y! e7 u  y, X
1 ?: K9 [+ T9 p2 q& R' I
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试/ ]6 S+ u0 [7 P% Y0 ]! E  u  L% ~7 W! c
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
# T/ D7 j$ ]$ d
      mov     ax, $10* K3 J+ q( y" T' I& w2 K2 X$ ^
      call    CallAddr2_0053BBFF
% M* G0 F9 G! t8 a
      mov     edx, dword ptr [ebp-$14]1 N. L# C5 z* \( j" m1 X1 V
      mov     word ptr [edx+3], ax6 G" H, e+ E: k2 R+ k) {; T
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
  H! c4 d! n* z# b4 Z+ r
                                               //
0 B2 A6 N% }( z2 k; d% c- o
    @out:
4 K- E1 k  Y' j# b5 ]
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点5 h& K' Y1 j* Z* C
4 b. N; u: t$ z# l7 r0 N/ ?' K
    @OldCor:
; M: |4 _5 t) ]1 n4 o
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值& {) \% i! S1 W
    end
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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