游客您好
  • 点击联系客服

    在线时间: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 编辑
* ^7 _9 |2 I. q' f6 e. b/ K6 Z. D5 @# x# P3 U5 L( G
编写需求条件:/ P8 {% ~# O4 a" X6 U) \
2 ^8 D$ s! c. a7 Z, p4 f
    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)
/ j& \5 \/ s/ M; S- }- x% ^$ G$ n! d, `9 E

, S+ l* d0 d; D7 K编写过程
9 s7 j7 M3 }' `$ M5 ~: m5 T, i- o- z( I: l
1:: _7 K3 G8 d) q. B

& ]. _! r! g0 r! v9 n4 n& D. C    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面
8 C0 _. E4 E( D3 _* n
  ~: ~& j. U  O% U, i( C& H2 i# D$ F% k5 x; s" U
2:3 [  [$ D/ v2 v8 F% K
& C/ X% T" \. g  |1 U' m, p! S
    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序7 j0 r+ k9 ]0 e4 h: }
- ]' m  B  V7 x; T
    启动客户端进入游戏(后面要用客户端)* A( ~7 A5 T! }. T
, K3 n. ~2 y2 ?6 x+ O3 R
    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
5 Y: C8 _6 a) P& r
- x0 V- W" ]( R8 G    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序 ; z+ |- k# Q: Z
0 z* P1 i! R/ s% \' B, Y
    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到* U3 I7 l4 O* m; }' z5 c8 U2 a

7 J: e9 h! R+ h% d0 h    od停在
+ H3 v+ }1 u* y/ z! D* T8 I4 Q' G$ J  \: }' \7 |) s+ R/ E
    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "3 V# ]" M! q& z  j9 |
1 _, G: k0 ~9 d5 V: \" F. `
    双击这一行 再次看到od定位在汇编代码显示页面+ z/ i6 b3 X3 T
, I0 _9 n, d: `0 ?

( s; D: d; u; ?% S' y; I        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: "   w5 r+ }, @) v
        0052A0CC   .  E8 C7A5EDFF   call    00404698                                0 f4 x" @. m' Q
        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容
0 E3 i# Q: h! }  Y: K        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用
# a" U8 Q5 A# Y9 a2 i        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        
+ Y% ~. e% @  r& {/ N* @8 L        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB8
# D  D4 b( ]5 I. K0 G
! v, H0 v+ L) D    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????
  h, }# I# H+ N$ I% ?* X* \    & [$ K3 J$ s; D* i
    这时od会被中断, 断在刚才下的断点处, 这时按下F8 ; Y. @  h% B+ B9 |8 N# |

! ~2 |: w; `( q9 c    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩
+ M$ O5 p" o: n" Y
, p/ m) d# @4 k    同时发送数据给客户端
( G9 T8 u% c1 i  Y+ }, ?: V
8 R8 \9 U2 y0 g% a4 U8 W& k$ C   
, u+ d$ c- b7 F# l2 K' ~- e0 y6 S  ?    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过; X; q9 m( U" m$ O8 W9 l, O& x
  0 k2 R( O& ]1 g
        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)
1 M8 }  u# b. m) m5 d5 a        0053BBFF  |.  0F87 41020000 ja      0053BE46" [3 ^' ^( Q* ^8 d
/ q# T, S) W. a9 F, F
    eax 这里是3 一路F8比较下去到下面这里5 P) i) j; Q* u2 ~2 L

" U) A2 l6 ~) L  X        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC* Q9 B2 N+ v3 A+ [8 P
        0053BCDD  |.  66:BA 1F00    mov     dx, 1F
3 `& _: X, ]' M3 y4 t        0053BCE1  |.  66:B8 1F00    mov     ax, 1F
6 u. C& `1 x# s% I! l2 I        0053BCE5  |.  E8 EA54F2FF   call    004611D48 I1 c" G% J$ O+ E( b' M( w
% ~: G7 p( ~5 A2 a* y) D% N
    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数 , R3 M$ R8 m4 a, ?7 m2 P
    " H3 ^0 ~0 _' d6 f; O8 x% q( E
    call    004611D4  就是调用 winrgb' N+ a% s/ p% e0 ]0 b
5 q% u. r- f% ]; K% W) G/ K2 X
7 t+ v' o# t$ J7 Z4 j9 k
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
+ t  n8 J6 z2 m. J3 k" l
$ _% i1 p' b" k2 R# Q0 |( P3 B
    dll里面进行内存地址读写
+ y3 P7 C* I' E2 I
* }5 Q. L6 O6 N% C$ E
    我是在
, ^; M  F$ D7 Y" R
   
1 Z0 Q/ ]' B: _
    0053BBFF  |. /0F87 41020000     ja      0053BE46. l4 ]/ M! T) y8 e- M) H+ g
  S$ R. ~; i/ s2 i2 A
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写
1 F) l6 S5 x9 ^7 ~& R
% u. {7 T  I; L& N3 T( d* F
    procedure InitDll();
3 ]7 |5 K/ J* t
    var
' A% d% O( x1 O2 g
      p: Dword;
8 u/ P2 n  a3 o
    begin' j+ n; X* ?' R" G4 v
      p := $0053BBFF + 1;. o! \1 [/ Y5 ]) ^# \
      PDword(p)^ := Dword(@proc_0053BBFF);5 h' N6 A2 C8 O4 e, [& S
    end;
1 R& i6 ~2 K, A) C: I/ N8 r

8 r7 Q8 S8 A$ J. ]
    在自己的代码里面写一个色彩增加的函数判断比如  k% J( s' P9 x2 w2 |- S* w4 j

- M  H4 s' a* O* ?. X$ v5 m
    delphi代码:
* ^  n9 G' r: m# x
' k/ r! T1 {0 j) w# P0 ?4 D) b5 y
    var5 u; J) g( ]* E& H7 u4 @
      EndAddr1_0053BBFF : Dword = $004F470C;6 f9 x8 [" ]% l) D
      EndAddr2_0053BBFF : Dword = $004F44CB;8 q6 U* u6 T, l' }9 _" [
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转
! O8 H3 |* T, M7 h+ i& _9 D# [
; j* x- q/ A: M, _; |) c; g. u
   CallAddr1_0053BBFF : Dword = $004611D4;( K* g8 d& r* F$ Z2 E7 [
      CallAddr2_0053BBFF : Dword = $004611D4;, V# G  t% {3 c3 D" P* Z1 x: N7 ]
4 F2 o3 }0 h% z/ Q
    procedure proc_0053BBFF();( S+ _; [- d  V: J2 t" y+ t! d
    asm
* a- i6 H' z8 {" Y6 ?. u. ?
      cmp     eax, $10                        //与预先设定的 最大17比较) z* @7 B* p, q. d. e
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值1 W: C# O- l: e
+ U% Z7 H1 @  [6 |; x
      cmp     eax, $10                        //比较是否等于16
/ A8 L/ B9 N: p# C3 z( M/ v2 z
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分
8 R, p+ g5 B2 w0 l1 r# N

* b: Q, G7 m, I2 F
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试' |, @/ g2 @. O2 A. d* Q+ I7 J# P
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
) R& z+ k$ l9 k. b0 Z9 o( j/ n
      mov     ax, $A' u' [7 x6 m1 t' |
      call    CallAddr1_0053BBFF8 k% ]4 P1 [4 X& u+ N) z" _; t
      mov     edx, dword ptr [ebp-$14]" l' B  ]' D% y- t3 C1 j
      mov     word ptr [edx+1], ax( t8 p+ b2 o7 S% O; @3 h; p$ `

# ~0 P2 L  s' u- p/ g' p! r6 z0 {
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
, ^6 T. s5 [4 A8 T) f: ]
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF% P7 H* ~4 ]! l
      mov     ax, $101 N9 Z2 r* I6 b. ~/ M& x
      call    CallAddr2_0053BBFF" w* s( h# D8 G2 n3 D* A" v/ E
      mov     edx, dword ptr [ebp-$14]
/ p7 R" e! H4 U8 h+ v' D% m0 v* g
      mov     word ptr [edx+3], ax7 |  `. m/ U+ F, T8 y" h" d; N; w
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
. M! M( W$ r6 ?  m( b

' r* t, _4 e  R' B, d
    @Seventh:
# C$ K; l% k" a/ `) F6 l
      cmp     eax, $11                        //比较是否等于17
, s: b* O# q: r7 D3 G$ S% |$ A( Q
      jnz     @out                            //不等于就跳转到默认部分
/ u" H" m/ b9 U

" b  [/ Z' ]( f! `' K8 i
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试, z! b) ?+ k6 \$ \
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
4 B7 E6 A7 F# j/ Y- [( F2 n- G$ C6 y! T
      mov     ax, $A2 }1 Y, K4 i+ i: C
      call    CallAddr1_0053BBFF7 B0 G* }8 Y* K* j( H5 A, z; y
      mov     edx, dword ptr [ebp-$14]
) ^, \" g6 Z- y/ W
      mov     word ptr [edx+1], ax
* W# P% X8 ~* K, X. y
, b0 ?+ J# z! h7 w7 E% g( I
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试* H4 p) X8 m: t- n9 h
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
2 q! l$ x1 h; o! k
      mov     ax, $10
9 Z' G7 a9 S: e: L4 H
      call    CallAddr2_0053BBFF
/ d% l% H  R* Y! a7 b3 _3 U5 c
      mov     edx, dword ptr [ebp-$14]
0 h% N! @8 u+ _) k; D; _7 r, ^! L
      mov     word ptr [edx+3], ax
2 o6 h- Y$ [; N. O& J3 Q4 u- V
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
, p, \  p3 H& p$ g
                                               //
3 I8 p) }" ~; J5 J6 J. u
    @out:
# J  Y: o: e( M7 [$ ]
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点
# R% R  \9 w! i) c, d

4 ^& p* ~0 z% \/ v4 F) g( o
    @OldCor:/ \1 k8 W# n- j6 @0 n( L
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值
( M% G- Z- M7 _; _6 Q$ v. w
    end
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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