游客您好
  • 点击联系客服

    在线时间: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 编辑 - P2 F( k- u% q
9 E4 K6 [- }3 G5 k$ w' ]
编写需求条件:3 S& o! h) v1 G" I6 M$ ]( j& E
' o6 I; ^/ R) e
    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)$ P) S8 L: j/ `/ _
  f1 C! a4 y/ t9 L

0 E3 N& B/ Z$ L, G' d3 {编写过程
: v8 B: y' ]! v/ x
" K. x+ Z9 G0 J  t- Y( W. s; E1:! e% H5 Z4 Z# i1 W8 _; O% Y$ ~

1 G) c9 Z! F; J0 ~# L    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面
$ q+ U  p6 o$ D) t3 w5 j+ K% |: t
1 p: N0 O6 O5 N& `* {7 ]" L2 S& A7 m$ j5 a
2:" H0 Q  `3 y3 u: n8 T

7 w5 v: s+ C# y* i    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序4 o9 v: D" Y6 R  \' T2 e6 B

) T: t' L1 {, E# i3 X* Q    启动客户端进入游戏(后面要用客户端), I9 Y: h" c% O/ g' ~

# V6 z, E8 \2 J/ ~* O( T: x    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe+ y& r* {. X4 U% n% i% s

! e$ f8 u- t& m% z7 r    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序
  B( ~: R. `/ R* i$ h+ U) e( P, q" i; p# ^+ o
    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到
; \- q' B2 s3 b! X" H
0 q6 g% |- P7 A: j8 e0 N    od停在
  g9 X: `0 U2 I, S. h
1 O+ ~2 w6 s+ _- A5 Z3 ]& w9 s% _    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "5 m/ @( u) L. ^5 v! `, j- ?: n

5 a$ Q1 Q! j: z- M    双击这一行 再次看到od定位在汇编代码显示页面- ^/ G  q7 B. M% J3 k
$ X1 ]3 ^- V0 n
$ T9 V' @& L5 V) f* U2 ~
        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: " ' p4 A3 H0 b. b# w1 @$ \) |% s
        0052A0CC   .  E8 C7A5EDFF   call    00404698                                
! F7 o% y% n* n' u: `& }( b) o& k        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容
1 \1 B& _, {+ D. g0 f9 B- t( h        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用8 k) [5 @# w3 A8 P1 h1 R
        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        
# K0 g2 C0 `2 i+ d: a% E4 K        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB8
- l5 R- f; f3 u! U* h, T5 S1 w# p
: x9 ]0 o) m5 ]0 e6 h    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????
! p0 l$ ?7 f# [# \; [; L4 F    6 _9 |! h2 }, O* E$ {2 Y
    这时od会被中断, 断在刚才下的断点处, 这时按下F8 6 n6 @8 ^2 Y7 ^4 n, d  [& }
1 q3 h- H) W* s7 u$ j
    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩
2 Q1 |4 \! |3 ?7 G% `
+ K0 K5 ?, X) |    同时发送数据给客户端' h* T  k0 H1 J9 w, t: p: }
, t+ [3 V' K+ d& t7 W
    ; E7 Y& t' _4 @1 ~: K. c% i" w& q  W
    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过
; V3 O3 q2 _* \8 C0 x  
+ }+ V7 s- ]' m$ p        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)
1 q1 b( ^$ U2 K( V7 u* ~& P7 R        0053BBFF  |.  0F87 41020000 ja      0053BE46' [2 d  Q8 f5 G5 [; [2 U
" e% z- ^  _3 @$ Z* |# m) j! S4 r
    eax 这里是3 一路F8比较下去到下面这里
2 \, @) x0 U) R  A7 I0 B4 G1 s2 U9 W4 }( e6 }' N) U- d
        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC
' D5 J6 j8 q, ~3 ?# n        0053BCDD  |.  66:BA 1F00    mov     dx, 1F
! c" H; Z" B/ s" w        0053BCE1  |.  66:B8 1F00    mov     ax, 1F
3 w7 i. d% A9 B# b! Z: C, S  h        0053BCE5  |.  E8 EA54F2FF   call    004611D4
  ?+ {% w1 V# y- i
2 x2 I# P9 w: T& E$ ^0 l    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数 ) [$ P- R3 @, e: u+ A$ S1 D) @
    # l9 A4 g9 z' ~  c. K5 @
    call    004611D4  就是调用 winrgb
! j! U1 j- E: I1 \4 r1 N1 ?6 Y; b& ^) i( h4 {
) `$ B5 I. i8 k( T+ C; U
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在  J: u4 K6 z, c* ]1 U+ m  Y! W

8 k7 Z- f8 ]1 k5 R' A( N- W% ~
    dll里面进行内存地址读写0 i4 H( Z) A- L' _' T$ |, I, N

  f6 s- c# O/ j
    我是在) f1 L8 x0 d3 G& F' M  I. r
   ! z, I' h4 M3 n6 ]+ q) k
    0053BBFF  |. /0F87 41020000     ja      0053BE46) F7 r1 z  I6 ]

1 I; K* _+ l' i& N* }% O
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写
9 M: H7 ^# @  i
- I, [, _, g% t  M, H9 J4 z
    procedure InitDll();
4 ]4 i# m. `6 |8 o5 s' q/ f, M
    var; \3 i" E! S% h$ J+ a6 e$ S
      p: Dword;
, R- F2 c- k  g% N$ Q" T
    begin! \" q; l$ r$ j& n
      p := $0053BBFF + 1;
% C$ R. W5 C4 q) g5 `  x
      PDword(p)^ := Dword(@proc_0053BBFF);
9 E. W/ u: l& D$ p! P
    end;
* e/ [- ^+ Q& n" R5 C$ w
  M; \( z% p- t+ M9 r- W
    在自己的代码里面写一个色彩增加的函数判断比如
4 S3 I& i3 |2 ?: r7 w* f
/ `1 u. L5 K$ Q
    delphi代码:
7 N; n5 G4 R. \: f( j) {

/ f+ N* v0 D" I. S
    var
' _( t( y  i) R. u% ~( j  j: t4 t
      EndAddr1_0053BBFF : Dword = $004F470C;* i2 {. ^. u4 Y3 q! J* |
      EndAddr2_0053BBFF : Dword = $004F44CB;6 p& x) t' _' c
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转' O  a; Y2 ~9 N; n( M. J# n

' u$ J( u/ G+ t0 X, c7 }5 K
   CallAddr1_0053BBFF : Dword = $004611D4;6 |8 k# E3 s, V: r' E7 e; ]" l
      CallAddr2_0053BBFF : Dword = $004611D4;
. k9 h! h4 v1 n0 [+ {5 _

9 L0 `# |& E; e2 v
    procedure proc_0053BBFF();  T) d' n5 C+ I' H9 d
    asm5 M) v% z% J  F$ k9 G
      cmp     eax, $10                        //与预先设定的 最大17比较
  t4 @+ u5 N& u& ~8 I" ~
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值
5 v1 s+ E; `& b( @
& k" g- j: G* F- U1 y
      cmp     eax, $10                        //比较是否等于167 a3 Z. {0 v- O& w6 \
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分, p( N2 T, i# @% _$ D5 M
0 W6 d$ T1 F) j- S# B6 {, }0 p' ?. z) H+ L
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
% S" C, t! n' ~2 g) X; B6 b) b$ J
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
+ z0 e* m7 R+ {6 f5 K! e: z2 Y4 r
      mov     ax, $A
  G  m2 ~! W( Q0 [
      call    CallAddr1_0053BBFF
6 x5 `( B! m  N+ @, M5 {
      mov     edx, dword ptr [ebp-$14]
4 A# K4 l, r, p% W* @8 h# I
      mov     word ptr [edx+1], ax3 r# H: L' S: U1 E* U
9 S7 ?% S& ~8 x( ^+ h  ^+ d9 j
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
7 q" C' v5 A' q  g4 J0 S
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
/ m: a4 q0 L2 o" @, _3 {( p1 X
      mov     ax, $10. h6 u* E, ^9 ^
      call    CallAddr2_0053BBFF
6 F+ ^9 H' ?+ T+ d' D7 k
      mov     edx, dword ptr [ebp-$14]
" r" R2 |: D* B3 M$ q* d
      mov     word ptr [edx+3], ax
$ i; I0 P! ^5 Q7 b2 n* i  i
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
% N* r" ]: [& H% F& U+ @3 [0 }

/ y# Q$ P3 l1 q6 K
    @Seventh:/ l3 w9 k# x2 c7 p
      cmp     eax, $11                        //比较是否等于17* Q7 g9 j3 u, m  V: \6 |
      jnz     @out                            //不等于就跳转到默认部分/ n( n) W- z7 S; g% o; [

% d9 C. n4 e& l# g( d* V
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试! Q2 w; W& x& ]
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
" Y# k' n  |5 K) }3 @# d6 p
      mov     ax, $A7 \0 a$ q% W' o" D' k2 ]
      call    CallAddr1_0053BBFF4 z$ {: c/ c! p9 T
      mov     edx, dword ptr [ebp-$14]
/ d6 U9 N9 k* M6 [; n
      mov     word ptr [edx+1], ax6 U$ Y" j6 R2 @3 q' |
3 r- b) e3 G8 b8 e! ~# ~
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
4 N* v7 s1 W: B3 H5 A3 R6 u4 @3 L, f
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF- {5 m5 i/ a+ k- c$ g% s
      mov     ax, $10
( g! U# F$ c# h
      call    CallAddr2_0053BBFF& _; z/ Q" w$ r+ n1 F! D% B
      mov     edx, dword ptr [ebp-$14]
' S7 k( p5 ^! `
      mov     word ptr [edx+3], ax8 b: T* u' A+ I7 x! S4 k( D
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs+ O5 s$ B7 E( Q* |
                                               //
2 x0 i5 y7 o0 L5 M9 M- o
    @out:/ E$ ?) w9 q5 L- \) K
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点. Z8 q. M5 U0 M& f& L, |' w" d2 R% `

4 X6 t6 u0 [2 s5 ^
    @OldCor:
; k, I2 b! z% ~) f) N( b
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值
' u- ~. v+ Q# F+ Q4 z( s# {
    end
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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