游客您好
  • 点击联系客服

    在线时间: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 编辑
$ _, `8 }  A7 j$ o8 G
; d0 f" p* w6 P4 o/ I% p
编写需求条件:
3 m: j4 ^) g/ Q2 }+ F% ^/ `  @1 g
; Q# i9 s) I+ l& u    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)# s7 G1 U2 ^. \
2 T6 P; d1 @$ E, v, Z$ z

3 N- c( y4 }" P! N0 u7 J8 S* `5 j编写过程6 l9 K1 R2 ^& F4 }) h

1 ?$ l; b# ^7 z: S3 T# \8 u1 W2 m* f1:
' M) o! n3 O' |4 y& U
6 f+ q8 L3 x5 ~; R. C    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面+ z$ ~: @5 @' g% P# d) O" j6 [% Y# w' S

4 a) M! Q. e5 l! F
2 K" G$ i" r0 `: M3 }2:% B* b  n; \: i- f" i* ~8 f0 g% V
0 U; g' z7 f0 M! ^  i, S
    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序* g8 D* r- t1 n$ U! v0 x
: H5 l5 ^& M4 ^) i; w) J
    启动客户端进入游戏(后面要用客户端)& g7 \& l2 y+ ~( ~% H  }2 l
8 y6 J8 j6 g2 Q4 t! \, I
    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe0 N& @% _% G0 G6 F! z5 X" X
/ f) H& U2 I* m- q" `  T$ d/ \/ ?$ y
    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序
- I- w! Z$ d2 i( g* K) I/ ?% @' U
* W% G+ R* X+ e$ x) u8 \+ k    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到
2 t3 m) H9 [. x2 _7 Q# G0 r; L; j3 F( Q2 ^$ a
    od停在+ E$ k) h5 e: F( I! G) l+ L
, @4 d6 u" j0 E7 a
    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: ", }  z8 ]5 x) i, D

: p/ j; }6 [6 ^: ^% m6 V5 S, `, p    双击这一行 再次看到od定位在汇编代码显示页面* P, |+ O3 o0 q: H: D
7 b' s2 ?# W% d* H4 d" A0 g$ ^

: f/ C0 m) C+ }        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: " 4 z  D9 v- r; Y# s( D( p7 M
        0052A0CC   .  E8 C7A5EDFF   call    00404698                                
1 `  q' A8 ?# W: F0 b7 {( W! |        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容/ ?3 b$ k' W8 t# T+ O  z
        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用: a/ s% `; Z$ T# ?' t& |( G
        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        ; T4 z$ q. R* |
        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB83 N) G# `* q$ H0 V
1 b* x" U$ U0 I
    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????/ W1 q, o$ C6 E0 H" S' C  z
      S2 x" s! u4 s0 ?/ H" f, \
    这时od会被中断, 断在刚才下的断点处, 这时按下F8 3 R9 R/ [1 j/ `
; h' w; j5 ]2 `) S9 |
    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩
; c# z* G8 f* }* K7 S) h: s( Z6 w; D+ ~+ N4 W
    同时发送数据给客户端
( F, y* [) G% T% P' t' d5 j$ w% J( A+ s6 T+ y  A, w
   
0 q  r0 }  `3 c+ j& U9 F3 [+ H* `: V    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过
6 E. Y- F0 H, A, q0 f) t, l2 {. u  
, l5 y$ n; W" @* t; L' F        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)
% I  {0 A5 }% I        0053BBFF  |.  0F87 41020000 ja      0053BE46
0 L+ c7 ?" `6 o) h& W- \
9 X; |  ^3 p5 A+ Q% U) d* y    eax 这里是3 一路F8比较下去到下面这里
" s% F; A8 S0 q/ m# R, p1 Q9 {3 g" @7 D; p& N0 ^1 _
        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC; o  G+ _0 @7 v0 L' I: ~
        0053BCDD  |.  66:BA 1F00    mov     dx, 1F
: f+ v7 J" C5 c5 n: f        0053BCE1  |.  66:B8 1F00    mov     ax, 1F. y- p) H& `7 D$ ?
        0053BCE5  |.  E8 EA54F2FF   call    004611D4- t8 I6 q8 D% r, d% W
3 w0 U- x+ H- S" i
    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数 8 I/ p0 p  H* Z; v1 |
      D# p( D! A4 N- h  ]) |$ B
    call    004611D4  就是调用 winrgb0 t/ ^- E4 G+ Q- \7 W

  E- T$ X1 C: L6 c% d
% Z% V# K6 _6 E上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在! x: |1 Q- j8 ?! W9 ^5 z

: |" p7 z9 s+ r# d# f6 t
    dll里面进行内存地址读写
" I- h8 t6 r! x9 _

* F/ [; Z3 L5 _% S
    我是在" x: m" S4 u+ A* I  V  H# |
   
- S* H$ W% p1 a, g, A: W; W
    0053BBFF  |. /0F87 41020000     ja      0053BE46
* [8 z9 p* H( E+ u2 M( ~+ G
; g- X! x9 E" r' A8 `. `
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写/ y4 Y+ l0 y6 q- V: d$ Z& W
5 R1 X9 J( ?# P6 U( a
    procedure InitDll();
3 e  |6 y. X0 d
    var/ c% k* l8 w# i
      p: Dword;
  H7 \1 s, Q2 c# Q) ^! W
    begin
6 y9 j( y7 w; s# C1 y" Y
      p := $0053BBFF + 1;' @2 u0 \4 @5 H: ^
      PDword(p)^ := Dword(@proc_0053BBFF);
6 T# `% Z, h! M2 N4 V* Q; _
    end;
& ?3 _/ v: s7 M9 a" D5 b

3 E$ x" E; N. r' l* B
    在自己的代码里面写一个色彩增加的函数判断比如3 Q) E" O: u' B6 Y. n# [$ o4 v

- Q- E9 X: H8 v# W& W
    delphi代码:" {- Y8 C  p: }

$ S( |( B9 F7 }4 B4 \" m" B
    var0 E4 m0 G" \" L
      EndAddr1_0053BBFF : Dword = $004F470C;' E* ?; u1 y) Y& m0 R
      EndAddr2_0053BBFF : Dword = $004F44CB;
' G& t" |, E7 E( N- b6 M
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转
6 D: Y: a. R( A
) F% B. s" L; q" x, |6 Z
   CallAddr1_0053BBFF : Dword = $004611D4;
5 e% D; X) r9 g: Q* p4 Q
      CallAddr2_0053BBFF : Dword = $004611D4;/ [  d4 Y3 y) h

# I9 W# R6 N$ j( `2 k8 Z
    procedure proc_0053BBFF();5 L$ e$ e. Q, t4 H) U
    asm' b1 `, Z3 i% H6 e2 w
      cmp     eax, $10                        //与预先设定的 最大17比较
: P% W9 D4 r. w) s+ G0 }0 s. [
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值! ]" q+ W, R7 ]
% \% R4 W0 }' P) f/ L
      cmp     eax, $10                        //比较是否等于16% i" {* Q! m, R2 B
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分
2 F( T9 [! ^6 X/ L; F: z, @. R
+ r' D9 T% ?$ V4 @( c
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
( M0 p( T' s* y
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF, e0 G* ^) a. l' V5 R
      mov     ax, $A# @: @8 D- d- W  \; y" y& |1 X9 P
      call    CallAddr1_0053BBFF& g5 Q" @- }+ q; J4 [
      mov     edx, dword ptr [ebp-$14]  A8 U: h0 `' _1 Q( v
      mov     word ptr [edx+1], ax
# q8 \2 r' j6 j6 j" Z3 u

! {* q) y7 }2 K+ p# }4 j1 N
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试9 t; Y8 k- g! D
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
) w, i* Z) ^, A8 Q/ }
      mov     ax, $10
  a0 G0 r& s* o
      call    CallAddr2_0053BBFF1 m. ~- x3 U/ c! k% A: c
      mov     edx, dword ptr [ebp-$14]
3 T; p/ ?8 `: l7 w! ^
      mov     word ptr [edx+3], ax9 x; M, `3 s( [( Y
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs1 q* d& D# b: \% I

2 C# W6 R3 u  t
    @Seventh:) X1 y, x" K3 w  h, ~
      cmp     eax, $11                        //比较是否等于17
0 w/ J3 F" t8 ~. Z/ D% t; l' m
      jnz     @out                            //不等于就跳转到默认部分
# U4 |3 X+ V' K* x; ^3 U+ \8 T' G

: f  i  s9 D( c5 A3 `! l
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
- O0 a! q8 w) F/ I, I
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
! z7 e, w& t, c3 o  j8 M( @
      mov     ax, $A
. D5 Z- G" l7 p& `* X
      call    CallAddr1_0053BBFF
& m8 o+ K8 G, p. A7 R# Q
      mov     edx, dword ptr [ebp-$14]2 a- A8 E/ w. W. {  v: ?( b+ ?4 b
      mov     word ptr [edx+1], ax
5 t/ z9 b3 b! Q  m/ {
: g7 ]# h5 q' J; D% W8 J5 m5 y
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
% z% u3 T4 W, d7 }7 H8 H
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF2 ~& f5 L! e: b0 Y; Q, p
      mov     ax, $10
! [6 \3 _- P- _; n: i
      call    CallAddr2_0053BBFF+ m5 Z- N  S  h. p3 d  _8 g
      mov     edx, dword ptr [ebp-$14]  F8 N! l% ^! T) w$ S  R% e9 I
      mov     word ptr [edx+3], ax4 g* ?* |& K4 L2 p( {
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
8 J& E9 X+ H* }+ a# d! F8 L; m% h
                                               //
) q+ k5 q' {; C4 Q4 t* |; K
    @out:
8 f, E2 e* O/ G! @- d
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点
) ^  g2 a% `0 ~5 w2 ^5 S. J1 L

7 {  E$ R# a6 B: g! ~
    @OldCor:% Z6 v5 n( c& s( _; }
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值+ Q: H0 x3 K4 n# g
    end
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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