游客您好
  • 点击联系客服

    在线时间: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 编辑
1 X6 K1 A3 L9 L" A7 F. x4 W  a* a# U+ j- N) ]" T8 c
编写需求条件:3 u* ]: _4 W  ]4 K

- l  a" b% H' [0 ]  a) f7 [8 h( f+ Z    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)+ t% C% n* ?' a$ H

8 j% n) N2 Y2 N9 H! L
8 a& i5 q7 c. E8 w8 D8 K编写过程8 }. s$ D2 B8 L& G& f
/ d+ W; d% ?% R4 `: P, |" e2 }' E# E
1:8 w0 ~# @& q, o7 D, K3 e* W

' N+ e& D' T7 _& t1 c    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面8 C: |! \+ V' {3 e9 P

0 J+ ]& n& o4 m4 W( I3 g: s; D) C! X' d" S8 n( l
2:" x5 r2 p8 d. H' e3 a6 r% K
3 q5 Y. s$ [7 H9 d
    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序
3 \& k/ N4 r3 \9 j3 }2 b9 c; b( Y- j0 i- j( v
    启动客户端进入游戏(后面要用客户端)
0 a) Z% Y& ?+ L8 v2 b
# \) Y0 ^+ e% T( p3 G! T3 d    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
* `8 y4 s# b# S6 |2 m$ W- D2 g. y; ~! z. u  \! H
    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序
* P- e- X' ?8 a1 u) j5 M1 N! F2 |
: S% a. g2 A  e+ Y    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到
2 E. q; m( t8 N7 ]  y3 d  [9 M6 |7 n) y1 B  A3 ]
    od停在
$ N$ d5 {+ L' c2 j. R& c5 U8 e& [# _5 I  }9 W
    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "
; r4 S9 r. n9 U9 \3 n1 f9 l- O# G8 t; b- {! v
    双击这一行 再次看到od定位在汇编代码显示页面
, b- j, P" c: R; Q( x. Q1 d' f, c+ w
+ p2 K. y& A: K5 R. Z* m
        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: "
8 O( `+ w$ d# ?* H! S7 {: \        0052A0CC   .  E8 C7A5EDFF   call    00404698                                
* k& y6 t. \6 |: U5 ^        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容
0 L0 x. H  M0 r3 u        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用
/ x7 u1 j1 d' a        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        
% z- B2 y3 Q' Z4 w0 q; n/ _0 v1 Q        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB8. I* x8 [5 ?( r4 Z
3 |5 G. |5 A5 W" `  H
    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????: P* D& \5 A# d6 l) K
   
- h" `3 t8 V0 n1 Y& r    这时od会被中断, 断在刚才下的断点处, 这时按下F8 1 T, d1 B( G8 G1 a4 A$ `5 K
+ Y2 |$ @  S6 X/ H  Q8 V
    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩/ o5 J- Z& R/ y4 Z8 n8 I

! i! x- _1 n* q1 ?7 L, H    同时发送数据给客户端- h/ L7 c( q1 H
9 _) ~/ f$ J! r8 V7 V& n5 S
    % N% i9 K* G. ^2 E! I  D7 R# O' y+ ~
    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过$ g9 z9 H. j; y9 G4 f
  
* A2 h" v8 r2 m& G: Y: F( N        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)
) c) \# N2 N" u6 ?% ?. V& |6 s        0053BBFF  |.  0F87 41020000 ja      0053BE460 W3 P: J6 e  p# I2 K' ^

; U6 C  T" ~' ?, u5 V- K0 Z' h  b1 l    eax 这里是3 一路F8比较下去到下面这里
4 Y0 t9 h1 k$ X' u( v( [+ ^
9 c5 ]+ |: f3 K3 V        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC
/ a! \& E  k2 z        0053BCDD  |.  66:BA 1F00    mov     dx, 1F
& ^& Y0 N7 ]' {- r0 {        0053BCE1  |.  66:B8 1F00    mov     ax, 1F
7 g% S  m& W4 u5 g        0053BCE5  |.  E8 EA54F2FF   call    004611D42 g( c' ]/ {! w2 S" ~9 r7 k
% v6 q$ V; J, _
    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数 " n/ ^/ O2 Y$ M' i+ z5 B7 d
    2 d) E  a$ Q# Y( @
    call    004611D4  就是调用 winrgb4 c% [  x; f. v# b) j! s4 Z2 u

/ s8 e, ]$ C' B) i$ T% J) H; O- w+ [/ J( W4 G
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在8 d* A. H5 I$ f4 b
8 N  K9 T: D3 i" }
    dll里面进行内存地址读写" O/ u  c( `" Z8 c1 ~' K+ @
( k5 U3 Q) A" N( i6 c6 L$ x! [
    我是在  p* l4 K9 t; b# \% e, ~. J
   & k% C9 b8 O3 _, u3 s
    0053BBFF  |. /0F87 41020000     ja      0053BE46
( g" `9 N# J( L+ x( a3 y
, R: `+ d4 ?  ?1 ~
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写& S! X, X+ l9 m6 r2 n0 ^" \1 T' }. D

% q3 [9 o- C. F
    procedure InitDll();
! O4 i4 }% X9 W1 F
    var5 M1 A, \. g, c* \
      p: Dword;$ z1 M& b# u" ^% J
    begin
- b" q7 m$ ]5 z& x2 _
      p := $0053BBFF + 1;( _) Y$ c5 S8 P; }( b; v3 X/ d( b- z4 {4 ~
      PDword(p)^ := Dword(@proc_0053BBFF);
4 |4 c* S# y, G/ l4 g& I
    end;
( l$ J5 S/ a6 {. q$ M

& c8 e6 Y/ M$ l2 F5 |' s$ V
    在自己的代码里面写一个色彩增加的函数判断比如
. }0 `( \! F* o5 ~4 n2 K0 g

% P/ J* k3 W4 x
    delphi代码:( [/ v9 G5 A* P1 Z$ P: q
9 d$ u. o7 p% Q9 G% b, ^
    var4 m; P! |7 f1 u7 h  a
      EndAddr1_0053BBFF : Dword = $004F470C;
! k5 _( }9 m2 {# Z# f  m
      EndAddr2_0053BBFF : Dword = $004F44CB;
* v6 ~6 E3 k" t6 A+ M# Z. Q
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转
4 O( C. x  f- q; p& o  e4 o

: r4 l, D8 Q/ y+ z( e% d  n& |
   CallAddr1_0053BBFF : Dword = $004611D4;
0 E+ g0 b1 X8 S- e/ T8 A
      CallAddr2_0053BBFF : Dword = $004611D4;
) p" Q7 h7 M* ~* f+ ^: T4 b
- `3 H; S9 \6 ?+ U. @9 C( d
    procedure proc_0053BBFF();
' T$ x# }" z$ \% y9 v3 X; Q
    asm& a- n+ ~; L* o7 G
      cmp     eax, $10                        //与预先设定的 最大17比较
6 V: C3 J/ n9 V" J% ~! c5 m9 w
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值
* ~2 Q1 L4 f& Q% P' h; R3 `; B( I+ Y
$ Q6 G, o8 h; ]# s
      cmp     eax, $10                        //比较是否等于16% Q  x1 \: n2 N) v: g6 |2 h
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分
* z* z& I2 ?" n' ^. f8 c% s

. l: K9 b$ b, k' o2 ^
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试0 M# W  @: ]( |. a
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF6 G2 \1 h* H; y
      mov     ax, $A' H% t8 U- D  U
      call    CallAddr1_0053BBFF  t4 e! x/ M% X3 H0 C
      mov     edx, dword ptr [ebp-$14]/ U1 K" X% e6 R5 K# B
      mov     word ptr [edx+1], ax& L6 Y# A) N5 a& `% A9 [3 y

3 T  P6 n* F: i
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试) {' B/ h! r2 T) }) L# }2 ^
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
1 O+ X4 n$ V, R3 J; [$ P3 c  C
      mov     ax, $10
9 O. ]% R0 o/ |' `. [
      call    CallAddr2_0053BBFF  |1 |1 @/ h. ]- ?/ u2 h" f
      mov     edx, dword ptr [ebp-$14]* t" h! m" @8 G; `  R
      mov     word ptr [edx+3], ax
: j0 u& b2 m- @( D+ f" [& q! F
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs2 P- f  @3 w) v
6 K: ]. f( y" R5 J; c
    @Seventh:
3 k/ r& S) l' I2 t& G0 _
      cmp     eax, $11                        //比较是否等于17
0 W7 J& }# z  @
      jnz     @out                            //不等于就跳转到默认部分  ]- p2 U4 {8 H* s4 _# W* g9 T
. w& n/ f" i. I, d8 P
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试( ]9 s5 c! |4 l$ m5 s- t5 U7 o6 I
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
; w6 b; h; w' K  {" P5 |) Z
      mov     ax, $A0 ]5 N- S' U3 I2 |
      call    CallAddr1_0053BBFF" ?5 ^$ T, v/ z5 N! O1 I; n
      mov     edx, dword ptr [ebp-$14]
1 O  P" i0 m  e1 v
      mov     word ptr [edx+1], ax
: A1 S9 I8 R; r: v* W4 y  x* X

4 y3 Z6 D; {6 U# K. i
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试; N: ~$ r, J& l
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF' G% D  f, W' a. k( G8 F3 u% Q
      mov     ax, $10
! A) O/ t$ d9 V6 Q( R+ r
      call    CallAddr2_0053BBFF- _- M7 c% Z8 h, y
      mov     edx, dword ptr [ebp-$14]
% e. O- P( x( y% E
      mov     word ptr [edx+3], ax
& K  m/ ?  K( \) ^3 @% I4 ~
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
2 ?8 A- T& L' [) X9 Y( T
                                               //
- o+ o1 C$ ], ^. |: ?0 Z
    @out:
' h  D( q) a8 S" w2 C0 J& N
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点% V0 A7 _" {. x) z- t1 S

; t7 ^  P* R: U
    @OldCor:7 X) {+ ^; z- w
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值! r8 G. E- N! o: ^; M$ ?
    end
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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