游客您好
  • 点击联系客服

    在线时间: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 编辑
* F$ T/ T) o% t! o' z8 ?8 j% |' y) H% h: T7 o% ~( B# @
编写需求条件:
$ _( ?0 H# @2 k" b7 g1 o
& c- I8 x) }& B+ d    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)% {% k3 ]) L' `
0 _" w! p) m5 t+ E/ M! f
/ M' k/ \! t% X+ K
编写过程
" W$ _: d4 m* J$ q
) [' V0 e. Q$ }3 }  F* ~& J( F1:: h8 i# z5 i7 K$ ]& N

1 z: ~8 E8 e0 N% V/ i# s2 I    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面
* x% H6 W: u! O. `/ Z4 f, @, B# i' y; R; Q% B) k* d4 f

* H7 t/ Y& g5 I* E2:+ d/ S5 ]4 f8 x- |7 a9 [6 d
2 h1 o- m' p* Q* R+ V2 O0 i
    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序
" l' |& L$ P1 x- t- B% ?' O5 a6 X* C& @" W7 n/ E0 U0 \& C
    启动客户端进入游戏(后面要用客户端)
* `' s( x* _5 f' u& i3 G) l4 j4 T9 {/ K: F4 }
    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
  n" m* t8 P, d# E! X
( P: h) X% A( ^0 g    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序 $ _" f# r+ B6 E" p1 r5 p7 X
, G5 F+ h& e- u6 c
    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到
9 |! d9 X4 {( m7 f- f- O- Q/ s7 u7 L% i3 L+ V% D
    od停在
- O; X$ I: j0 W$ U- D& a/ t; P; a' c5 P
    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "
* L: x; s$ l. o: M9 ]2 K8 y
" K4 g. s5 L* d5 T1 Z    双击这一行 再次看到od定位在汇编代码显示页面
6 Q( g+ N: t9 x7 U) D5 @$ ?. k5 Q/ ]7 r% C7 w& ?" ~% @2 o
7 Y( r- L* B: C4 v
        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: "
6 ^7 O# W" O- f2 E, S) e+ U. T        0052A0CC   .  E8 C7A5EDFF   call    00404698                                
& K! z9 Y0 k6 _, f) W5 @        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容! H+ B$ I8 K% O( K8 V& r+ x% G
        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用' K4 r  J" e' `5 k0 t; j
        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        
1 R/ L; H9 I. E$ F6 I        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB8
$ V( \9 W# B2 R
  ~) [# j) v7 a3 z- G5 Q- g; \    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????" J$ i+ x6 Z# A; m, ?6 G" @
    6 R: H( O* L" B; ^
    这时od会被中断, 断在刚才下的断点处, 这时按下F8
6 C5 F6 ~) s' M% b) d$ B* D& `* b/ ^6 c" l+ B. d
    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩* F" _" X6 E* F, ]' o8 y* N- y
* i! X9 W0 p* F( U, L' F/ M
    同时发送数据给客户端
  w$ V8 ~4 j  ]/ ?
3 R# X) W- p2 z      Z0 ], t& T7 Y& j  ~4 j9 r: Y
    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过
5 y, O9 H- b( Y  6 B" a' E5 F" ]; `" A/ @- y
        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)! y, T6 I, d3 q+ i) c. p! Z& I: U
        0053BBFF  |.  0F87 41020000 ja      0053BE46
8 p" N" j$ R7 J: i" H( S; ^; a7 e. C8 S  s0 G* K# e
    eax 这里是3 一路F8比较下去到下面这里
" G2 h' ]0 v! B/ K& o2 d5 q1 }3 \! I" f# h0 ^
        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC
; _6 t( f$ ]) q3 p3 U- f5 I7 a        0053BCDD  |.  66:BA 1F00    mov     dx, 1F" b; W& z: \5 w
        0053BCE1  |.  66:B8 1F00    mov     ax, 1F. n/ L' d6 g5 m
        0053BCE5  |.  E8 EA54F2FF   call    004611D4
" Z* m1 L8 ]+ ?& k9 q( J
1 X/ g" r. |% v2 S& x    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数
7 o0 A, T' X+ W; ]8 \6 f: l' L2 }" N    4 m8 }2 C7 @' w8 i/ R0 H  w' c- I1 A
    call    004611D4  就是调用 winrgb* k& A2 U0 @8 s
! h6 M8 A  `3 G1 [

$ z" u+ c/ Z) Z: E  P3 y; f1 S3 s上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
, `7 |2 r% D8 c1 m

9 `" I% ]1 m7 L0 d; i- H$ m
    dll里面进行内存地址读写: O% U7 W6 z1 M( y3 y# N

; a) C8 I; G* B
    我是在
, v5 x3 r: ]$ K: K6 e
   5 D' z. T6 e4 h, a2 M; _" H6 Y
    0053BBFF  |. /0F87 41020000     ja      0053BE466 D2 M4 `' @9 Z4 x6 C( s3 k; ^: x. I
3 t, Z5 g; K+ M% ?) H
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写4 p: V% l0 O! O) X! i! n
. U: F. c0 X4 I* I' B. W1 v
    procedure InitDll();' n1 P$ Y8 B( ^
    var" E* Z* w) c6 B; s1 P
      p: Dword;
+ F( j" a2 s% e' G1 h2 C
    begin
( N- \$ k7 I! _$ S
      p := $0053BBFF + 1;$ R/ X- _& Q$ S: Z8 f. `1 W
      PDword(p)^ := Dword(@proc_0053BBFF);
# e! \, v! O0 k& D
    end;
+ h, Q! g3 ]( _- O& ?2 R% m
/ a7 n, L# V  J+ Z8 m
    在自己的代码里面写一个色彩增加的函数判断比如1 c3 ]8 _" x+ b  m: ]$ Q

  R$ d( K2 H7 x6 i. I
    delphi代码:8 o+ e# Y5 R  y9 v; ?: p
' {$ |3 H' C: w+ }) I$ \
    var
$ T  m# p( b7 W7 t/ Y" F5 x2 z
      EndAddr1_0053BBFF : Dword = $004F470C;9 S6 O: J9 ~( [  {$ K$ c
      EndAddr2_0053BBFF : Dword = $004F44CB;
  X* y$ B4 S( u
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转$ _. h% m3 A& Q4 d) Q

! g1 U6 I  g- O, f2 c% G! E# F
   CallAddr1_0053BBFF : Dword = $004611D4;/ m5 j" w" p. _; t. c8 d. d5 v
      CallAddr2_0053BBFF : Dword = $004611D4;6 m4 [$ j* [; B5 U! ^

' J9 y6 e. t' p. c
    procedure proc_0053BBFF();) W% X! R; K1 R7 ?* A: i8 M9 M3 X. K, k
    asm
. ?) t7 J: k" p  t/ ~0 i( g
      cmp     eax, $10                        //与预先设定的 最大17比较
1 X: I/ c# R$ o$ m  @7 Y7 z
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值: `- h9 k" N. o1 j4 M+ u

( `0 p. b+ K7 A2 Y* `* k
      cmp     eax, $10                        //比较是否等于16- F1 f- M: n9 \- H: Q. T- b
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分
8 z  i8 y5 T3 x9 G3 A3 K/ c
. K9 F" t3 z& r$ S# p; C
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
' t% e% `& t9 R$ j: q+ i, D
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
" v$ Y& I8 Y; V# p$ Y5 E2 }
      mov     ax, $A
$ l* K! c3 W( \' _- a
      call    CallAddr1_0053BBFF
0 q- V( T! x3 J! {7 y* E
      mov     edx, dword ptr [ebp-$14]1 m; u5 k6 L, h5 [1 a9 G. v3 E
      mov     word ptr [edx+1], ax
$ Y) x5 C% c% `
' |1 [! R; U* R* l; X
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试; \( Y) U' E. N1 G
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
  [1 l) s8 h7 A- m$ l
      mov     ax, $10
/ B$ z# o. p9 l+ }9 ]6 e0 ]/ u
      call    CallAddr2_0053BBFF
+ E% `% F4 f# `$ ^
      mov     edx, dword ptr [ebp-$14]- T& C! ?' K0 L6 _$ {. t9 Q- z
      mov     word ptr [edx+3], ax
4 ^/ K: N0 o/ P( W4 ]0 h
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs/ h" m7 f2 i3 W+ ~

9 }4 Z$ }5 [2 X; {: Q' B& W2 |: [9 E
    @Seventh:/ e' A& s( e5 z+ j6 X2 r# _6 \
      cmp     eax, $11                        //比较是否等于17, R9 X/ W% U6 n  B2 F8 \7 d
      jnz     @out                            //不等于就跳转到默认部分
, u7 I- n. c' y2 n) u

1 A" N+ x. `& ?8 a: m
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
8 L8 q+ c7 g& Z, ^
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
" R- |9 c1 A' L$ h/ v* j/ s4 P6 `3 K
      mov     ax, $A" Y6 `8 K) k% B( d/ f
      call    CallAddr1_0053BBFF! l6 O2 ^8 v- T2 s
      mov     edx, dword ptr [ebp-$14]
2 M0 c  V& I( {1 C
      mov     word ptr [edx+1], ax8 M9 v0 z1 J; y. n9 h0 `* c- a
* `3 O9 d1 a- ^: y
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试2 C  A' M! {+ Q% M# a* B
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
! N8 I1 ?, e# t0 _( Y& O4 t
      mov     ax, $10
: I2 Y1 T. T% i
      call    CallAddr2_0053BBFF0 m" T) N) @' ?1 s$ {
      mov     edx, dword ptr [ebp-$14]+ c* g, {2 ?8 f5 |
      mov     word ptr [edx+3], ax9 p" R5 L: Z. {7 c
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs2 Z5 S4 G7 N+ ]! Z
                                               //
. X7 u2 b6 g- W# y* h4 ~
    @out:
- n- X8 p9 W+ r+ L- _3 V4 S
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点
0 L' _& ^5 X6 f9 a# T/ E

8 r) w0 o8 f' ]1 Q
    @OldCor:
8 I. ~$ I( E: Y! T* \
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值
8 ^& Q( @6 I8 }0 A% C
    end
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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