游客您好
  • 点击联系客服

    在线时间: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 编辑
+ @" b1 h9 f7 U" N- L  ?. w7 C2 q8 e" z& G5 o0 E3 e, d
编写需求条件:
5 |. |5 f# k: C2 i. k
- C7 p. G2 W) r  b' q" s  T    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)# z9 K3 F6 v$ ^& i: v
0 _! \2 T4 i2 y; ~9 `& J

: _" _: u" k! w1 h' u8 r. z编写过程% G  n" G* _& Z' K" Q
8 @/ p% r2 ^" M
1:4 x% `4 }4 @# |3 i# `: U3 ^
. Q3 @! `2 y# {2 B, [5 g
    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面+ M/ ^" V' V% w0 W# n& x

5 P# E  D4 T8 G* I4 K. t7 F! A( ^4 Y1 k6 W
2:; l5 [8 h5 g+ P1 C. `+ S4 ?
. s" V% i; |  @, B2 H, w) |
    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序6 l  C. h+ b( t, [. n1 x% R7 z/ L

4 k/ O" h5 D# j    启动客户端进入游戏(后面要用客户端), F' @) {7 h0 H. {$ g

9 t. j1 P# i: p( Y) t1 |+ S    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe  I# z6 g4 y. B8 @  Y9 d+ n

" }4 G3 J+ H6 I1 N7 t    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序 : @' P# B) B1 }0 X" r

/ U" M3 N3 l( e, y6 u' o# v    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到
( q+ _" }" K: d0 V4 J2 p) \  E7 W5 t
0 G5 \9 f; d+ b" C2 K5 C- K    od停在
+ Z6 \; \; d6 V" I
% _8 e$ [! j: ~1 ?/ l8 z    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "
$ q; F# J, e3 a# O  W2 k/ B- F4 y+ q
3 f7 Q: \& A$ _    双击这一行 再次看到od定位在汇编代码显示页面
4 G1 X$ Y+ ^/ c  v# i3 A- i& C( t3 ]- i5 l2 ]# r1 G
: W& U+ [  j$ s- T4 v7 G/ ~- |3 F
        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: " ( \9 y% ]* x' d
        0052A0CC   .  E8 C7A5EDFF   call    00404698                                
) U3 {' ^) `0 I' ?9 z$ K8 O1 p        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容
* U4 g! i, a9 J# }6 R        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用/ q' F$ V1 X! X7 J" @& ~0 G6 ^
        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        3 V! ?$ I" e/ d2 O
        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB8
7 h2 L' B0 F& m6 ]
9 n1 O" y. X; p  \    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????) j8 ?+ n' x2 Z" _4 Y
   
) |6 H& v: F' n+ C+ _) T    这时od会被中断, 断在刚才下的断点处, 这时按下F8 6 a6 [* P$ ^8 ]1 R% v7 \

0 O" o. n# E1 j; Q0 R3 J    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩6 l2 g! ?8 s5 x4 d" w

" g5 U& m  u1 c* j- H( y    同时发送数据给客户端9 d7 d: E$ u; {- L* b: h

' S5 y* b# \  x   
5 c! @) o# R$ F) ^    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过3 g$ w: l! f2 x; C' B8 f' |$ ]2 v* x
  
" K4 r6 C+ f2 `( M2 S+ }" |5 w        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)
+ m- T* z5 g; @# `5 [7 I# P        0053BBFF  |.  0F87 41020000 ja      0053BE46
! G7 A5 v; U$ H, d/ H5 O& M/ H' T
; H/ c. v0 {6 X# Z5 K    eax 这里是3 一路F8比较下去到下面这里8 P& \0 X) ~& N8 r- o8 j' N' x

" {+ n& k* P+ q  Q        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC# w4 f$ ^3 e! z' L% C- Z6 n
        0053BCDD  |.  66:BA 1F00    mov     dx, 1F
$ \; u* ]9 k8 q/ Q% c2 t        0053BCE1  |.  66:B8 1F00    mov     ax, 1F& J4 N+ _/ d5 S0 g* N& f
        0053BCE5  |.  E8 EA54F2FF   call    004611D4
5 ]8 }8 h  S! g" ~& Q
9 q9 [6 m; z1 ?* p    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数 " b* [9 g  r; e- a% r
   
1 ]6 z7 W0 p2 ?! P) C3 t    call    004611D4  就是调用 winrgb
0 Q, B4 I" x0 S1 T1 Y$ k7 a! A
  v$ r: Y8 G( I3 N; N
( Y# ], w' S1 t0 F0 A上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在( A  s+ Z" r3 g3 j7 f( Y! Y1 E: C5 ]
' U# z: L* s& y; P1 C
    dll里面进行内存地址读写; n. `9 J) s3 ]6 n, v; J

- v% O3 B3 B+ s2 }" ~
    我是在& q0 L# @, G$ p+ x, \
   : l( R) G+ z' a3 _
    0053BBFF  |. /0F87 41020000     ja      0053BE46
% p' Y+ B% C& l1 H7 a# R

% H# I* c' ~0 x7 u
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写9 Y: S; N) G$ p+ Q8 m  Y: g

1 _  }! o4 F0 O  Z
    procedure InitDll();" S; ]! b! ^" x/ M9 ?
    var
$ A0 B3 {9 R6 S7 \1 |! t  P# m
      p: Dword;
* v6 l8 |  r2 F
    begin) o2 o. o* h4 R0 @7 n" Z* r& ^
      p := $0053BBFF + 1;! P7 u1 ?5 z" c5 m
      PDword(p)^ := Dword(@proc_0053BBFF);
+ K( V6 v  k; a5 _3 m
    end;
" a: U% J3 @, j" f

+ o0 O/ k4 H* N9 o; S" l
    在自己的代码里面写一个色彩增加的函数判断比如
( L* C) @, k) c- L8 S- p
  R5 ~) d: A6 i( ^/ g' W
    delphi代码:
6 p0 Y& w& [4 X% u/ D) F" P
7 b0 @' y  k6 H. J3 ?6 |8 V& w; A
    var
6 Q/ F- H6 [& Z
      EndAddr1_0053BBFF : Dword = $004F470C;
% A, M9 C. ]+ r- E: Y$ J' R
      EndAddr2_0053BBFF : Dword = $004F44CB;
5 N0 E8 r8 L7 y/ b/ ]& `3 R) O
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转
1 t9 f% r" y% h$ Y2 l' t! e& G/ U
. d* A  Q9 b; w& t% h; R
   CallAddr1_0053BBFF : Dword = $004611D4;
! I4 ~4 J* x# F3 h
      CallAddr2_0053BBFF : Dword = $004611D4;
/ o8 D8 o/ G+ G1 K) N

+ m* Y/ o! e3 t: v5 N7 L/ T3 D
    procedure proc_0053BBFF();
# ]  q* }6 f7 J) f% Z4 {* C
    asm
6 b. \  L+ R4 F* p
      cmp     eax, $10                        //与预先设定的 最大17比较
& s* H5 S% I! t/ k9 A' P; H
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值
" t  M" G  L; x6 B
" `' k& k/ g3 X& ~6 y
      cmp     eax, $10                        //比较是否等于16- t) m+ A% C$ R  ~
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分
* |7 W2 B/ @9 W

! S& u; |* T( Y! p/ ^) j
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
6 W: a# s- b7 a
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
& w5 S3 F  `; R+ b( U
      mov     ax, $A4 }( v/ r7 s- C- y
      call    CallAddr1_0053BBFF2 _6 A& n5 c" w1 t% D
      mov     edx, dword ptr [ebp-$14]6 R" S2 r, n* p) |- B: J" X
      mov     word ptr [edx+1], ax
4 T4 z4 ?) d9 F( N+ o
5 K+ h* `1 Z; v* N) ]0 a
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试0 ~+ z8 Q9 w' \, P* b
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
1 }3 p0 h) y- X2 t6 F0 t, y( Z
      mov     ax, $10
1 t* u9 E# S& }5 n3 a) D" h
      call    CallAddr2_0053BBFF/ \2 c; }5 c1 X# }2 Q1 B
      mov     edx, dword ptr [ebp-$14]6 a3 o9 F' i( r3 {% n  V
      mov     word ptr [edx+3], ax
. `- S3 ~% J" B+ S
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
6 f$ y6 K& y7 L8 l
* P# ^+ }1 s( b9 m4 o9 F# I. Q
    @Seventh:
: U6 H% N" \, r2 N+ P7 A+ i  y
      cmp     eax, $11                        //比较是否等于17
; J2 Z* t2 X, Z+ o  x) ?# X
      jnz     @out                            //不等于就跳转到默认部分
5 h" R% g# A1 ~' j

5 |$ z* n2 o# b. R2 o1 p% E; F
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试- B, }/ n  P/ Q4 N0 x  k8 J" X. I, }
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF. Z% K' d2 V0 x4 V* v1 {4 @* F/ M  I
      mov     ax, $A
- `- ^) R& U3 g# `) D0 ~4 {
      call    CallAddr1_0053BBFF2 h7 U8 t% `$ H- A
      mov     edx, dword ptr [ebp-$14]4 e7 ^1 ^; I9 b' E$ @
      mov     word ptr [edx+1], ax) Z# B4 k* p. J8 W$ m6 e" Q" ^

/ Z8 y& Z. m, y
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
% k8 Q5 {( B7 ^# G1 O
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
# B! I7 E$ D% e8 w9 l$ k+ z
      mov     ax, $103 f, T% t% _: I: V+ e' m" s
      call    CallAddr2_0053BBFF( ]) K8 I6 D! b9 B
      mov     edx, dword ptr [ebp-$14]
- |6 u. b& A# r3 }$ H7 c
      mov     word ptr [edx+3], ax
# R0 }! d6 z" f* e" U" j
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs) T6 C! Q8 A7 |' y
                                               //" R- v% |5 {6 n5 L" x9 b
    @out:/ ?" t6 y8 P; M4 {- G: q
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点
; e8 P; Z6 x7 D2 J4 a
% _$ Z* w% Q% r" i1 U
    @OldCor:6 R) f0 |* {  Y% z9 V6 G: X
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值! X! d4 p! ]* b7 @
    end
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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