游客您好
  • 点击联系客服

    在线时间: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 编辑 , W0 s8 o% J6 z# l2 q- a
# m, Y8 ^$ a0 e3 p/ T
编写需求条件:
+ G' X8 v4 V  G, H& K# @
, y1 o. h6 l! }3 |0 o0 ^7 ^  E  X    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)0 o6 i$ I* G$ ^5 w

( J) A: t9 H6 y( Q* l, x( S/ x, H+ d$ h* h9 u
编写过程
" _; n* L& `. j  ]/ C2 X9 q% m0 U4 S4 |, V- I
1:: ?( r; i6 E" E

2 N7 t- d8 w" M  r. a+ Z2 j' C    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面
9 Z6 o4 ^6 z  S6 c& H% E# q. C: Z- K/ M; [: X( k7 T

' x5 D& M9 b9 i% A( e2:0 r/ I$ o" T% H" S' Z/ {. k. u

+ d) D0 Q9 V0 K4 s: A    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序" y: y$ [; B. }4 T% m5 d
5 g" R* w8 I, I# c. D
    启动客户端进入游戏(后面要用客户端)- ?  N) q. C1 Q  A- Y0 Z
' ?1 G& }7 o3 e9 F
    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
* x- I0 h: J3 o" P: L
" Y* p! z( a* D: S    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序 # p' D  H1 r: W! a* C
  y* @, w' A/ q- \* r0 b9 m
    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到% F. M( n5 {$ t
- A0 j3 S* _! p$ N# B- B
    od停在& z. v6 i8 T: v2 {6 b

1 o! w8 \. @2 T1 @    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "3 E7 h4 w5 \9 n5 F$ c. \) G; ?
+ f' k7 R/ G) q$ t
    双击这一行 再次看到od定位在汇编代码显示页面
9 z, T; B  J  K) f! t- ?/ i& Y
* B, l3 @3 c+ V. f) f) F3 k3 G0 q) Q$ ^) s! y9 p2 i/ E/ X& h/ z
        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: "
6 h! W* z% H6 w+ ]6 v  h& \! K9 c        0052A0CC   .  E8 C7A5EDFF   call    00404698                                / N! T6 J% f* {
        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容9 k( v8 P; [+ v7 x; g4 _
        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用
/ l1 X7 B4 D' ~( r- o        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        , C7 b4 g/ K% r+ E6 ^) L
        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB8
3 ~( S9 x3 m( D* U. q8 o8 h1 q- r8 e7 ]
    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????
/ b$ v* w; Z: f+ _6 V7 `   
; ^- U# k9 b2 P4 x    这时od会被中断, 断在刚才下的断点处, 这时按下F8 " Z7 r) R+ a' }# x: D6 M5 r

$ Q: a( m! _( M" i( [; x; z    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩
; a1 a- @2 v6 x( Q3 J7 Q- r" S% f9 i* L0 J
    同时发送数据给客户端( \' a/ i0 z- {; Z1 f& B: l% v( P

/ c% m: I; l( ^4 }$ L& k4 P! Z    ( r' S7 z1 l1 j$ I' v
    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过
; P3 k; `; ~0 {( T  
. X7 M" s- _/ W/ {' @        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)' K; Y, L& Y! Y8 b, x
        0053BBFF  |.  0F87 41020000 ja      0053BE46" z: W* [3 ~: A6 I/ f/ ?0 R- F
/ m9 e2 ]6 r6 d
    eax 这里是3 一路F8比较下去到下面这里
$ {* r! H0 E- Z+ C; e1 `" `5 |, L  k! U6 ~$ X! a0 r
        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC
" ^! }0 m6 s8 ^) c5 u, m: u        0053BCDD  |.  66:BA 1F00    mov     dx, 1F
' K9 Q" ?1 w  ^" V0 ^( u        0053BCE1  |.  66:B8 1F00    mov     ax, 1F: N+ V9 ?2 i" z& k  n1 v
        0053BCE5  |.  E8 EA54F2FF   call    004611D4
+ c, A. z9 I. F+ G; Y5 j* R7 R7 E
) x7 ?+ k# A( t" N+ D4 J- Z    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数 / V! D5 F. h$ \  [1 E
    6 C2 n$ I! V5 g
    call    004611D4  就是调用 winrgb
& V0 m2 J, p# [% k  p. g6 n  R: [7 ]/ s: `$ y6 |8 ~
! h; K! ?0 k+ |1 g  n- }; G5 Y1 _$ \
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在) [5 z' `: e4 u( B6 ]- z

/ A2 S- v" j- H, q# ~
    dll里面进行内存地址读写
; n9 p/ {0 h" V7 z8 ~* v
+ W% L7 U4 `0 U; p; ~5 }
    我是在* }* y3 G; {/ g* p5 {
   
& E1 {5 a) t6 z
    0053BBFF  |. /0F87 41020000     ja      0053BE46! @: e7 e8 R. @# s8 U' T( V

$ r( s! x# i$ k, c
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写' z  J" }3 o3 i$ L/ y
  }4 F  j; g9 P$ T9 M
    procedure InitDll();0 U, n# ~  \& |, e
    var
2 n/ {5 ?4 b$ g
      p: Dword;0 t" d5 w& _2 V3 [) c  W# o6 s3 g" w
    begin
( X* j2 {5 b/ a, ^& t& G+ h3 f
      p := $0053BBFF + 1;
/ K4 P9 N% j0 i
      PDword(p)^ := Dword(@proc_0053BBFF);& a* R7 ]5 w4 y; `
    end;
- _: y/ h- N' N
3 ^: n8 O/ `1 L! E, k. y
    在自己的代码里面写一个色彩增加的函数判断比如  y+ M% Y3 T2 A/ E6 Q  g
. n0 P4 B/ k3 o; i8 V9 C( T' O
    delphi代码:4 H( V3 h! i8 ^' t, {
9 ^7 |4 Z; H& u& N- `3 r
    var
+ b3 t3 E  w: K' N
      EndAddr1_0053BBFF : Dword = $004F470C;$ ^+ R4 G* I3 W* Q
      EndAddr2_0053BBFF : Dword = $004F44CB;' p% c4 M, Z% `, e3 t3 a9 b/ `& _
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转( D& F# ^4 h1 o7 ^4 m5 ]

/ l! C, F8 ~1 F4 o% R3 E) d
   CallAddr1_0053BBFF : Dword = $004611D4;0 \7 K# d. y( \0 n+ S3 Z9 ?* {
      CallAddr2_0053BBFF : Dword = $004611D4;6 R( A+ c" l# ?; x+ X, }, o

- \, u1 @" M# M( `% R" G
    procedure proc_0053BBFF();
& K2 h3 {. J3 O5 a. F. d7 Z
    asm
$ F5 I& S- q9 I7 t8 H
      cmp     eax, $10                        //与预先设定的 最大17比较
$ |9 f& K3 ~: S9 X) ]% J
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值
; Q( }+ b: ?& ^4 D7 D

& p2 F( b; Y" ]* j4 X) q2 _! j
      cmp     eax, $10                        //比较是否等于16: I" d: @" y' I
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分4 X0 Z# [- c0 K8 H
, J4 A/ N7 Q5 x7 ^  O) _
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
) O0 k. f9 Z) j. w/ ]
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF) |7 D5 x; W5 [, l7 H
      mov     ax, $A. I2 X- x/ {* Z" a3 o/ ^
      call    CallAddr1_0053BBFF- a- I+ |6 A/ s/ M: t2 U) y0 ]
      mov     edx, dword ptr [ebp-$14]
" b1 J3 e$ G* S, |  e
      mov     word ptr [edx+1], ax6 d) A3 l+ e1 p

, [3 u! K4 p  |# T" |& ^/ \  C
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试' V' S; |6 {. D% r3 B5 ?; ]
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF2 K6 W' n" ^% ?6 W
      mov     ax, $10
& v" j1 m+ o) c$ u4 b
      call    CallAddr2_0053BBFF: Z5 j; G, F, `& ]+ h4 g7 A% C
      mov     edx, dword ptr [ebp-$14]+ I6 c7 U, n( c
      mov     word ptr [edx+3], ax
1 K( j% G2 c  R0 K  v8 W4 G4 L
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs/ ~! s. C4 c$ ?7 a

! s+ `- t5 z+ H: t9 O2 C( |# }# H
    @Seventh:0 l: {- c2 X1 {* W
      cmp     eax, $11                        //比较是否等于171 ~3 a+ y" p: c$ P# B
      jnz     @out                            //不等于就跳转到默认部分
. W7 f' S& f8 d6 f' b8 ^
7 j2 X& k1 a$ g# o7 c
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试& A* c8 M: f2 c0 O" x$ n7 O. _3 J
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF- S7 d8 g5 V: p/ u3 L. V
      mov     ax, $A! g" M! i0 L$ o
      call    CallAddr1_0053BBFF
7 i* H7 m/ G$ p; b0 l1 m
      mov     edx, dword ptr [ebp-$14]
. H4 n5 Q7 V2 c) Q9 V% y8 @) e3 v
      mov     word ptr [edx+1], ax
" d* L% x- s5 p# Z) q/ T
7 \/ j8 F8 M7 L1 e# \3 q$ N
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
3 t! j$ q" I* Z& Y# ^
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
1 _0 Y/ H$ z3 F2 j/ P% i5 G. @
      mov     ax, $10
; [; X2 {" R% p- }" V+ b, F2 o- i
      call    CallAddr2_0053BBFF0 e4 y7 C) m  v2 Q+ g# Z( V
      mov     edx, dword ptr [ebp-$14]
( c$ }6 V5 e( Y) B3 F0 ^
      mov     word ptr [edx+3], ax4 m/ N+ K3 ^, _  i9 q  U  X
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs0 P/ s5 y- A2 C. [- {/ v
                                               //5 p1 T, e, x, }3 E% Z7 k
    @out:
0 S& b5 ?5 D( n% X2 V
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点
& j' [  @! D1 }9 n' e
) D' R5 Q0 X: O3 B# \# B0 P3 ]; x% E
    @OldCor:
; |$ |% J& w2 O
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值
+ F1 `/ [" \4 {; N2 L6 a
    end
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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