游客您好
  • 点击联系客服

    在线时间: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 编辑
- X! Y+ ~) b) p4 w" h- h! d
! O6 q. `" K5 F
编写需求条件:
; @6 J$ l" ]; e+ C2 G8 q
, A; K' M3 a- ?5 c% _    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)3 ~2 y4 U5 A" e  C- B& r
6 n6 y4 [6 Q  j% p7 C

' {- N) Q- n& X编写过程
% c; K8 j5 N& O0 }, W0 d& G. |& s
9 Z4 G$ z' @% K- D1:7 p3 G2 G8 o3 H: S2 Q

2 X6 [) y- d8 }+ W+ k/ Q" {    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面
) z; g1 S: D4 W9 P7 d$ \6 `; `% o
6 c1 R9 h" H+ G7 Z1 {; X( l% o
2:- o2 w$ i& Y( _

7 S2 Z; ?0 e' V1 m% Z3 t    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序8 L, S! d- d' I( g2 g! c

3 I6 S; n/ [7 w) O7 W5 z' D+ o, Y    启动客户端进入游戏(后面要用客户端)7 `4 B. a8 z& j  Y/ Z# w7 e& i) w; |

9 d( {6 H) u2 {. V    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
1 J$ T. }- H1 f- _! A2 e: t' }: d' _1 j
    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序
% B) D/ w% Y) K7 E3 H' @: W) R6 v1 q+ A' b, T8 D6 m6 J
    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到  m" w# A# u* M; R

5 C! d9 |0 i1 R! O. y9 S8 l    od停在# R3 w8 [* g! Y# ^7 d6 t- p
  w2 c0 Z! W6 J: k4 \1 u+ ]
    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "/ A& c& u) {( g# {) T) S

, ]6 F$ r4 @& A" L! k5 B: u    双击这一行 再次看到od定位在汇编代码显示页面5 M4 _) e) S* `/ R- j0 t

1 Z& h" c3 I6 f4 d6 ]
6 W: X) P* W/ C        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: " - S" J& I0 l. h1 `7 ]
        0052A0CC   .  E8 C7A5EDFF   call    00404698                                
! P  D! Q. H: n6 B2 k  a        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容7 B0 ?* Y6 u; w9 g) J3 z  V) ^, r+ K
        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用
% K; _3 [1 J  ^+ {: p0 c0 r" `        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        
1 P# A/ H3 p; _0 x  R        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB8
8 n  ?7 h- G$ a+ T, ]2 r
! B2 |; i/ v9 s* C, C    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????$ I9 S' c/ r8 P  [0 b4 U
   
( |- [1 s4 C% _    这时od会被中断, 断在刚才下的断点处, 这时按下F8   a; c( @9 ^6 U
9 @: F* q: w, ~& \; L
    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩
" m4 A; K6 T+ I2 P3 S- U4 M) X1 t# p9 m6 _. ?# o( C" G, e
    同时发送数据给客户端
& i& H) c/ |0 a. @7 n) \. {
: `7 K" l" ~( a' E7 y    1 O" y7 s" w% ^& f
    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过
7 l+ b+ t: W& J" B& l  
5 [$ f, z; b+ h, y% |        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)
8 B1 [& Y- m' P% j$ a        0053BBFF  |.  0F87 41020000 ja      0053BE46: F; ~! V% A: o, ?7 g8 V
! h) G' Z5 k6 ?8 t" e) U3 t/ i2 g
    eax 这里是3 一路F8比较下去到下面这里
( K1 V* o, k+ ^& m
" K: i* X( I( T+ R        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC3 N/ Q6 H5 x" C" {6 z
        0053BCDD  |.  66:BA 1F00    mov     dx, 1F
; `$ \' b6 n5 X$ P7 t* q, M        0053BCE1  |.  66:B8 1F00    mov     ax, 1F, l# |, ^9 R! w9 U
        0053BCE5  |.  E8 EA54F2FF   call    004611D4! p, E+ \3 R% ~# A6 |; N* [
2 t9 k6 B* c- \3 h$ g
    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数
! ]5 }+ e/ q  V" g( x8 u' _    / K. j8 N) e- m4 q6 ]
    call    004611D4  就是调用 winrgb7 j: F: N1 ?, @3 g; m

: e/ N3 {0 v4 h, a
. z8 ]5 g$ {  t& A& h; Z4 m上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
" l5 `$ n: }* d( G0 m( U2 U
0 ?) A2 F, ~$ W% l6 m# S
    dll里面进行内存地址读写
0 ~  w9 U  |, k
" h9 G' D  K8 B9 R
    我是在1 p0 N) P! ]3 t# g
   
; r8 ~2 ~5 H- a8 y. n% R4 G, o+ h6 w
    0053BBFF  |. /0F87 41020000     ja      0053BE46* O/ d# W" P+ n$ B) E6 i6 N. v

+ i% Y' L- o% b5 p/ r+ d& j
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写: }" Q0 k) m8 R' v. f

7 S5 R3 a0 j1 j/ `0 @) z' p
    procedure InitDll();0 Q2 W8 x9 |; F2 S% g( ^: p7 H. t
    var
  ~4 _  y5 q" R: @( ?
      p: Dword;
% e7 ]% |2 u9 F6 [
    begin
1 C& \) {$ k' S( m+ }  S
      p := $0053BBFF + 1;/ Q5 h* [* s# W" Q' b8 [# q* ?! P
      PDword(p)^ := Dword(@proc_0053BBFF);
9 S: I% e" W! Q) I# T- c1 J7 V- E
    end;: |/ u- r" ~! S# r
! _+ H3 X2 Q3 [" o
    在自己的代码里面写一个色彩增加的函数判断比如
7 L4 t2 D+ J, M7 ?
' A7 n# ^( `5 n# i2 n5 ?
    delphi代码:
  v; \% D# H" E# `! R

3 Z6 n* q- T3 t2 y" r0 X
    var
( ]5 a7 R% O5 u6 n- f: D( l) m
      EndAddr1_0053BBFF : Dword = $004F470C;
& F8 M$ G# t5 _1 M* R# `8 R
      EndAddr2_0053BBFF : Dword = $004F44CB;+ q- g2 a# `+ S( X4 b  z
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转) W' b* J" s, J4 H7 a1 ]  f4 }4 L

; c" i4 g, J# X1 ^. v
   CallAddr1_0053BBFF : Dword = $004611D4;
; d( M0 i3 D: D
      CallAddr2_0053BBFF : Dword = $004611D4;1 a7 ^7 ~- ?. I
* a# Q0 s5 k& w
    procedure proc_0053BBFF();
( y4 x9 Z; T: K4 d; ?
    asm
; n9 \: U, u* m; I: l
      cmp     eax, $10                        //与预先设定的 最大17比较2 ], F6 f+ P2 X! w- k# B7 H% M; J; h
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值
7 L; G1 E7 h% M# F% B, f2 `

* y8 O% |, V  s+ M% y; u1 L2 f
      cmp     eax, $10                        //比较是否等于162 J( ], @# @  _9 R& R1 Y- D; j
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分
; b' G( z, [8 V8 Q" X; u
2 v# h2 y( B+ _5 F
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
2 u. k0 b3 u, K
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
! z4 j" z$ `' A( c* q
      mov     ax, $A# E% \& `+ `6 E( p9 _' H; I5 z- ?
      call    CallAddr1_0053BBFF) [0 M6 I4 e) m
      mov     edx, dword ptr [ebp-$14]$ P7 ]" @1 t; T; ~3 y+ G- W
      mov     word ptr [edx+1], ax6 Z" H) C* x9 I
' e# C+ m3 R) w' T
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试. `8 @$ K0 T( W
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
- C/ A' o1 {& {3 a& N
      mov     ax, $104 x' P) ]: H% X4 F& Y8 W1 ?# {
      call    CallAddr2_0053BBFF4 A" |7 b. B/ E6 u8 K  x* _( o
      mov     edx, dword ptr [ebp-$14]
4 E5 f4 T$ W' _  z- }
      mov     word ptr [edx+3], ax
/ A. C' W! p' m' Z7 q2 i
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
( K  A2 V4 ?4 z) n2 V
( S6 ~/ G% x2 {5 b8 K# H3 |
    @Seventh:: q+ ]+ M6 p! \3 G
      cmp     eax, $11                        //比较是否等于17& V" \  p" f8 A0 m! I& Q
      jnz     @out                            //不等于就跳转到默认部分
: `$ w+ g0 h- L. z- S9 G. ?
$ j/ s3 O# a0 I3 O
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
& S/ [9 U  J/ S/ D
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF( T& U; `7 l4 V) G2 s4 m
      mov     ax, $A2 R$ y+ ~/ X3 \2 X( H' m2 J6 @0 K
      call    CallAddr1_0053BBFF( g& u  p( @2 k* ?
      mov     edx, dword ptr [ebp-$14]; D" ^+ B3 o' g* B4 \+ T
      mov     word ptr [edx+1], ax
5 Z1 Q4 v5 V7 g+ W8 j; n$ g7 Y# M

7 n' H7 u% P* U$ B1 S. Z
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
) B/ z$ A8 I' a5 l; f4 u
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF8 B' f5 X: M! u) {5 ^# Q) R" F
      mov     ax, $10
, j/ r2 J; `* u* {4 ]
      call    CallAddr2_0053BBFF/ I* W" O" O1 n4 z' f" T; e$ I
      mov     edx, dword ptr [ebp-$14]
0 U5 p/ n6 G, |
      mov     word ptr [edx+3], ax
# H, b( f9 O3 i. q1 m8 u! z( x1 k
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs" y. S" q; ^6 ?, m
                                               //
8 ^! g+ W+ C1 @8 }! H* S
    @out:: ?! l3 j: w1 c- F( v2 U! d
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点+ c; J/ M9 X' T0 s
2 g2 j5 [% S* p4 O# n
    @OldCor:
8 N  e( p9 D6 P* Y3 x
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值
8 K: e- L$ I' A% u- a
    end
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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