游客您好
  • 点击联系客服

    在线时间: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 编辑 4 ~1 I6 b$ a& `* o4 _. n" o

9 F9 s' D( g; N* W" ]) b5 n$ n, P2 I
编写需求条件:* ~8 j$ E! }( U$ p
  y+ G. ^% Q  [. t% N" I
    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)
# P, [" @% r, `# `5 P7 x& q+ ~" g& N

- k$ \; g; @& f- d9 z9 o' M编写过程
% R9 E& q% `2 t/ \# a# ~+ P% m( E; {4 N6 X( m& P# E
1:
% S: s3 Y; v/ t; n4 @
" `9 z, ?7 Q; V. H# B2 \$ g    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面5 y4 U% r) a9 G. n

& F. v0 h+ Z0 V8 t. {$ S0 v5 {0 S" B% P8 y9 R% n( @
2:2 Q- J2 w! T; l
! n2 \6 C5 k0 S! ~
    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序4 [+ r( b( |6 F" n7 I( d/ u

' J, G0 I  X6 B7 o$ y+ u    启动客户端进入游戏(后面要用客户端)
4 U8 |  r4 }& U
0 P& w. |5 j3 l! z    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
4 o  j- X6 c4 u( _, }
3 q0 i2 z/ r/ x( {6 A, d/ K$ q    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序
6 A) }% Y& D, ?+ `
1 T6 y! g9 `. q- y4 [1 o$ h" Q2 E, s9 u    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到
9 d6 ~& u* l$ n1 \( z4 K/ W  s5 x9 {9 L3 q
    od停在
8 d$ t+ \. X% p# N# _9 @
  e) r6 ?* T" [- c2 v    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "
. Z# h$ M- ^, ~: @! ^- V& {/ k; ?: s( d6 V: M
    双击这一行 再次看到od定位在汇编代码显示页面
7 l* d8 g8 m* q& h. D& v) i9 P5 k$ U5 A* h7 \" \; G2 j3 w

$ D7 Y# _( z# Z6 Q9 v  F        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: "
* P* q" y6 S/ R' d        0052A0CC   .  E8 C7A5EDFF   call    00404698                                ' L- b1 G* C" a! u
        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容
* d0 n5 Z: [! Q5 c& e4 A        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用
- O  g/ g3 U5 \9 S- d% y. X        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        
; H4 B- Z# g7 Y' S        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB88 m. M, v8 |( m( f  W, r
) S, E( }# T" a0 k. O7 q5 M. K
    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????1 @) y2 h( C$ n" @
    * o  {+ `# B- W7 T7 v2 U# d* y' }
    这时od会被中断, 断在刚才下的断点处, 这时按下F8
& ]3 c( ~; w& l% K' ]) D$ q, V" p. a$ \( w
    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩
3 c! I) _) C0 d
  {9 L0 u! S. i, @    同时发送数据给客户端7 d6 |) E( O+ K

, k* i: Z* f8 q; {    % G' K% s5 @7 c* M
    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过8 Q  S  r- h5 m" s' v# I' P- d
  : m( _2 U) m& a- p$ Q* i7 ~( {
        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)
* U4 K' n1 ~0 Q* N        0053BBFF  |.  0F87 41020000 ja      0053BE460 U' A0 @+ B" U/ G7 K9 E

! ^4 Z1 g: h! ]' i+ X    eax 这里是3 一路F8比较下去到下面这里6 d% L( Y" |) C" Z

) Y9 i  c! O+ O        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC) h/ \4 ]9 Y, W5 {, J
        0053BCDD  |.  66:BA 1F00    mov     dx, 1F
: n0 g+ S7 i9 w% e% F        0053BCE1  |.  66:B8 1F00    mov     ax, 1F
, Z: Q; Y. K2 o1 u9 Y4 p  x# A& U9 |2 ?        0053BCE5  |.  E8 EA54F2FF   call    004611D4) \$ j) {% P, V2 @; v2 G

1 H& W+ R6 J- V: Y& I, ~$ ~% i. |    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数
2 R. c/ ^1 F2 s; u  g' r) ]* w' u   
6 t5 h$ X5 ~, T0 s3 C0 b    call    004611D4  就是调用 winrgb( Y+ J$ B9 }$ l1 B
7 M& V1 B2 m. q' q

% b5 R+ n+ e3 G5 b7 ?- n5 O: P# t上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
; R9 w# ]- G0 R- ]0 e
5 q  ?6 h6 m2 U. i
    dll里面进行内存地址读写9 f0 \% d, j/ b4 T( R
/ N( {$ Y; S! \* {
    我是在3 C6 n3 @. @4 e0 H
   
+ v5 B2 u# n; l5 k! _& g3 I+ G
    0053BBFF  |. /0F87 41020000     ja      0053BE46
7 X3 Q% W% x. c2 q2 R& V

! Y0 ^7 S* i6 m4 C& }- ~( ~
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写
' a5 U8 _. \* Y: Z
7 P8 A# x8 j! Y, D
    procedure InitDll();
3 A. M! ?% s- V( n* q
    var4 m% z- ?7 k7 Y+ a& W. Y0 V2 {, [
      p: Dword;4 t0 A7 z+ j9 ~+ H  M& ?: @
    begin
3 U7 i9 c  U9 d
      p := $0053BBFF + 1;* ]7 P/ t5 y) ^8 p/ {! Z7 o
      PDword(p)^ := Dword(@proc_0053BBFF);
" {) m* @" o. f5 U8 k: M
    end;
6 S; c7 }  F5 C
+ U! h4 |; H" b% H# b. O
    在自己的代码里面写一个色彩增加的函数判断比如
3 F- L  Z; j0 v% h/ O5 [
6 R8 v" z; J4 G+ k
    delphi代码:
$ S* {; r- N; L5 s  g+ S) U& o
! j5 @! B8 E' c, F: o/ q
    var
- q+ C- p# y. Q2 _2 U4 i6 d
      EndAddr1_0053BBFF : Dword = $004F470C;
! E$ ?* o( L4 d! w8 C) u8 I# e
      EndAddr2_0053BBFF : Dword = $004F44CB;
3 B5 H) g2 }; |- b
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转; U4 [- h1 [# i/ u* z1 @8 a: S) S

! K* O1 M5 @/ t% {0 r
   CallAddr1_0053BBFF : Dword = $004611D4;
1 _# I; g5 b, \
      CallAddr2_0053BBFF : Dword = $004611D4;
3 _3 L. f1 C0 i% \  d
1 Y/ _% ~9 V6 a2 H9 J; i' f& {
    procedure proc_0053BBFF();
; }5 {1 p' f0 m! Q8 K' Y. j
    asm$ \! U( Y1 W- F* r% b. d( Z' ^
      cmp     eax, $10                        //与预先设定的 最大17比较
2 i3 M& I2 i! b5 S7 v
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值
4 j. Q  u. G" W: a2 S' F8 Y5 r

; L  ?/ q; ~0 X& Q  p( j
      cmp     eax, $10                        //比较是否等于16
) ?1 q. S2 C& H* Y$ m' T
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分( t% @! o* o6 N" k' d

3 Z& m1 ]/ d% H
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
( O2 H: r+ z% R/ Z- K
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF, Y$ F0 T: D, z) w
      mov     ax, $A
3 w" M1 x0 _; F/ h- F" `
      call    CallAddr1_0053BBFF
7 D; K) r5 ^9 \! {( e6 {, |2 q; G
      mov     edx, dword ptr [ebp-$14]. P  K9 }! }' A) [/ j; T
      mov     word ptr [edx+1], ax& G4 z# z0 n: h3 f  W8 r) _; G

# A9 b, K, s* e' F& b3 T$ ]
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试" m  ^1 @! ^2 Z0 p1 Q3 ?3 z
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF, ]& F% i& {3 ]+ l# D
      mov     ax, $106 K, s  W  \' C$ v
      call    CallAddr2_0053BBFF
5 J) B& W& ]+ E$ ^; v
      mov     edx, dword ptr [ebp-$14]
5 C7 ^& R# v5 n7 [6 o% l# T; L3 K
      mov     word ptr [edx+3], ax
% v! |8 u: ?' Y
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
7 l( x& F. y6 a; i

* T6 ?- U( j8 q
    @Seventh:% E) M5 X' S* s
      cmp     eax, $11                        //比较是否等于17/ D# V2 k2 e% X& O) Q/ d' P
      jnz     @out                            //不等于就跳转到默认部分8 s9 J7 z6 t) _: H1 r; ]
9 A$ z/ n& _# U/ D# T' r2 E
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试5 _5 Z* I- I8 N% r! S' h: k. s
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF; a) F3 P# _$ {# f
      mov     ax, $A8 @% t) \" i; Z! D
      call    CallAddr1_0053BBFF
* s: c( V, _+ U
      mov     edx, dword ptr [ebp-$14]
, S0 @/ C0 W3 j( b% I7 [
      mov     word ptr [edx+1], ax  e  z6 ~( W! l; ~1 ~4 \# O
: r. ^9 U8 A: u: G# \+ L$ `$ U
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试3 S* s/ X9 B: w# j$ Z  |9 I9 n1 k
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
7 U) ]. P* Q+ E( M6 b3 I  d0 I) d
      mov     ax, $105 }1 Z- t& t* c& f1 u; w9 y7 E) h/ r
      call    CallAddr2_0053BBFF, W& ~+ n6 o2 L0 b
      mov     edx, dword ptr [ebp-$14]$ V1 k+ r" E) m! p# |# r' {( W7 {# P
      mov     word ptr [edx+3], ax
- r9 A- K6 d' w$ W, q
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
7 v5 R0 U$ P4 j7 c5 ?; U% N1 l
                                               //
1 _7 q* D* v6 B
    @out:
* E, w8 z3 i( |. V
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点
- Z4 Y; z) N7 ?6 [: B; C  ^

5 P# G. p) S8 X& y+ P7 }
    @OldCor:7 m9 D" A3 \" L1 \$ Q/ p$ ^8 x" ~/ A
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值
- q% w3 w( ^" E
    end
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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