游客您好
  • 点击联系客服

    在线时间: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 编辑 . N% K6 a9 J( N$ e

' {/ w' f9 p' k6 Q" u+ |
编写需求条件:
0 C6 E* R/ k4 o8 a: F: b& `- V1 `8 N( f' |9 `  g' q$ ~( v
    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++), P( e% E* i; z+ _+ h4 M& f! a

) g1 ]1 q( M: a- _) u* Q7 Y" `5 L1 |! C
编写过程
+ B+ }5 J9 f& m( p- Z
6 U7 d2 l) T) [4 k1:; H5 l  E0 }% V  F2 m$ e! D& f# w

, |+ l+ h/ c& X4 [* C2 ?    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面
! |1 X) P+ X" }$ V' C8 N8 a2 ^8 \$ o/ q. y3 T7 |+ X+ ^
( c8 N" `1 c1 K" l6 I7 {7 K" @  l/ S
2:
3 e7 j2 l2 G7 z" p, n  q4 K; r* B
% R8 D  g- G& e0 y& C% L" z    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序
' o; ~) @* S5 e1 @. y- C* Y/ |4 s9 u0 C1 ]
    启动客户端进入游戏(后面要用客户端)
5 u/ b4 i) S0 q) F4 k2 L: c# ~; b" o% N. x9 `; z9 X4 R- {! J7 F
    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe5 Q/ }( \: v1 i7 r6 a

- F8 D  a! U0 ~/ ?5 k6 l% P    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序 ) _, k7 |# P, Q# [4 E

4 s+ U$ [6 `0 q* i% P9 |    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到
3 X% b! \. i7 {4 u1 h4 `' ^1 o+ u% U
    od停在
' ~6 h% p# i+ ]7 h0 B& E3 A2 e4 m
    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "+ R# e+ A/ d" C" _9 y

, l# ?3 b: d) G, S" @    双击这一行 再次看到od定位在汇编代码显示页面& n' F: `  M: h5 Y  m
9 L7 |$ |) d9 O4 f) r# F# U0 g" ]0 @
( E3 t- P5 H. _$ Z
        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: "
+ `1 g6 }( U, I% y: b% q" _        0052A0CC   .  E8 C7A5EDFF   call    00404698                                  @2 h. G- x  b& V
        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容
) x9 E1 e, k) B. i        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用& t" `9 t, I" ?; i( `( ~: z6 }
        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        
5 w! K! V; F" s) L. Q" v9 V- ~+ e% @9 Z# r        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB8: E+ U2 W' Y8 V+ A- z
3 @. a: s* W$ T3 k, ?, ]
    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????. G6 R( v+ U( M
   
  Q+ l$ [  W( _9 |+ c/ C& ~  e3 g    这时od会被中断, 断在刚才下的断点处, 这时按下F8 + ~8 z) \' Y- y3 }8 E& V

' y6 P8 V0 R/ U* N    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩
% j' v$ ?" q1 T* m2 h& G6 R0 S; x* r3 j/ i8 v/ t5 c* y
    同时发送数据给客户端
5 ~9 T6 F5 c( q' D: A. Q' r% a, y$ Q
6 i5 `# a9 l7 j, A    . H9 g- Q: r( p
    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过
# Y! x9 f7 h1 r1 n0 [) n: Z: b5 f  2 P9 ~5 Y! L3 ?4 y! j& E: b
        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)# o$ l$ r- y$ f- G. N  ?/ W
        0053BBFF  |.  0F87 41020000 ja      0053BE46
8 N: ~/ z& O+ H) Z1 ]/ a" B7 ?( D' x0 n) |; |% ~) d# ]
    eax 这里是3 一路F8比较下去到下面这里( H1 h6 Z- y. Y" J$ ?4 n" d, K9 f
2 ]0 y4 a+ }  \( L
        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC6 t* @$ m, B: u8 q, ]& b) i( D/ n, l
        0053BCDD  |.  66:BA 1F00    mov     dx, 1F# L$ P5 m' Z2 P' U" v; e
        0053BCE1  |.  66:B8 1F00    mov     ax, 1F( u3 N% b# u1 _  S* v0 u# L
        0053BCE5  |.  E8 EA54F2FF   call    004611D4
, l& o: x0 b+ r, A% b: O- M0 f
5 N! \+ y% S3 L. O8 h/ ~: _5 {    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数
# ~4 s. i" ^" }9 v4 t( \' Z! l. W    2 ~; Y' e8 w( X5 O2 e; H" T2 Q2 e, a
    call    004611D4  就是调用 winrgb
  O% G  X' A0 i- p0 u+ W
+ Q6 t- Z/ L2 M+ f. m* |5 i6 o# N$ ~$ Y1 ]- X/ u
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在. k7 l# [1 K0 \# `
  j. G! x, f5 k+ ]/ U1 x- t* O) O
    dll里面进行内存地址读写) d  l/ z# N3 E& q
. ]7 t0 ]6 J2 \7 K+ y
    我是在
/ h3 S; X! q  x1 j  ]
   
& B' w0 w. J, |+ Y! X
    0053BBFF  |. /0F87 41020000     ja      0053BE46  E# j/ x1 x, A5 T+ r# \, T* n
7 K6 S/ F( \1 p5 }. y  {
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写
) u+ b) Y9 i0 g- u: ]0 h% `* N

* V8 m$ J4 R3 i& ^" u
    procedure InitDll();6 T3 n% v6 }3 j& Z
    var! C7 F6 Z# z0 G
      p: Dword;/ F: ^# n: o8 @4 P% w
    begin
# P- m. {( p6 K8 d7 y
      p := $0053BBFF + 1;
% b0 F5 s/ F3 I6 X
      PDword(p)^ := Dword(@proc_0053BBFF);
3 h8 D: z/ }% i+ X# o
    end;
5 f$ c5 F# d$ ?
. G/ ]% `7 Z- A# H, }0 g
    在自己的代码里面写一个色彩增加的函数判断比如) ^  R2 |$ R7 {  Z' N

5 K7 F9 q" e- Y/ G+ Q0 v
    delphi代码:; z/ u# @& h+ b1 }2 ?2 I
! a9 @5 w" b7 |$ [
    var* R* P5 h( F' O  P1 Q
      EndAddr1_0053BBFF : Dword = $004F470C;
/ W' o: ]! H" \) G
      EndAddr2_0053BBFF : Dword = $004F44CB;
$ D% p& b. F3 w, A2 e0 P! r
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转( u( M: T/ W- a6 p( o7 a8 D- T
8 _0 b+ B( l2 B  Z( A9 Z, V, R
   CallAddr1_0053BBFF : Dword = $004611D4;
7 ]9 j8 z+ c9 Q$ T- b: S; v6 d* x
      CallAddr2_0053BBFF : Dword = $004611D4;" y: K. U3 L/ x' {2 S- S+ y6 n2 ~
; H. v. U% K' z
    procedure proc_0053BBFF();" b$ s5 ~/ U% i
    asm, A" f  U" b3 i; T
      cmp     eax, $10                        //与预先设定的 最大17比较% k+ h! T) z; W" I/ ~
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值
: u6 V/ c/ K& x$ [* z

: |6 ~3 {7 S8 C
      cmp     eax, $10                        //比较是否等于16% u5 ?2 Y/ `! p: a) \
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分/ s- b* C2 c- ~8 y5 R! V( s4 C
6 j3 @; k& E. E+ j
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试- m; ?' T# C8 ~5 t0 y6 z& _2 @" f
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
! m. M7 w/ R9 B; |8 U" A2 D
      mov     ax, $A
0 B$ C% t; Z* ~! [. o
      call    CallAddr1_0053BBFF
2 g1 i& R+ I: s) r+ a# r  I
      mov     edx, dword ptr [ebp-$14]
1 L/ [/ E! K/ _% s) ]
      mov     word ptr [edx+1], ax
  z0 F( z5 B- Y- _' w
% R" Q! ^! m! {( ?
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试$ M5 o. i2 p" b8 N( L! m: @" j
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
& G1 t. n  h$ E3 k# B+ y# T
      mov     ax, $105 S. {$ W# \5 ]0 t  C! ?( ~
      call    CallAddr2_0053BBFF$ {: K( @  `4 E2 j- A! G
      mov     edx, dword ptr [ebp-$14]8 l8 C. M4 X& A# c
      mov     word ptr [edx+3], ax
) ^' M( r& ?: w3 h
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
7 N. i9 r3 g3 K) \+ X* f6 R

4 b) Z& C% N6 `% z
    @Seventh:
! r: d! @! f. d4 W( G6 t
      cmp     eax, $11                        //比较是否等于170 \, S% I. A( n" Z# g
      jnz     @out                            //不等于就跳转到默认部分/ j- y6 p$ w  D. ^# p* R
( L4 S4 {* V8 Q) q; u/ @
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试% R' S  p$ K3 V: N
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
2 l# Z+ K. ]) I  X- P/ j
      mov     ax, $A+ Q; u- o. C- L# o: H/ z- M$ G
      call    CallAddr1_0053BBFF
2 d3 |( L& N4 m4 ^( p1 t. S1 }
      mov     edx, dword ptr [ebp-$14]
0 H# n( h! n. n7 Y& }, m, |$ r: J( _
      mov     word ptr [edx+1], ax
2 s; ^5 V! i/ c$ a  v$ L, k1 [

6 p2 L6 {1 C0 B' n8 a; n4 R, `
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
  v3 l8 ], p5 v4 G& P7 G
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
, m2 ?) M0 J, w
      mov     ax, $10' o8 E3 n! ^( j2 |
      call    CallAddr2_0053BBFF* ?4 p6 @% z" T1 \& x
      mov     edx, dword ptr [ebp-$14]
% C- Z$ N4 ~9 V9 J+ _
      mov     word ptr [edx+3], ax
4 D" `9 H  i+ g  ]! r
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs4 }5 o6 l0 _) m
                                               //& T; V  k3 z1 U! i6 m8 W: \# U" V7 g
    @out:
; K/ m# y5 ^* Y( A) v( C( {
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点3 o% D5 ?. }% `5 ^9 c- a
$ O6 q: s8 C( G8 ?7 m0 |
    @OldCor:
) B3 G# R# [. w# i
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值; j3 f" Y. ^7 ~$ s
    end
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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