游客您好
  • 点击联系客服

    在线时间: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 编辑 # @) D( t$ x* _5 t5 o% x

. o1 b; [/ ]3 r* Q
编写需求条件:
' e8 s, ~' w! G+ S: u; {
1 T. R8 b5 G: C* e    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++), _9 s- e- Y( h" ?+ U/ ^/ _4 B% E

" c$ g, }, n" p% I& \* ^& |" s4 a' \1 X2 ]' N( m7 K
编写过程9 W' ]: {+ u' C( ?  o  ?' m. Y7 ~5 M
4 a! O4 W) N8 q1 E4 y( J, P7 D
1:
" e$ z4 w6 C! Z  J6 m% t4 e+ B; w9 s+ S, G( x2 l7 V
    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面
/ g: Z/ A; S6 \, F% k+ A3 m  M# C9 Y, J$ a

' \8 W5 A) b) @. ]5 Y2:, L6 M! F% P7 l1 Y, T6 Z+ G

( e0 N3 U( C+ ~; z. q" f    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序
3 I- C$ n, z" a9 X+ n7 N6 ^
$ d) {/ Z0 t# t. k  ]1 _# U) S    启动客户端进入游戏(后面要用客户端)
* Y) h+ i" D4 J: n$ G. [+ W
6 C. B. ]' x3 J1 N- |# L( C7 Q  D    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
" i9 R# |3 s: U/ ^4 b: G7 c+ \( z; i6 U5 m! \9 E2 t
    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序
1 l# P4 T7 t' i" Z# Z
) e& M+ I; d8 `1 J% P. k    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到
% z; W+ R- E! E# f/ z( g
% Y1 V* g! W# j    od停在
5 A; u  s. R' A! \/ p
* V+ V+ j1 z8 a; a. O0 x6 A0 F    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "- I# u5 s  Y) r4 C: U" s

5 F4 g1 f* e# q8 G# j: O    双击这一行 再次看到od定位在汇编代码显示页面
! S( x) z; d' G" J$ d5 I; C
; f, k5 }6 W, l* P
' A+ W" t, {, F& Q) e        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: " + T9 q! m5 p+ G: R* r" y. X
        0052A0CC   .  E8 C7A5EDFF   call    00404698                                + H# y% _5 V4 m0 }3 u" p; D6 W) ]! s% |
        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容# _3 F$ |9 d( }0 l! n$ c
        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用' R" @$ m$ O. p
        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        
# o9 A) i7 z  G4 ~        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB8& S* X# \$ v; `1 ~
+ E. n: m- H" `3 q
    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????$ J# F2 m$ d! G" I9 n, `' L" d. z' E
   
7 i$ [5 |# m2 J) }$ I  b5 a    这时od会被中断, 断在刚才下的断点处, 这时按下F8
$ w9 x+ Q  G' A" d
" ?  c8 `2 D- F4 M8 }    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩3 f/ e- K9 }$ d1 g, c
$ M+ _! g- x) U; S' @# r; X* {
    同时发送数据给客户端1 O: y. w2 c3 ~6 G1 a$ j2 G/ A
9 I  P! B3 C. \4 m. H
    7 p9 |, _) y- m
    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过( }1 n, V9 \9 ~) B2 W3 M, r% |
  ( N5 B- s7 E2 C  d1 l
        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)4 H# d5 |% s) R% o( I6 \/ t
        0053BBFF  |.  0F87 41020000 ja      0053BE46& p) I& W1 S$ k! l5 e6 [* s* @
8 j9 Y8 I3 _4 Y" p& y6 O0 j
    eax 这里是3 一路F8比较下去到下面这里! U) D7 j% W+ z8 _# q$ \
! B; U2 C6 u7 i% j5 j7 K" S
        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC
* ^: b! ^0 ~1 x( s8 M+ k. n) l        0053BCDD  |.  66:BA 1F00    mov     dx, 1F
0 Y, [0 }6 y1 H3 R# U7 }        0053BCE1  |.  66:B8 1F00    mov     ax, 1F* r* K/ U! u% ?4 e3 Q
        0053BCE5  |.  E8 EA54F2FF   call    004611D4( h/ w' F( [* H
9 ^/ ?# i/ W# q  s' L
    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数 " s+ x  \" o0 F# _. M
   
. G$ A2 \6 o; I0 u% r5 U# l: h    call    004611D4  就是调用 winrgb
' R: t; U& ]4 Y3 s  F) G1 M  t- d/ D, f- O, g2 Y) u0 G
1 Z0 @1 v1 {5 v
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
5 r4 A7 \4 z  X6 m
! r8 `2 O8 Y$ T
    dll里面进行内存地址读写9 v5 D- S( O# R
! E3 y/ e3 e7 \' z6 C4 P
    我是在! m$ p% w5 z8 N' A( h
   5 r, B) k3 q- q' r8 m! o! a9 n2 s: N
    0053BBFF  |. /0F87 41020000     ja      0053BE46
' j$ V: ^1 e7 c( M- M5 m1 ^; q8 S6 m& g
: R' P2 x9 N& b* p0 f
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写& Y, q6 F- w8 Q& J% o9 Q! `+ u

3 Z5 l$ G+ h1 p' w, C3 w
    procedure InitDll();
! [' d* J, n0 W& L: g. R* ^
    var
. J: K; C+ N9 {0 X: q( q
      p: Dword;
+ W1 E; [9 s' [; m& s- G
    begin
: `& C8 V3 f& }: O# Y9 X
      p := $0053BBFF + 1;
' A2 f, P& _) P9 O8 ^( Y  ~+ S
      PDword(p)^ := Dword(@proc_0053BBFF);) P8 m# U' Y' U2 N8 J' C3 m) y
    end;
: v2 ~0 m! A# B& Z6 o" S

8 M4 o1 Y7 G! J6 n; ~$ I) `% S
    在自己的代码里面写一个色彩增加的函数判断比如3 H* }8 N, K4 F% N, f

$ r3 V$ K$ S+ U) W5 \; ^
    delphi代码:3 z1 v! V$ c! l. Q

% B  p6 o# @8 M' e3 G4 c) T$ V
    var3 g1 K. X2 E9 ]; {0 G
      EndAddr1_0053BBFF : Dword = $004F470C;; b+ V$ }) h- |% g+ i2 u
      EndAddr2_0053BBFF : Dword = $004F44CB;3 G. R, f  `+ h% x9 u' H& N
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转
4 n1 K* z& b* I* j
/ y3 {# S- w) a; _8 v$ f# n
   CallAddr1_0053BBFF : Dword = $004611D4;
  Q; W9 b* C" l1 O/ L4 S
      CallAddr2_0053BBFF : Dword = $004611D4;% W' p* o  A+ j* A3 i+ J
. f! ~6 S5 ^3 ]* e. j
    procedure proc_0053BBFF();
! ~! t) x3 {  Q: w9 Q( _( `
    asm
; {5 r2 J6 R: @1 B+ ^9 c5 y
      cmp     eax, $10                        //与预先设定的 最大17比较$ b. g$ r4 P4 R3 t
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值6 q7 c" `1 H' V4 V# e
4 i1 J: Q9 U( W- u9 C5 Y
      cmp     eax, $10                        //比较是否等于16
  f' k) P+ Z1 Y5 H
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分
5 @4 D, u* W, b! R% y" Y! p# I
. ?+ w  \+ Y5 o; Y6 Z
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
' K5 T. a. w5 K
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
" {+ U- ~6 X% P. l. c9 b4 `
      mov     ax, $A' _5 s; Z' _* E; z& D
      call    CallAddr1_0053BBFF
% L; H  \9 T) u' k) C: @7 V
      mov     edx, dword ptr [ebp-$14]2 \4 z, \1 h9 b+ @
      mov     word ptr [edx+1], ax2 v1 M% i6 F7 F2 a( c" b8 l# G
6 |& K' R, j  t+ C* Y/ @+ e
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
  A& u' b) p+ i; ~' ]- J
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF4 K/ h4 h9 V; O
      mov     ax, $10
3 w6 \9 |6 U+ h3 M8 Z; Z# u
      call    CallAddr2_0053BBFF
8 ?- @& j$ N; h: B# t' P
      mov     edx, dword ptr [ebp-$14]
. q3 e2 A( o/ K' L
      mov     word ptr [edx+3], ax
! s# m# e3 ]4 o3 y4 h
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs0 p- p9 n9 n* ?# J
' D4 F5 v" w$ \0 j/ R8 p1 V% R- g
    @Seventh:6 H" F7 X" o: r4 Z
      cmp     eax, $11                        //比较是否等于17( |- ~4 q( ^/ p( k+ B4 e
      jnz     @out                            //不等于就跳转到默认部分
! @( d! k! Q+ m4 O. i0 ~4 r

( v  w* M- h, O* g6 e* v6 N
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试" C; U- g! J: p
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
5 Y7 F$ @) m0 c5 k* q6 v0 C
      mov     ax, $A
( E/ s# U8 P) J& m9 ?
      call    CallAddr1_0053BBFF6 w& k# A/ n/ f9 C0 T$ i
      mov     edx, dword ptr [ebp-$14]
7 B' I( S9 J  W& S1 G0 S
      mov     word ptr [edx+1], ax8 {# S" ]% u, s! K8 L

, ]8 J+ v" q2 Q3 j; j% W
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
$ Q( N) i3 p; g" \6 v. c
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
3 ?3 M' i! z4 i- f9 }2 F
      mov     ax, $10
9 F. P! y* }/ }. C& J0 [
      call    CallAddr2_0053BBFF
3 F( [2 c  ?3 p( @: k2 Q
      mov     edx, dword ptr [ebp-$14]" ?+ l4 _& b9 K& N* y3 k6 ]* U
      mov     word ptr [edx+3], ax' Z( B, f; F0 s6 Y+ X1 X* g; ]5 W! v/ W
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
1 p4 q) B: r$ e6 l4 s' {1 W
                                               //
( b/ y: c8 x0 E- }: J
    @out:5 b" n+ Z1 X' k' ~, |3 x# o0 h
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点
, Y$ ^2 J- J! {( N, k% J

9 E; E* V9 a/ r1 S( W6 C* C2 o: [: ~$ d
    @OldCor:7 o' V9 q  I( z: q, _
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值! z8 C- g+ f4 y% R. P# U6 A  o$ m
    end
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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