游客您好
  • 点击联系客服

    在线时间: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 编辑
7 u0 }5 e' z  t% q- G4 Y) Z
- G' e6 ~+ w1 T0 s
编写需求条件:
* v7 G! D7 m+ H+ T) J
6 o8 c' S5 I  s. ^; O! Z    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)
, |  Q& f* u# U3 z: e  L
/ g  ^. E( q2 _. k1 K
; q/ p. M+ D4 f+ }, {  S# G编写过程
/ x) z  f7 @5 j( y* L  N: T
% v; ~9 |# X7 \' J! ^- D1:
7 I5 B+ ~- [4 E3 \! j: U
- U0 v  E/ o9 h# }    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面4 N- b  v8 C) i

  y4 }, `* f2 c: @4 p1 C/ W8 O; [# P
2:
# b/ F9 n( Z! M6 u, b
9 }+ P7 C! N. _; w/ W: _* k    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序* x+ k+ G5 M1 a! I5 y2 }0 V+ Z' R1 W

2 k. Y( N' `: B( F$ Z  x" g& J$ ]    启动客户端进入游戏(后面要用客户端)
. ]& J' ?) @% r7 q4 G: I5 T' A& }  V
    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe/ j0 l, J$ B! _3 ]) a2 k& F
6 h# ~/ ?2 A' ~8 y
    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序 . }; `6 c* }' J& u2 g# W" `

7 _" k- M' A7 {8 L( N3 D    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到
7 S' W$ M9 L" A
9 ^! ^5 p+ U  s) P9 k    od停在# V" o9 J. n2 E4 B$ b
2 h! K8 ~0 {/ d- x9 s& D
    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "
8 F6 a+ `0 U% V! O% D1 E8 C
& j# J+ x$ m" H8 C# U1 O    双击这一行 再次看到od定位在汇编代码显示页面
: p, g8 d  u% b6 a9 o8 |
  R! C1 L# N3 j7 |
4 m: B/ j5 ], r- o, c" I: D8 u2 w* p0 P        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: "
" |' r+ v; F) J# k  M        0052A0CC   .  E8 C7A5EDFF   call    00404698                                - E( e; a1 f0 U! y# B0 |
        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容' Q6 O; E  e) k2 R
        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用/ m3 V: o  t  y+ L/ X
        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        
3 n. w1 D% h& j2 G, Z3 B0 q' v( w        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB8, e/ P6 v" y4 ]$ S; V

6 H& o1 M: V1 X- G8 }    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????
3 q* t4 W, H6 [. M$ t% c# Z- j    7 ^6 I! J' L4 J* K1 T8 E
    这时od会被中断, 断在刚才下的断点处, 这时按下F8
' {8 B1 \, f" ?; W0 W% x
( G3 @( x* o. ?' @    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩
3 R7 D/ K3 _" L4 q3 v* O3 k+ O# x6 ~
    同时发送数据给客户端
/ I# a9 h; M5 N' ?9 s% N7 e* F& L
   
( F. N$ v: R4 T$ {, `    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过/ v8 a5 C$ H# Q
  ' A* `$ K  V9 {6 M
        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)
9 l: u3 l* n4 M- M; F, _; c# f1 {        0053BBFF  |.  0F87 41020000 ja      0053BE46) C/ S6 _0 X9 K( d8 r1 @/ v
0 L8 B' b2 w2 }( `
    eax 这里是3 一路F8比较下去到下面这里# W9 y* ~% E* v6 l

! h" e8 k/ f5 R( G        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC
' C) a4 N# W# n( l4 t; ?! V" d        0053BCDD  |.  66:BA 1F00    mov     dx, 1F
2 k! S! U0 g8 p/ c4 v2 A        0053BCE1  |.  66:B8 1F00    mov     ax, 1F- f) D+ k# y9 c- g  c  c8 `
        0053BCE5  |.  E8 EA54F2FF   call    004611D4
( S1 j, e+ e; @5 ~. P1 C, s) }4 a+ [8 _1 U& E3 x
    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数
1 q7 S7 S; K) d/ v   
0 Q+ r& g# H1 z4 y, K    call    004611D4  就是调用 winrgb. l' a2 m$ F! k7 j3 A3 S

, s. G& ]/ C+ {: j2 ?# e$ |% ~3 s1 m( ^9 \3 l
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在6 L; i8 N7 @/ ?" `2 f" u% q

6 i, B* I1 X/ U. [
    dll里面进行内存地址读写
: k! @" m- X# P% b7 f  c# ]8 J

" T+ t  M2 F/ U( h
    我是在
+ P( D  @+ H- K) b
   3 Y; U/ i1 ?6 d# j
    0053BBFF  |. /0F87 41020000     ja      0053BE46# N9 B( m, T4 {/ J1 C9 s) {  {
: y9 f; G; q1 G4 n: |
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写
# x2 D  ?1 T( O2 B8 W* c
  m! v6 a1 H5 u
    procedure InitDll();9 A5 z! G  K: W1 J) b5 T: h
    var0 S% t+ F8 p. O, o# P1 [9 j: k
      p: Dword;
2 A6 ]1 o( _% R7 X3 z7 q
    begin( [  H$ h2 E* d, l; T
      p := $0053BBFF + 1;
- U/ h( _( {* _/ \8 g
      PDword(p)^ := Dword(@proc_0053BBFF);
9 i. L2 i, ^! p$ G# ?& E7 s* N
    end;
, Q: P: N: [$ y' F$ p( ?& ^! ^) D3 J

# G+ a4 ?0 S& W: I6 o
    在自己的代码里面写一个色彩增加的函数判断比如0 p4 U* n0 a# d, a

  X, C) g5 u( Q; \  G: [
    delphi代码:) ?, B6 A9 h* n/ s* u$ I
4 j# G- R+ M# V; j0 g* z0 [
    var. K% h! t0 X7 B9 r
      EndAddr1_0053BBFF : Dword = $004F470C;
5 f" g3 T  F# H8 j# ^6 f& J
      EndAddr2_0053BBFF : Dword = $004F44CB;
% x' w# k- C' R9 g0 N- I3 J) Z
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转
8 o* R) D5 K8 z" w! K
; J1 M! \: ^1 H% n' H4 P8 G4 `
   CallAddr1_0053BBFF : Dword = $004611D4;
/ \' p% i6 I) v- I) O* R$ E" c
      CallAddr2_0053BBFF : Dword = $004611D4;
, J; f( x/ _' Y' K: z! d3 p

" j! t! S1 n( O  d
    procedure proc_0053BBFF();
' o6 @" H; i  q8 `. m. V
    asm
. [1 a: ^6 v& ?
      cmp     eax, $10                        //与预先设定的 最大17比较- T2 |: o( X9 s! h/ O* Q5 j
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值1 S+ M0 D+ p5 W/ e5 F3 h
8 z+ [" g. g' U2 c2 v& Y. v
      cmp     eax, $10                        //比较是否等于16
4 D, U$ ~- ?9 X: p
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分
. A  U: m1 _, F! H. J2 t) K+ u5 i. K
. l2 m. n! n% S2 \
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试# [8 m. k) }1 F! m8 R! \* Q
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
( k$ v  c2 y% b  F
      mov     ax, $A4 E+ e7 X: j1 }
      call    CallAddr1_0053BBFF, u0 [5 I+ n( O
      mov     edx, dword ptr [ebp-$14]$ Z! x8 l# Q1 ?7 T# d0 ~" y
      mov     word ptr [edx+1], ax" f+ l( F2 Z+ I+ Y: d# \: }

' l% W* H/ t" p
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
: l: |4 h7 V0 G) V9 c3 @
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF: q, M; u5 ~( ?3 o
      mov     ax, $10
. x* A" `: E# p) E
      call    CallAddr2_0053BBFF
9 e4 X7 O# m  T/ @1 L: q
      mov     edx, dword ptr [ebp-$14]! Q* l' v1 u8 L- C
      mov     word ptr [edx+3], ax* `( I' ~" G0 X/ N. k$ X& O
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
' ~: \4 Y# t6 I
/ `/ X! e4 i( s$ M5 y% ~: {) M/ s$ k
    @Seventh:
6 C+ Y; m7 V6 r
      cmp     eax, $11                        //比较是否等于17
1 F, m" i4 K' P7 Q- ]4 J) I* K
      jnz     @out                            //不等于就跳转到默认部分
5 L- a# T7 c% C) _! {% E

. {4 Q3 i/ n3 Q2 Z
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试- ^# V) O0 g4 }  P7 O/ \! Q
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
+ I& g$ L# d+ Q4 K4 S# N
      mov     ax, $A5 _- r! I8 b$ g; d! R
      call    CallAddr1_0053BBFF/ @8 Q, M: g% ]% Y9 J
      mov     edx, dword ptr [ebp-$14]
$ K% P3 u2 I( M! O2 E
      mov     word ptr [edx+1], ax
1 S$ e; t8 h0 _& |, J
4 P$ S% M! u9 q+ a' l
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
( w! r2 U/ M8 F
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF8 A+ S* ~9 w7 T! c, p
      mov     ax, $10
7 f, j9 ]: d# W9 J
      call    CallAddr2_0053BBFF
  w7 E3 |: W1 N. D3 }& r
      mov     edx, dword ptr [ebp-$14]) ?' m0 x9 S# }& f5 O( q
      mov     word ptr [edx+3], ax6 ~* }5 i$ k; W: D  i
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs  ?! A$ f4 H" ~4 E7 r9 F
                                               //7 W6 W! M) d. l
    @out:
0 K  L# [. N) b3 b( R, C
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点  K" L+ s. H! }* l8 i  u* ]* X5 v

1 l5 W" b4 U$ j7 {0 F$ _8 z0 G
    @OldCor:
0 q2 b: e8 K+ _
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值, N6 g9 X' w6 Q. F
    end
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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