游客您好
  • 点击联系客服

    在线时间: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 编辑 9 x. P5 W2 C3 r
6 U5 O. e3 b* M- o
编写需求条件:5 i9 [4 u7 x; V/ O
, |- P) ?1 _  w1 Q
    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)" U, B/ p3 T, {5 g* t) ~1 C, O$ A0 w
& @# d& ^" M$ }$ f
3 \+ l; K$ W) C, W) `4 U/ A
编写过程
. A  i* M8 b8 S$ H) B. [) W/ e  T  r; X& V5 o. |/ n
1:, ?* ~% F+ Q. s1 h6 s7 c
% y% ?% r. K; M/ Z
    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面# e# ?: ^, Z. V

9 z* b9 g- P: r: V5 v) `" x- V* b: Y7 K, W
2:- |/ \) I2 v% t0 K& }6 |* N

3 d0 l  `$ `; D) E, h! u    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序/ i, v" J: t8 o
( L3 k% m  A4 E+ Z. ~$ p
    启动客户端进入游戏(后面要用客户端)+ q9 B4 c0 r% f3 t. }

% O  O6 `2 n3 p/ Q5 V: S! l2 a    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
& j3 E7 S! Q/ F. q- O! T- q4 G
2 j! x* B: ~2 F! v' W7 K    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序 . ]+ q- p% I" d0 {0 s

/ g& h# \8 ^: u  v0 L# U" L    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到  B9 P6 a  M7 j- q& S
7 ]# O- w$ Q) ]
    od停在
% I/ W4 K/ A4 r. u: S$ M" ^/ [# q* |1 W$ o$ e, o* W
    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "
* q1 e* N0 h/ m# s' r. b
4 {% ^  D, T1 b* {" g- N0 l  C, O    双击这一行 再次看到od定位在汇编代码显示页面+ m. M' z+ j! q

! L2 e8 ^; ^( S% D, m2 o9 i1 x8 \& ]8 `" J1 c; ]. A
        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: "
2 {' T3 a; h8 h1 m1 h; P        0052A0CC   .  E8 C7A5EDFF   call    00404698                                
0 y' ^8 e+ T# o- y7 q) @        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容
9 T4 Q' A- [" `4 @0 J0 z        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用
! N) T6 H. x! |$ v# V; Q( z7 X& T% {- |. E        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        
; \+ c- _1 c* t7 v        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB8
6 {0 r; l# M, L4 m. \3 W" B3 j$ I: W6 A* K- A/ s
    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????+ H* G: o  ^3 X3 u  n% u; W
   
% H: N' G5 j* k; w* Z    这时od会被中断, 断在刚才下的断点处, 这时按下F8 . z" V6 s- _8 ~3 Q' q, q" o; a0 ]

  l& g. N) r1 j6 Y1 F" y    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩
- w$ I' @/ F; q+ f" i" c" A4 a' c- z/ y6 {6 [1 m8 a
    同时发送数据给客户端$ a  r9 R# H6 {4 S" ?" _3 ?# A5 s. X
1 A0 h1 e7 A5 y+ o/ a" X" _
    ' K3 P  k7 @, y' \( t
    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过9 R$ {, t7 }. b$ ?2 M5 ?- v
  - j1 A  N* J* f
        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)
3 {  X! y/ }. Q6 @4 J$ `( z, l        0053BBFF  |.  0F87 41020000 ja      0053BE46
) P  M% D5 n5 d: d
: W, g0 o: g1 @1 D3 k    eax 这里是3 一路F8比较下去到下面这里
- |5 X& ?1 F0 @( X
# Q6 P1 T3 _5 d" ^+ @        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC" q2 Q' G2 K/ P9 R9 q+ x
        0053BCDD  |.  66:BA 1F00    mov     dx, 1F1 ^7 R% ]  K' J: e7 X9 r6 ?+ V
        0053BCE1  |.  66:B8 1F00    mov     ax, 1F& r' H6 Y! t) H/ ^
        0053BCE5  |.  E8 EA54F2FF   call    004611D4' o5 I8 k# T2 n4 v1 V$ x$ S
, A, M7 _5 W! l
    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数 & w7 _9 [9 F; B& r0 t1 I3 h
    / ~4 C" |. s# e! R6 f* F
    call    004611D4  就是调用 winrgb
4 _9 T! @5 y# h$ n( o. B0 _! S6 x0 v+ g+ Y
+ C4 u% j. j# J7 v4 K' a
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
& u. r! ~9 p# i( y6 a* Y6 E
2 |9 w0 D( F' ]; I0 J2 v# l
    dll里面进行内存地址读写
8 ]+ A) l/ ]2 t% f

6 P# a& k9 S& I; X* A
    我是在
. V, G5 [3 O3 o& x+ Z9 n
   1 t, j- M. M$ H7 m" E! |
    0053BBFF  |. /0F87 41020000     ja      0053BE46
& d3 ?! i9 A, m1 U* o# X
- v* S; A9 A. Q) d  \% g8 q
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写1 l) r& I: I# ^/ R

  F+ E: U$ I& H$ G
    procedure InitDll();
: H$ T% w8 Z2 t6 l1 e+ ~, \' P/ ?
    var2 V9 h  d5 a; n4 {
      p: Dword;
' {8 X/ z5 N' f0 x' j. u$ s
    begin* |6 n8 G" s" o, |+ ?" E
      p := $0053BBFF + 1;
) ~. x1 ]. f. |, f2 t" ^
      PDword(p)^ := Dword(@proc_0053BBFF);$ i% y& B$ o: p% T6 q# M& d
    end;
8 W" A; k  t; w  W. s

& i0 q3 z/ J" J
    在自己的代码里面写一个色彩增加的函数判断比如
1 P* w9 j$ U+ `) V* {" B

$ H; f% Z; t$ n2 I6 m7 Z6 d
    delphi代码:! D$ |7 w; Y8 d3 _  v3 p

1 B" l5 k+ l/ I9 H% F3 x5 ]
    var
$ m; ^0 ]$ H; ^0 X5 I
      EndAddr1_0053BBFF : Dword = $004F470C;+ A2 S$ n1 C+ K! {8 N
      EndAddr2_0053BBFF : Dword = $004F44CB;' ?5 |6 x3 V7 n6 U; i$ E2 s
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转
' q& b! B! p" j, F

/ g. G; B% w: z$ k' F1 B' X
   CallAddr1_0053BBFF : Dword = $004611D4;
+ o6 i* L+ k# u* k
      CallAddr2_0053BBFF : Dword = $004611D4;
  C4 `# t2 x- J! p% C% s1 a% v
6 t, q) O4 V. |0 E, }- X& I5 x
    procedure proc_0053BBFF();
3 j+ B  q" [$ j9 j/ L& N# V  F/ B/ m
    asm
+ ]% [) B, L9 P' C+ w3 n
      cmp     eax, $10                        //与预先设定的 最大17比较- q) r& F+ U2 S3 N% N
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值  [: c( W6 z! H' Z5 q% A
5 e+ {, X2 i4 j6 b' o2 ?
      cmp     eax, $10                        //比较是否等于16; Y8 w% K( u- L! s3 w
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分# {) E1 ^2 c4 k8 ?
6 G$ A% ]7 \9 I& P- o
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
1 i- D6 @8 a8 F) j3 e4 R; j9 `
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
1 R; p8 e- G+ P8 V9 O0 Y8 g4 b
      mov     ax, $A
9 i. m' F! o" ^# y$ b
      call    CallAddr1_0053BBFF
, z3 K. J0 g  W: r) W. Y
      mov     edx, dword ptr [ebp-$14]
1 T! z" `0 r& C' a9 l
      mov     word ptr [edx+1], ax7 h- V3 _& c; Z( [' x

) d* }& _2 h( C) p
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试4 p: _1 q$ x# \  I9 Y
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF! Q$ s; M! a# c( g
      mov     ax, $10* I( H2 x% m1 D
      call    CallAddr2_0053BBFF
( ]- x6 z* p5 |. [4 c
      mov     edx, dword ptr [ebp-$14]
, t- @* W7 [) `2 `
      mov     word ptr [edx+3], ax
0 G" L+ k' ~% c! \6 F
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
2 a. m! e( T& ?
4 z, }; N% ?9 p9 ?6 [
    @Seventh:2 Z2 o7 Y5 ^& F; P3 T8 V
      cmp     eax, $11                        //比较是否等于170 {4 l6 u* K9 U. C' y+ R6 u
      jnz     @out                            //不等于就跳转到默认部分/ d) z+ n7 i: g* [

( H8 [9 h; K4 _' C
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试7 H7 l7 o' C( ^! v) b4 U: c" w+ N
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
  A# Q. y' }! N9 C( ~) @1 E' D% J
      mov     ax, $A
! C) n" d/ ]9 d4 V# Q+ K
      call    CallAddr1_0053BBFF
# X3 S7 |' K* C
      mov     edx, dword ptr [ebp-$14]# F+ P0 ^: `3 [( ~2 m/ P
      mov     word ptr [edx+1], ax7 l8 e: \  [+ e  w" _- |) _

3 Y5 H; u: Z# t* g* U& w
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试3 O) w2 w! M+ ~" S
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF. m$ c4 t  Y9 U
      mov     ax, $10
: [3 Z/ R0 n( M2 F$ ~+ G4 X  k
      call    CallAddr2_0053BBFF
& a9 ~5 a/ E9 Y: d0 k
      mov     edx, dword ptr [ebp-$14]
- c! S! g1 _4 u" x5 H/ a) i- {
      mov     word ptr [edx+3], ax4 l; s+ G1 |. c3 s* h0 U/ f8 {  Q
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
9 M/ k- G- l) V7 ]7 E0 U6 S' i
                                               //, W; B, y# G# ?3 L
    @out:7 T. g# O7 Y' y) Z8 ^
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点9 L2 \/ q6 f, b

; \4 K$ F% o( J/ [* f; b4 h& A
    @OldCor:% N6 o, S5 y, t2 S) ^9 N/ z, {0 Y  p8 d
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值
& \' I- v+ C1 j9 q/ ~! Q; R
    end
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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