游客您好
  • 点击联系客服

    在线时间: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 y% O8 t: `! c$ L( u' S% B# B, C4 J) z
编写需求条件:7 B- W4 Q2 U0 G7 ]: N

  y4 y- e; a  J    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)
& o) ^/ X, I% ^% h
( v2 Q. e5 t  i; Q- q  j$ _
; n" U* m* R3 q4 ]5 q" ?编写过程: A  n, n: [' o+ ^% ]
7 C7 G6 U$ U; a0 J
1:
/ R% _4 \5 @! \  F* k8 _- q1 v/ J
/ Z4 l) c% ]) x0 G- z    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面
+ j: R$ p- j8 Y! \. ?2 e$ ?
5 z) F" T9 |) w3 g
0 z$ h& x; T4 m, ?# }2:
. b% L' V: S- F- |* G  B# v+ [
/ c$ r8 N6 W1 f; b. Z    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序
% K5 T9 u8 c/ l8 A% @- {6 Y( `; h+ c4 }6 B; T$ s
    启动客户端进入游戏(后面要用客户端)7 [/ e" N1 V9 z! o" c' s

7 Z( G) A- F5 p. `( D  `, T    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe! V$ e0 r6 o( M4 `. w0 f+ _/ ]
4 x  p4 x9 e4 Q, J2 @
    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序 : N9 X1 u  B0 N. _, W: }8 a" }

2 J+ d1 j# a: d$ n    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到
* w/ |9 B" h" B& Y
, ~  C  d: W" L7 Z& V  D& T7 I    od停在
+ `3 q- E/ F2 X) D+ X/ a: p. }& @  }
    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "
) Y9 Z  m6 ]. [! m2 ^0 f' K' k; s/ z1 ]7 M
    双击这一行 再次看到od定位在汇编代码显示页面  O8 @' t& o6 e5 r: x; t
1 f0 S$ C9 L# D+ g
8 ]9 k; v8 d( }/ F* y* i
        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: "
9 a5 D  {- k6 F" I8 p        0052A0CC   .  E8 C7A5EDFF   call    00404698                                7 c2 @0 |6 E6 a" P9 r7 t% h' n
        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容9 K' d, E5 n+ X% ^; T, K- A% E
        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用8 l# Q1 e7 ~8 h* B. q0 ~; D$ t
        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        4 N; j" T/ A; b) ]% C
        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB8
; V6 d% a6 w# {; N1 u  D* R0 \# b% B8 \, H
    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????
! y# G1 u8 u( a0 T) D   
0 b, V* F1 |6 ?/ Z. n6 h# M& `    这时od会被中断, 断在刚才下的断点处, 这时按下F8 1 J5 w- R3 q. h. {4 t  Z
/ W2 I5 H9 X# ], x: V) x) v
    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩
$ P. t2 W+ [2 G7 g. `$ Z
& R8 q. `3 U+ m! ?$ k* O    同时发送数据给客户端' i' g6 X3 G! @6 W
; {- G2 X9 ?( I5 @
   
$ V( }" I/ |5 W    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过3 {! }  P) z2 V0 b5 @; ^
  
4 e# w8 u9 F/ V% {        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)7 d3 r. x# O2 c, i0 ]5 ^2 A, X) i" w
        0053BBFF  |.  0F87 41020000 ja      0053BE46: I  p& t4 V# k/ L5 S# ~; r

8 V8 F8 B1 A/ Z5 k' ^( O7 F    eax 这里是3 一路F8比较下去到下面这里  O# m: J0 k7 ^

% \1 z  ]/ Z/ q: K5 S        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC
# f' Y9 q9 \2 U3 B- k! I        0053BCDD  |.  66:BA 1F00    mov     dx, 1F9 `$ l* R7 @' U7 U. {
        0053BCE1  |.  66:B8 1F00    mov     ax, 1F5 r0 L% `+ g' @3 q
        0053BCE5  |.  E8 EA54F2FF   call    004611D4
* \6 }/ t3 \1 K
. \. j/ j- y3 Q; Q# d- s: C    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数
: @; t5 e8 k5 ?( I0 s   
9 s. C/ T$ T" n7 `5 w1 I' h    call    004611D4  就是调用 winrgb0 v$ n* A0 |, d

, y0 a# O9 N& F2 y1 H, L
- Q& V" i) a2 u# D& w) g, x, o6 u上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
- F- M; x3 M# ?: Q) C+ O
" ?2 _4 u* U& w5 s3 M* H
    dll里面进行内存地址读写7 j6 J& y  s) j; P7 h! S3 B

! h* Z8 \: L& E& O2 j- g
    我是在
7 t6 N  p  ~& g9 c4 \) R7 P( m0 P
   
7 P7 |3 i, ^7 Y
    0053BBFF  |. /0F87 41020000     ja      0053BE46
3 S: x7 E5 }, t' w

; J5 {4 P4 \  F/ @, y
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写; f  w# {; d6 D7 O3 N' N

- A- Q/ j7 \# Q
    procedure InitDll();" f/ s7 i! g+ Q" D$ W8 p/ D) _
    var
& j" }2 G4 |- `0 }6 X* P
      p: Dword;
2 e/ q* L& K1 M' \/ x
    begin
* ?' k- U9 S6 m0 o. Z9 f& a5 K) a
      p := $0053BBFF + 1;
& N2 v- \# |8 Y) z& X) z; z7 a# G
      PDword(p)^ := Dword(@proc_0053BBFF);
& k( Y7 \, R0 ~5 c+ N6 z
    end;8 f! {; D: Y& ^8 ~! p$ W

" _- r) ?9 x" J3 V' G/ m: `* ~
    在自己的代码里面写一个色彩增加的函数判断比如& W% i% h+ O: g) c1 `# p
1 O8 R4 w& @# Y- J" \5 |& |( W
    delphi代码:( l$ l) p8 t5 x! T: `. A7 `
" Y( t5 [0 i8 ^( ^
    var- ?0 r& A8 J  ~4 S3 }, j
      EndAddr1_0053BBFF : Dword = $004F470C;
. r& t; {3 v! j! m* k
      EndAddr2_0053BBFF : Dword = $004F44CB;
( D" L* M$ u+ X. J  |( K9 N0 s7 F
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转  h- H. t# ?9 v/ J% T3 i
. w; W- C1 V+ H* L
   CallAddr1_0053BBFF : Dword = $004611D4;. M! z& r  Y/ ^( s* n- H
      CallAddr2_0053BBFF : Dword = $004611D4;
7 b; ~  M  }$ u# n( ]/ K) B

: `) M% i" L% T0 [
    procedure proc_0053BBFF();  S: y+ Y% I& L, H
    asm. G1 f$ L' a& I4 a: M8 Z) Y
      cmp     eax, $10                        //与预先设定的 最大17比较
- b& }& Z+ m7 x
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值- Y# v1 R- K$ W4 }9 ]7 k1 c4 `
. d' c& J6 @& f
      cmp     eax, $10                        //比较是否等于16
2 C: U: D, O( A5 Z6 J
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分, r/ r( A: y+ P. I; B1 _

0 r9 h/ N- Q  }
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试" Q% w0 V  N7 G+ Z/ B) t
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
0 V2 d( r: p9 I# h8 {
      mov     ax, $A
: K% L  @2 d$ |) O2 d2 I7 ]
      call    CallAddr1_0053BBFF* A9 F" g& I' a
      mov     edx, dword ptr [ebp-$14]
0 `2 ~5 h" G2 N2 I+ f
      mov     word ptr [edx+1], ax  D/ q3 V2 E4 p5 Y6 B8 f" [

, e; U" E0 X: O& G( A, u4 C0 h
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试0 Z2 J! e! E9 d$ x# Z; E9 ~
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
; G+ C! X1 Y$ e
      mov     ax, $10
5 i* [/ \4 |) s) V
      call    CallAddr2_0053BBFF6 R4 V& M, o- F8 }9 h
      mov     edx, dword ptr [ebp-$14]
: r. ?( o# h8 Z# P; G
      mov     word ptr [edx+3], ax
0 R0 e! M7 e* k
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
9 P8 v" m8 U6 N0 n* h" G9 f7 g5 m% W6 Y
  C- _# T& k% t  [. K- t
    @Seventh:+ y3 J- b+ k% H$ K8 ]; c1 r
      cmp     eax, $11                        //比较是否等于17
  K/ ]) J. j5 @' b7 x
      jnz     @out                            //不等于就跳转到默认部分$ n3 T. J; w/ H) Z' F( n) H6 ?" G

+ L, F" t) R& y
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
6 L' m7 |5 l1 u4 S( X
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
: z" u; U- h( t4 Y+ m. D' i
      mov     ax, $A4 \# J9 @+ A2 B: Y" e
      call    CallAddr1_0053BBFF
! \: s8 M% u) Q6 P/ [
      mov     edx, dword ptr [ebp-$14]
( M# T8 I0 l6 A
      mov     word ptr [edx+1], ax% I* R, i! I& Q8 V5 f% s

, s* j' b2 m* j" I4 ~! A6 l, w
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试. t9 [5 T2 Z/ i% I: n2 c" V
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF( H7 A" Q  O. L, ~* y  K
      mov     ax, $10
  _5 ?% _" `& g2 I3 j/ J8 M
      call    CallAddr2_0053BBFF
; L- f0 T) R  ~9 R& I% M+ O
      mov     edx, dword ptr [ebp-$14]
4 f0 B' v0 H. M; v( e$ w7 f
      mov     word ptr [edx+3], ax
& [( U( _5 L  c2 ]
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs/ q$ j' M9 F3 l9 J5 x1 w  ^& z# l
                                               //- b4 h/ w  T3 {6 d
    @out:& r0 Q- k: d7 d% w5 Q, l+ N; S6 P
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点" }+ N( }' ?& B5 C

1 e" Y( ^2 I# H: E6 ^
    @OldCor:
$ ~1 ]. v9 n& Y/ [4 Z
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值, V" y) F* _  I1 t/ H
    end
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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