游客您好
  • 点击联系客服

    在线时间: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 编辑
# w2 {6 _  O7 ?3 p& e
6 h. T! Q! x( Q& _: ?$ b
编写需求条件:
2 x% G0 ?3 M) E6 @+ H; @& I2 [# n+ L4 ~* j
    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++). ~9 \: s' ^+ r3 l6 @# D1 S' s
2 w1 z/ T, h4 t

9 ~( W4 c. }( W0 P% I( t编写过程
" B) j; a, p  P, @( G2 h/ `7 `3 B/ y: L+ J, \6 J, P6 @+ }
1:  D# w# I. l& T4 k/ j

5 Y' H* W2 j# g$ Z    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面' M/ R7 e- g* m1 e% g6 `, h
: o! l1 u3 d* E

# ?$ P. o5 ~) P: i1 J2:/ S% R9 S3 Q- h! t$ \2 K

  u, G! @4 c1 F    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序/ _0 k+ E5 D( }1 W8 b. J; p

( j- z  |7 l) U. `0 Y9 N    启动客户端进入游戏(后面要用客户端); u5 M* l# |# @7 l; i, S

6 }- t( F2 m& y- @    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
' M/ h* \9 ]0 ?9 d
7 ?2 |- v! E6 B; [    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序 6 E9 m6 T8 f- b/ m) C% }1 R( ^$ P
% Y! }- o% e' y3 _+ B4 ?1 o
    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到' `' D0 J& p" T3 t/ o; m
# Y+ q/ U& v$ o5 H2 K1 N
    od停在2 a4 b  o4 R% x9 a
6 r# ^% P0 B; e- V8 B) r- R
    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "
, G9 [7 x' p2 N8 M
$ a5 Z! d5 r! h, |# U7 r    双击这一行 再次看到od定位在汇编代码显示页面' w$ G" R" Y% }" W; v  ?+ c8 V

, q1 A3 e' X! R$ T5 I; T. ^& z3 J, e" J4 f$ O6 U& q7 A
        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: " 6 }' T3 V. M3 A
        0052A0CC   .  E8 C7A5EDFF   call    00404698                                
- R1 G/ ~0 k9 E9 Z4 o        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容
+ L) k' `* m( W6 R& {        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用
5 _7 o/ g2 }6 F        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        8 `8 }% k/ Y; s8 {. `  p
        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB86 @; s8 W# @7 n- z/ O+ C& V3 h

' V6 w! k/ ~4 L% i% ^    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????. N- r2 \: x& y- f5 F. ]
   
) R" R9 H. Z3 i% p) ?# [    这时od会被中断, 断在刚才下的断点处, 这时按下F8 + f# e+ O% F: m/ c: @. ~5 A
" {' c- d; c0 r6 b/ z' e, @' M
    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩7 O3 ?% v2 j% V1 ]9 j

# H" l( m* Y% x3 h, h    同时发送数据给客户端  ]! `0 z; l/ q6 [8 i

% n/ ?4 @; A2 P& N8 s8 n    8 q' e+ l8 h5 r
    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过+ ?2 j" s; i. [1 r" [
  8 r" X1 B, ?% F! F3 e
        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F). G; h: C* Q( d3 O
        0053BBFF  |.  0F87 41020000 ja      0053BE46
6 o2 L% U$ ?, C7 u/ ?& ]1 a4 P9 q$ r" J+ z
    eax 这里是3 一路F8比较下去到下面这里5 F7 S: o: M2 v' E* S
+ s, {$ H! L. Z. M
        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC
) O4 a1 L: f+ n3 B        0053BCDD  |.  66:BA 1F00    mov     dx, 1F
$ j+ S# B7 h1 {6 a( I' U- ~+ @        0053BCE1  |.  66:B8 1F00    mov     ax, 1F
7 `7 ?1 x$ x. [6 {/ @        0053BCE5  |.  E8 EA54F2FF   call    004611D4+ S+ [( l3 _* m0 J) Q* q
8 L) M& f# E: E4 D! D0 g
    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数 % i9 q, h1 Z; U: _- y/ [  z5 P+ o
    ! d0 ^1 J8 f: `
    call    004611D4  就是调用 winrgb
  {$ k7 p9 q3 F9 d0 \$ v& x8 H
+ P2 B# X5 R% n. L9 y  f# A/ t
$ z6 n  h; h, j! j上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
, U- B7 p! j( q& M6 Q4 }, {# p
; ~6 `" ?$ ]1 O1 f6 @( G
    dll里面进行内存地址读写6 g  _8 ?! `+ _. `( t$ I
1 h. ^* t' O2 B$ @5 _1 @) b, l( R+ x: W
    我是在0 |9 @' m, ]5 f
   
8 M! J! R0 t2 J) T9 P, |
    0053BBFF  |. /0F87 41020000     ja      0053BE46$ M7 r- j: c# w4 \1 Y
! V# }0 j+ Y$ G1 m8 m% R
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写+ i/ S4 @* `+ l/ a" q6 I0 f
' p. h0 }- i! E  `( r
    procedure InitDll();; |6 Q# \$ O9 \0 \
    var! X- ]! `# f0 I/ ^( I- l5 A/ ^
      p: Dword;3 `7 d( n- Q9 K- ~  F" e
    begin, ~7 u; z. r( O% m1 m
      p := $0053BBFF + 1;- t7 T9 S- U4 D  k8 z% X  [1 e% z, j
      PDword(p)^ := Dword(@proc_0053BBFF);
( K  C2 `# X5 b$ g3 I% r
    end;3 A7 h4 I! T" O1 O$ f
5 k) ^: L0 K$ i; Z$ y9 p/ j! I1 I: P
    在自己的代码里面写一个色彩增加的函数判断比如) P% Y; }; a0 }( E

( b4 S: Z. @2 G- ~6 a- q
    delphi代码:
6 w% _" P2 b' h/ S

; u" a0 }% M7 z4 I$ y6 d+ m
    var9 c: y8 Q2 d: i% o9 v( T  E1 x; R
      EndAddr1_0053BBFF : Dword = $004F470C;6 e: e. C0 y6 C3 G, `- R9 V& ]3 Q
      EndAddr2_0053BBFF : Dword = $004F44CB;* O; M, w2 [* Q& V3 \* n0 i
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转
3 I0 P6 V* L9 ~  c% [

% x( w8 T" f- l' F2 {% P( p. ~
   CallAddr1_0053BBFF : Dword = $004611D4;2 o! S- b% x. n! f
      CallAddr2_0053BBFF : Dword = $004611D4;
$ @  `! ^6 A. a( x2 g% @

7 N, e3 F- ^' Q2 N' x
    procedure proc_0053BBFF();
  t3 ^4 \/ u" g- t; R0 r
    asm9 Z- x; ?( c7 d1 j3 W
      cmp     eax, $10                        //与预先设定的 最大17比较
5 b' g& P2 h3 q% l4 ]# ]
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值6 `4 C: I& h1 T; A. O* j# M

; O0 E! {5 M9 {2 ~
      cmp     eax, $10                        //比较是否等于16
/ {! \, D; o: r6 ?* q. p6 M6 ~- @, y& O
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分
; i0 J9 ]. ]% {( u" D# L, [
! n) L( ~" k  c
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试' _& s& p9 G. x3 L0 b
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
/ A6 l# N7 Z" ^/ d* w
      mov     ax, $A0 r- C& K9 m) w/ u8 p: }
      call    CallAddr1_0053BBFF" N. u1 w; H5 P
      mov     edx, dword ptr [ebp-$14]1 w. Z9 p1 f8 Q2 |& I2 j9 ]1 D
      mov     word ptr [edx+1], ax
: w3 [$ P& D9 `  ^' d$ V  r
) P4 R! K$ _& W, I7 u* T3 {' r
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试2 n: [- ?& @, |  j+ G  l4 [
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
1 r' w4 \* h! o# Y
      mov     ax, $10
/ |) H2 b5 Z- V4 W1 u% N
      call    CallAddr2_0053BBFF
$ Z2 s) b0 c9 ~8 ~: Z
      mov     edx, dword ptr [ebp-$14]
" a7 T  E4 b2 q3 ?8 v
      mov     word ptr [edx+3], ax$ A- f  L2 t2 \
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
+ u$ {4 D, z1 S1 ?

+ L/ W4 q2 z9 c8 Q7 U2 I
    @Seventh:
$ C( v$ U2 x7 R8 V. k2 Z4 D( h4 {
      cmp     eax, $11                        //比较是否等于17
9 w. p0 Z2 C% L/ |  h) [- ]
      jnz     @out                            //不等于就跳转到默认部分2 M4 [9 u! x/ Y) z0 x
; F& B' R& w- X/ K- }; p5 \
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
5 h8 x6 y6 k: N: e
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF3 F( L* |2 \' N9 j
      mov     ax, $A
2 V0 J2 O6 I7 ~/ f" G2 @
      call    CallAddr1_0053BBFF* |0 q+ p# s( S% C& P4 b5 [
      mov     edx, dword ptr [ebp-$14]
7 S/ f: t( x& {! q0 I6 p* ?
      mov     word ptr [edx+1], ax+ r& ^5 z7 A5 T. i  s" j
2 ~, L/ ^$ n% q6 k0 N6 H) C
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试$ ^( a7 {! n1 L( w( k, v3 o
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF5 ]  {# e% A  `3 ~2 ^; a
      mov     ax, $10
) K7 v' E' I3 w! t
      call    CallAddr2_0053BBFF* w3 ~; M9 {  o7 q
      mov     edx, dword ptr [ebp-$14]" {" [, e; }# @4 d3 y! U
      mov     word ptr [edx+3], ax  M  z5 `* h* E: s2 j0 P, p
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
; Q! q# [+ K3 L5 [0 N( I9 a/ P
                                               //' H0 _/ T) N! ~! w- p* K
    @out:5 e5 J' D; N" L6 ]
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点% i$ V* J4 G4 ]- L5 \- N* t; L+ Q# O

8 y6 E+ `, q" ^( Z2 c
    @OldCor:
1 h' d) D* |  j4 E( b& [
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值
: v1 J; J, U6 {$ V9 B$ n& k  Z
    end
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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