游客您好
  • 点击联系客服

    在线时间: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 编辑 / p5 r" l5 k& V/ m, m6 ]2 {

# g- g4 X. N. W: Z
编写需求条件:0 C5 M* u! S$ R/ ]5 T
/ z7 |- Q1 G- n7 M& a9 M# _( B- }
    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)( Z' W' p' X; T) c( ]
- K* o5 x" |# B/ Z! Q% @* G

: A5 k$ k, \& i" \* E" S编写过程# ]) u" l- u3 i  o: p% i& Y! h7 E

1 ^3 q0 q( [% p3 p) Z4 U1:
/ {/ k  S6 j: ?  a8 N. e5 h+ U, F+ j$ M5 Y5 V% f1 `
    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面
9 q- @& C% ]3 J4 y  q" {$ I/ T8 w0 d* L1 C

; N. l* u# i2 r, i! R8 b7 Z2:
) k8 c; D# h: x, v- [! @& ~
  `* L' N+ a: O    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序
0 i* Y" \0 r8 y1 Z# [
. T+ U! q4 {( d( T1 w- ?' C    启动客户端进入游戏(后面要用客户端)
0 r7 S: x1 x( l* K8 E2 O6 Q0 T& m7 B1 Z6 f# g. `) W
    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
1 C" L- V5 K5 F3 I/ r% i' ^: }  Z$ V2 I+ Y8 t, b& z
    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序 0 Z" \% a! _- c" A8 ?7 W
' ]! g4 d4 z* v9 o
    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到
2 k) `9 I+ t5 Q# e0 l
5 {5 V4 A2 e& N  g2 @8 r1 }# n    od停在
$ @! u$ g* S6 G  k( }4 v! U# C$ x& Q  O% l, k  J
    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "% [4 [! z; M6 u

" k! ^, c8 @% ^8 \( c2 t7 h    双击这一行 再次看到od定位在汇编代码显示页面
# l$ K2 [. d8 D8 j# V; B3 B& o5 p9 Q4 W4 E- V

5 h$ f- G, d/ i+ ]2 u4 }        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: " & k: }4 S+ u( j( ~
        0052A0CC   .  E8 C7A5EDFF   call    00404698                                # `( Q) |8 P% t  p& Z2 a; V1 l
        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容
7 f& U( b: g  V  r( l        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用
3 ^) I& A+ _  u  c! Z  ^        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        
' R( S6 X1 }/ F$ w' R        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB87 X3 p( F  L! O( q1 N2 p6 O$ T" V1 N# }% W

/ {* K4 h, h1 j6 J    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????
+ I) }0 t7 t& y6 o   
7 c$ G1 I: E/ k$ x    这时od会被中断, 断在刚才下的断点处, 这时按下F8 - t& I8 i/ m# }
7 u4 G. T1 Y- F6 I( ~2 h# V
    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩4 w1 B) C1 s* F* q  S# k, h% K/ H
  i+ p1 o1 y1 h5 c
    同时发送数据给客户端' o5 P7 ?; a, G4 [! P; ^
! ~1 P1 O6 W) J# v9 r+ W2 o; S
    / d8 M3 D) q9 c% w1 ~! T* G$ x9 Y
    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过
( Q" I: x) A" w. M% F  7 s2 N: U/ X. i. a* e% q: l
        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)) N8 \! M8 \$ o# r+ L
        0053BBFF  |.  0F87 41020000 ja      0053BE46
4 c* Z0 O* ^; {. x  `7 p
9 }4 H' ?; e( U    eax 这里是3 一路F8比较下去到下面这里$ F0 O6 K. a3 `) L

) S+ B4 l" J; j( P, t$ F        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC
$ g( i+ L+ k8 Y, S1 E8 b( W! I        0053BCDD  |.  66:BA 1F00    mov     dx, 1F
7 ^+ D5 r' P3 ~% V8 C" c7 g        0053BCE1  |.  66:B8 1F00    mov     ax, 1F6 Y/ y/ r7 y$ V
        0053BCE5  |.  E8 EA54F2FF   call    004611D4! Z( Q2 O4 n# L0 }. V$ a1 l
# L! w: m% Y! ?1 ^
    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数 ( l, w3 h2 I: D+ G5 C
    - O; L. @0 ?, k4 @; u8 _3 n
    call    004611D4  就是调用 winrgb& I; s, a4 A! U7 O$ _/ O; ^4 B1 l7 r
4 A" g, G+ E5 l- H% C! @, a
. O, E2 p' G( {1 \
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
/ R: e. K% {# |5 n+ f
6 B8 L  j+ S0 i9 Q( N* T- f
    dll里面进行内存地址读写3 k1 [; E! Q% K, h; q  v

  O( q4 D/ a0 X: j$ Y. u; {! J$ I
    我是在
( G# X+ V7 `: Z0 c- X# {9 A
   " x. T$ I$ k( y, y* ~# D
    0053BBFF  |. /0F87 41020000     ja      0053BE46
8 C; y% y5 Q3 u, I; ]$ U
. }/ g" w- `% _( G5 }3 e1 l8 Z( S
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写
! n* S" X6 T# T; e, T
1 a* f1 {# ]8 t7 _
    procedure InitDll();  B6 N" A: ~/ w! b" q, a( o
    var
& C( f$ n  E% Z% @+ k  g
      p: Dword;
+ \* W2 ?$ z& x5 ]$ [; Q
    begin
- ~. Y6 z! F  ^. d" s$ D2 F" ]
      p := $0053BBFF + 1;; @  \( B- ~% U5 o- }) v6 \
      PDword(p)^ := Dword(@proc_0053BBFF);3 W0 b! k2 P: Z! }. M
    end;8 x& k% P6 [  c! l
, w8 A" A& d: s  y% r9 z. Y9 p
    在自己的代码里面写一个色彩增加的函数判断比如& F( o2 N: \/ i/ [4 z, p

0 F1 ?5 Y1 s. t( E* _
    delphi代码:
# a3 Z9 j6 s! X3 B! Z
8 O% S7 ^$ L9 O/ u! P
    var! K. r- [3 H. K2 A' A" J: E/ A
      EndAddr1_0053BBFF : Dword = $004F470C;( @$ ^5 `0 ~6 F/ H; U4 \0 L
      EndAddr2_0053BBFF : Dword = $004F44CB;
' u) I. p% V4 e" ]( C
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转/ ~5 X5 |5 \& H7 B" U% \7 M- ]

" [7 [, n5 W  o( a
   CallAddr1_0053BBFF : Dword = $004611D4;
0 S1 [  p1 S( I; i
      CallAddr2_0053BBFF : Dword = $004611D4;
) S  x. Y6 k- F/ Y
: x& q" S. \* |* _! t. g
    procedure proc_0053BBFF();
( n" Y% }1 W( v4 U2 _6 N
    asm+ B9 W7 M) d4 Q- i
      cmp     eax, $10                        //与预先设定的 最大17比较
8 `) [6 E% P, a$ |# L; n
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值
* s" o7 x8 x7 R

7 Y3 @1 V3 s% ?: ]
      cmp     eax, $10                        //比较是否等于164 m1 S9 T& b) d$ r
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分
* ?: {/ L) R& S& g
3 _/ D+ w" k" s3 _" F0 m' W" T! e3 O
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
5 M. ~3 z& i# r' S
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
" X. j  H7 J' U4 k& u( t! y
      mov     ax, $A
" j( W" Z; k6 [: O$ \) r
      call    CallAddr1_0053BBFF# ?% v3 A3 f% z% I
      mov     edx, dword ptr [ebp-$14]" M" T8 U7 m  x# j9 `: a( y
      mov     word ptr [edx+1], ax" p) n3 n, e3 c+ C6 }7 A7 g

9 e& [* D2 f) o& o; C; X
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试0 B# U  N' F2 `2 B; Y& ?
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF9 ~& o3 L- {! D1 x% [2 k- `) Y
      mov     ax, $10, a: n! f4 F. D: Q4 R' s- Y
      call    CallAddr2_0053BBFF4 P' [; m% L; z& ]" h
      mov     edx, dword ptr [ebp-$14]
. E/ ?2 w; A* H8 n; c6 k( t: T
      mov     word ptr [edx+3], ax' u! H8 F# R5 n6 S( r
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
5 z, E% r, p& H0 y5 n

' c! e( o$ u  }  }
    @Seventh:
3 j, `; r5 F! r3 ?$ {' r' L
      cmp     eax, $11                        //比较是否等于17
  X6 a6 O0 b! F8 f
      jnz     @out                            //不等于就跳转到默认部分! x5 E( u) P+ A  _7 b8 R

0 s1 b, |; i( k9 q
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
& {- _# f( b7 x6 u, H
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF8 i* a1 W) }) O/ r
      mov     ax, $A. W/ q$ x+ E1 z! x; i5 b# B0 N; n$ Q
      call    CallAddr1_0053BBFF0 n+ g1 J8 q3 ~, S% A% \
      mov     edx, dword ptr [ebp-$14]
4 `9 B  ^. _/ V7 E! L
      mov     word ptr [edx+1], ax
5 o5 E3 B& b& ^' I

) h9 e. F2 |9 v$ r5 K% _8 f
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试; u+ }: w4 L; q& @) }
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF: y3 [  }' R+ y5 u  D. ^2 y% D9 n
      mov     ax, $107 a  k+ V  [( Z
      call    CallAddr2_0053BBFF
: p; M) m$ V6 X, F, H
      mov     edx, dword ptr [ebp-$14]6 O& P: Y2 l. g: L
      mov     word ptr [edx+3], ax
4 `9 o" Q' n" P& r, X
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs$ E5 u4 O/ x: ?9 L3 m
                                               //' o) j" x. ~0 H& l% [, ^: E
    @out:
3 n' J% y- u7 J% z& j$ O
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点
! W% _# e' {8 \8 ^/ i

& T( i$ S( Y/ ~( a% j
    @OldCor:
: }% z4 R- r8 e8 _4 U
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值
. j6 R8 ]" ], g7 Y, h+ }/ X
    end
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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