游客您好
  • 点击联系客服

    在线时间: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 编辑
2 D4 u0 G# R- W" r, Q1 Y. |; V3 l: E- i& n4 P
编写需求条件:
* F2 @# U4 @( [7 W9 w! v5 t" w" O0 {6 T1 U+ {/ z) T% S
    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)5 H% v4 V! H$ \2 Q$ w! F" [/ P/ N, `
5 W5 Y8 ^1 h  C' k2 ]

' ^% T, e" ?( Q/ G" T编写过程$ ~* w- W  T; p* G

" p9 }/ k& `0 ?: a1:- y/ ?  ?$ `7 P3 T# B) Y

( I3 `* A  ?5 P% F4 O    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面& _5 `5 `+ _/ Y, _
* {1 i  U7 f8 o7 e+ F6 D( Q* n
$ K+ d/ D8 e/ w7 l' R1 ]" w
2:
4 P4 \6 A" a! s6 b. q3 M
! f2 T5 }- C3 s) m7 t5 V- L6 K( G* y    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序
* O! M6 }7 D! x; r+ Y. O5 _; n0 n* a2 a/ |1 v' A. i
    启动客户端进入游戏(后面要用客户端)3 a, X, d6 m, r6 N" [% q( w0 h1 h
; T& Z5 C+ l1 N3 J- S% {/ c/ k7 T- E
    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
$ @. m$ h+ P1 G* n; q
* n( j8 ~; z) S% p    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序
# I* Z, l# u2 |- j+ C1 Q* j% m5 q
4 w8 v5 f0 E( ?9 B. M) r, c* Y    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到0 ?1 Y* f: \2 H4 p0 }2 s

2 C) ~: r0 l# n3 Z" H    od停在; m; Q* ~$ L6 E1 |$ j4 S3 _

, ~7 q' ]" m( F0 p' o    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "/ I4 p- b5 P+ X  g" d! U- E
# ]# q& [" Q+ A% P
    双击这一行 再次看到od定位在汇编代码显示页面& c, Q& G5 ?! H; W0 ~  F, g/ D
( m* s2 S9 ~+ a6 _5 Q

: w0 g& }; f% `; E( H5 k        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: "
7 Q" |. N3 _& O, i        0052A0CC   .  E8 C7A5EDFF   call    00404698                                
; l& G2 D. P- l# H$ W        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容/ e. t3 ^2 b0 [
        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用
0 I$ E+ w" s, X- X        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        
+ ]: j% O3 X4 J" v        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB8% z. R3 G/ e: M- i& w$ m8 u
# ]8 d8 V* j& L& r
    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????
. z+ q" h( \  v- B0 t   
9 T* q7 R  ^2 l' N    这时od会被中断, 断在刚才下的断点处, 这时按下F8   U% s9 s  e: f: @- j+ U

* B  C& I2 N2 e    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩
2 L" \, ~7 ]& C; f7 z
8 i) n& R+ p2 T: g4 g+ i) ^+ S    同时发送数据给客户端3 S+ ]+ f! v4 o6 S& V

4 y( }  ?9 y0 K+ M* \    ( Z/ R' i! j2 x1 ?# f' y6 X3 A
    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过7 H- W: x$ L' Q  M& V5 u4 H
  2 d: v7 ^0 p1 \/ @' z" m! p
        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)$ F# @( p4 x, L2 P- e
        0053BBFF  |.  0F87 41020000 ja      0053BE46. l$ L2 \: r% y( C8 ^  n

8 M( {7 T  \7 u/ `    eax 这里是3 一路F8比较下去到下面这里
) Z! o( ^/ a' \- L% L% L9 i; s. I7 L
        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC; j) b  _% `" q5 l& H! ]
        0053BCDD  |.  66:BA 1F00    mov     dx, 1F" K5 v/ n" W8 ^0 V" w$ }2 J1 d
        0053BCE1  |.  66:B8 1F00    mov     ax, 1F
+ \( K& @8 t. m+ N  c+ k6 g3 f        0053BCE5  |.  E8 EA54F2FF   call    004611D4
5 M* ]3 f' p0 P
8 ~$ ?- ]! e( _( K    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数 7 _% l! j! E/ t% D) W- u% h+ R
   
( d" A+ T4 p% k9 w7 _  I" e    call    004611D4  就是调用 winrgb
" p. @: J/ l: z% T9 j
$ o5 x! B. A: N0 Q" g3 B6 j+ B. F# |9 E) o3 a3 S1 H" i8 N, @: M
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
5 C* e$ _; x  }8 O# d  b

) x/ ^! E8 E: g2 |& W
    dll里面进行内存地址读写
1 W- r) p4 S& A) X8 v; x

4 ?% a) g2 }' c3 S# Y
    我是在" m' a5 b% i1 @; g, N9 n$ Z1 s
   
" k) w% Q/ j  d! r
    0053BBFF  |. /0F87 41020000     ja      0053BE46
- X; G7 l- d, i( f8 i8 N
+ [7 @8 P# r5 J
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写. F! S. O( G& Z( k; N8 T

) Y: ^! J1 u) t( I5 e2 A1 j& m6 I
    procedure InitDll();
& t1 O( T6 ^* `1 C
    var
  j$ [1 k& ^: S) P" U
      p: Dword;5 s+ g7 Z$ V! h" E5 y( c
    begin
9 p" i0 W" L( i; u3 m  d
      p := $0053BBFF + 1;- ~, @! @& S& N# u* z
      PDword(p)^ := Dword(@proc_0053BBFF);. |1 \+ c0 v+ B0 {# k% L
    end;
& y+ x$ R* N# L9 p1 Z% a; |2 I
5 U$ n. y8 X3 \- B
    在自己的代码里面写一个色彩增加的函数判断比如: U, M8 `( S& r" M1 R# R8 l

$ _% z. }  U' ~% \/ ~8 c" p! Z2 v
    delphi代码:
+ y0 R3 {' Z3 p
1 L' ?+ J& G' o1 D  U$ N
    var' s4 P- z7 V2 |. Q
      EndAddr1_0053BBFF : Dword = $004F470C;
9 N+ q, E  O0 f
      EndAddr2_0053BBFF : Dword = $004F44CB;
$ a* P! b7 E9 k+ {8 v0 K
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转
: H+ z0 C* N9 B) q" U4 g4 q

( Z' _- N/ a! a3 T1 C& ^. f2 D# U
   CallAddr1_0053BBFF : Dword = $004611D4;; K9 j$ K% q0 }' N* k7 M
      CallAddr2_0053BBFF : Dword = $004611D4;
$ p, U3 m& k  C, ^4 j# S  J" P) \
6 E0 J) d" D5 t* E8 R; h% E9 i
    procedure proc_0053BBFF();
0 F2 F1 H7 \4 ~# K4 D; \7 h; l0 e
    asm: A7 |8 q9 n4 v+ b
      cmp     eax, $10                        //与预先设定的 最大17比较, T5 m- z6 m+ H5 x: i. E
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值0 n9 |' p. b# w. f
1 h) r3 p5 _! P" S
      cmp     eax, $10                        //比较是否等于16& }- z. m' s# U$ H. Z% b
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分8 c! R& A' S, W/ w: B

0 M$ _! t8 @/ ?0 ~2 @; i* P- O
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试0 p" N& o# q# |' v6 P- |* U& D* L
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF2 S0 B4 T' n& \3 Y7 K
      mov     ax, $A5 V) D/ d8 C4 c0 @
      call    CallAddr1_0053BBFF+ _. u$ d! W  @7 U* a& x
      mov     edx, dword ptr [ebp-$14]
# H4 D% L- J& z+ Z1 k! n) H; [
      mov     word ptr [edx+1], ax
6 ~' G5 `/ c- J9 }- k1 g' g# `' k
$ s% x0 r) Y% p' Y; Y; S- A- r
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试: U  S! e' h" `8 \$ d$ M
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
5 t0 @' e  {" d7 D; f% p. E$ @
      mov     ax, $10. _, \& T$ E+ R% \
      call    CallAddr2_0053BBFF
7 a. y; V" t! ~6 T- f& z7 `
      mov     edx, dword ptr [ebp-$14]* l0 Z8 [2 N9 Y- N7 ^% r
      mov     word ptr [edx+3], ax
3 N  l: w: x# A" S5 T+ g* e! ?% D! _
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
! u+ D; F( V: Q3 }  L

" }9 q: N$ p8 c: y$ v0 U7 @( y
    @Seventh:# s# j2 U. W9 n& y
      cmp     eax, $11                        //比较是否等于174 P* {, S3 I0 e! l( }
      jnz     @out                            //不等于就跳转到默认部分+ b4 T7 P: q: p8 _! y; q

/ H  A4 P4 h/ L) W
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试$ b% f' M+ F1 g) h% n/ P0 s
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
* l# j0 G' O# I& |9 E- V
      mov     ax, $A/ z( p) L: S5 M/ u4 K8 f+ R
      call    CallAddr1_0053BBFF
& K+ P& D( f  W/ r, }8 s( c4 @; u
      mov     edx, dword ptr [ebp-$14]
5 s- s) w! Q$ I6 {; s
      mov     word ptr [edx+1], ax
( ^( H0 W* e) P7 j
0 T( k+ K; S7 z" F
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
' O! Q, v- p. Q, j3 p' g5 P
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF- H9 C8 o+ C( e
      mov     ax, $10
9 m* s8 b1 j8 Z) B, f  |7 ~
      call    CallAddr2_0053BBFF4 J( e( j& B3 `' |% f5 R
      mov     edx, dword ptr [ebp-$14]; s% F+ c5 \  t, {# L5 \8 a! S
      mov     word ptr [edx+3], ax
7 u" E* U, L" ~/ P
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
* f# X4 s, U" R- |/ B
                                               //
9 G* S' ?  c' `" X4 k" K" K0 e- p
    @out:3 H( T/ X: T* ~0 r% r. F
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点7 B( E1 o1 k/ L  Q6 u8 t
% h/ p4 V, J. v
    @OldCor:7 y9 c0 f* Z9 I! u$ u( p
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值
% K8 c% i1 V6 G8 j5 ?5 S. y3 Z
    end
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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