游客您好
  • 点击联系客服

    在线时间: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 编辑
4 X, v- N. ^, |' f# r; f
7 H, T/ n% t$ q' m3 B
编写需求条件:
& G: P: y2 S3 u0 ]" ~
* ?1 r2 C- o/ F' y; D/ `    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++). \6 |, x  r6 Q5 P% z. k! f
. R& d5 O3 v. `# [6 q
3 z* d" `8 j! l) Y; w
编写过程6 A, p) q/ k& Q
- N9 y/ ]8 o+ j3 {
1:6 f- w% j( p9 X; U4 p( l7 s+ x
3 @* `3 y; `" S
    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面+ p5 s- g- V; P* h

) Z5 V5 a# e6 ^: S" J% k9 j0 V8 j! h* Q
2:
2 G( _- w/ b4 S2 t/ k9 N) U3 x! c  F1 @, U( W) s& z
    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序6 p% }  Y( t: d* A& V( b: s

' C: q3 {$ f  E0 Y1 g& c# K    启动客户端进入游戏(后面要用客户端)
8 b4 I  ~% H$ [6 x0 U% o/ u7 e" Y5 K1 K. O  z! w' }  `) d3 n2 _8 m
    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
9 y  |/ q9 u" Y
3 X5 G: n; t$ q$ K' p    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序 + l& }0 u' I) Y' {, B+ ?) _5 w- H

0 d+ w. t: b( j7 N& P* g    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到3 }/ e& r! e0 ?3 U/ [% H
' a3 O0 d( k4 l' T2 ^
    od停在
9 U' x3 D$ Y5 n* z) d; ^) d0 \) M' [. J1 D& f( f' M# B# b( V* c
    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "& x! ~: P8 g) d& B% D" {% F: b
2 y+ G- X& e- k% a$ R
    双击这一行 再次看到od定位在汇编代码显示页面
$ K1 U  P$ X" C3 y# p8 L: `4 o! m7 r

% ^  H7 E9 P, C" n9 n; _" }        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: "
9 Z0 V( J/ Q+ K3 K" r  [        0052A0CC   .  E8 C7A5EDFF   call    00404698                                6 ^: C+ u" h6 t, W
        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容
, C& K" c- B4 e* I, B- `* j1 V( m        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用
5 S3 C; R: Z2 M9 Q/ k* \        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        # h0 H  Y$ f2 `+ \$ _1 r
        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB8
$ r& P2 K& ^& x) y  _5 M1 |, t& X5 Z( `( U8 G! x3 |
    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????/ |9 c+ q9 e0 @
    % R, l& }8 s  M/ S
    这时od会被中断, 断在刚才下的断点处, 这时按下F8 ; x9 w( e% b0 D0 d6 k! p

0 B7 W( X* P1 G$ {& X    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩9 k7 s% P5 @+ Y' ]) n. \, _  \

( w9 ^2 Z) k! y+ p. m( r    同时发送数据给客户端
5 {+ o7 e# X: X9 ^% s; T5 n; C5 ?$ m
    2 O2 D' E0 J: h' E+ y
    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过
+ j$ t/ l3 L  A% ^; u  3 c/ [- o0 d' Z4 J8 ?: j2 C
        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)
# C6 _  r% o5 j3 M        0053BBFF  |.  0F87 41020000 ja      0053BE46
1 q* ^+ _) ~6 Y' @' T
8 e7 s; Z4 ~2 x    eax 这里是3 一路F8比较下去到下面这里/ y7 o1 Y8 P6 z1 v" C1 f% S9 b
9 ?/ F+ v. X( R) S8 L
        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC
, M. j6 x) c5 z- S0 u& @# Q        0053BCDD  |.  66:BA 1F00    mov     dx, 1F1 g$ n& U. U9 U$ i
        0053BCE1  |.  66:B8 1F00    mov     ax, 1F
5 l* U4 W1 L. F% U        0053BCE5  |.  E8 EA54F2FF   call    004611D45 v9 }3 Y7 G3 x) U5 ]% T, n
% A' Q. q& X; z: v+ l2 p1 e
    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数
5 g1 X2 ^7 m6 |$ \8 D' \: F   
3 e+ `/ w- y) e% `& C  b; S9 c    call    004611D4  就是调用 winrgb, l  a  a8 j) e! A
' {8 b  K; O) F, I5 D

0 S, x" {9 u+ E: i6 B0 l: m上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在2 l- ?. p5 V. t

! y" l% B9 X0 F- y+ A5 E3 n
    dll里面进行内存地址读写% A( T( `0 H/ H1 S5 O0 j2 j

' r/ n) M/ U/ E6 x' ], K
    我是在2 p7 |+ L! ?% A$ F0 t
   
6 a+ Q6 r- _# v, p+ l
    0053BBFF  |. /0F87 41020000     ja      0053BE46! l- s" V: m; I; R4 U: N' H

( G$ `& f* b  ]  V, f( J' V
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写
! \+ G9 q. D/ U) D- u5 X5 u/ A

% o0 V: z1 z& S2 @! e
    procedure InitDll();
  c( J/ |6 _. T+ X7 `% b
    var
) u: V7 {1 Q) ]3 _1 F5 j
      p: Dword;
1 J3 R: D% N6 k
    begin+ g  \* T" M( j! I" _* ?5 H; s+ M
      p := $0053BBFF + 1;
/ ]" x8 z" v" m6 _& m- U) N
      PDword(p)^ := Dword(@proc_0053BBFF);; B+ ~+ K  D4 e
    end;+ A$ O6 U; Y  A, ~+ S

/ }- x% M% P8 L; M
    在自己的代码里面写一个色彩增加的函数判断比如
' I% o# H4 G5 z* I4 e

/ M: u# a+ S/ L
    delphi代码:
0 _/ }  v& x! b" S3 _/ y

" r( n. F0 [5 s( W
    var5 z7 N6 ~0 L. Z
      EndAddr1_0053BBFF : Dword = $004F470C;
5 G6 j3 q# h' m; N; v) j
      EndAddr2_0053BBFF : Dword = $004F44CB;5 w- t  E8 }8 {# c$ q
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转( |' `- V" `- K/ E0 [- g

: Y* ]7 x/ r- |- `5 j
   CallAddr1_0053BBFF : Dword = $004611D4;
9 R3 y' B. V* W* ^  Q/ e
      CallAddr2_0053BBFF : Dword = $004611D4;: g: b1 r# _* n3 w
; f3 C! o. v, `1 \8 r6 z% l
    procedure proc_0053BBFF();
. K# ?& @# ^& E: \8 v
    asm0 x! T% m7 V- Z7 U1 V- L7 q
      cmp     eax, $10                        //与预先设定的 最大17比较/ Z) U8 `, r1 c9 d0 x
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值5 ~, u* \2 k$ J6 N
% |- h  i5 r. p" r2 g. q3 f
      cmp     eax, $10                        //比较是否等于16
1 Z" h  A- D6 V3 K% m4 o, K% ^
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分
0 {: n) {% a. z

# @+ j9 b0 L- F, e) Q0 f
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
; ~6 ?) ]$ O' D: k
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
6 ?& {$ H; u9 i) }, P9 m
      mov     ax, $A
5 E0 j1 x7 V" B. X' B! H" P7 c
      call    CallAddr1_0053BBFF0 y3 B- D( K/ r7 y, B+ A" F1 I. B
      mov     edx, dword ptr [ebp-$14]
" c' k; {8 \$ h1 r3 i8 }
      mov     word ptr [edx+1], ax; x; a, }+ L. v: f/ t4 c
  Y/ s& y) o, `3 T
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试$ x6 F$ U+ q# D* n
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF, t2 J* A+ T4 j& O: t8 k1 N+ \; [- T
      mov     ax, $10; }! _* b- s9 Z
      call    CallAddr2_0053BBFF$ V, \9 M; W, d+ \
      mov     edx, dword ptr [ebp-$14]8 \$ I$ r; c. Z8 E- Q+ u
      mov     word ptr [edx+3], ax! ]4 J# J2 q6 i% D! _! |
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs; j% L$ @5 X0 c. Y5 v) s2 L

. D: p# z! c, \" Q0 z) B
    @Seventh:- `8 y, i0 m7 W" x+ _" @
      cmp     eax, $11                        //比较是否等于17' o  V+ I' _# E, D, W
      jnz     @out                            //不等于就跳转到默认部分. ?! ~% G7 E7 S, M. N! K  v0 F- ^
, O! o: w7 Q4 @4 h
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试$ o6 V4 w! f% s: R' D5 }2 l  q9 K8 y
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
& G, l  f( ^9 L  v
      mov     ax, $A, @, G! |' F4 U# `& d# t
      call    CallAddr1_0053BBFF$ d& B& k: e& n  D- |
      mov     edx, dword ptr [ebp-$14]4 M2 R- ?( T% u% p# j0 C
      mov     word ptr [edx+1], ax
$ T2 B* r' q# s. ^; d- w' c" J

6 |! Z+ T% L9 ^: R+ {3 k
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
4 Z8 I* @7 t3 s( k0 J
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
1 [6 M5 Y  v) F3 {
      mov     ax, $10
. O2 ^6 B! @% G4 |3 c; N
      call    CallAddr2_0053BBFF+ d4 R" {. b% l; r- d4 r0 K
      mov     edx, dword ptr [ebp-$14]
% ^! f: u' |& ^
      mov     word ptr [edx+3], ax+ q9 U% p- v. {# n1 K7 A7 G
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs! l5 u" Q9 }% ?$ \, u0 l
                                               //
+ O: ^& T( G5 ?9 ^5 {2 }3 J
    @out:
9 Z* }( H5 v$ `8 d7 D: ]5 o
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点' [1 v( W0 H" x& k
& Z% R- p" Q6 d' e+ Z
    @OldCor:; p  W# {! M/ L2 P8 H. P! D; H
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值+ O, f- G$ ?5 m3 e2 S3 k
    end
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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