游客您好
  • 点击联系客服

    在线时间: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 h+ ?+ k! d  C/ p" V" D' C; ]+ h2 A
; ]) Y4 g6 \+ w2 {* I
编写需求条件:8 C, D4 ^4 ?, o% m

# Q/ p: \' n5 w+ m, S& t" M4 k    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)5 ~7 \, m5 w" C: y8 q- b# r4 Y
0 i' j/ J, `  I  H% C( q! e

% X0 w; [6 m8 O" S$ W$ }- J编写过程5 Q  D9 Z4 P& f/ K7 K/ z! `
" j* S! N) p4 B4 L  l) A/ ^
1:
9 s/ |5 K: p  N' V4 G  x9 j$ @* J! N' O$ X' G2 C: m* M, D" w  y
    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面
6 \/ @. u! L) d# f# P% J3 ]/ A4 l
& j3 R. y. N7 `* ~# i' @9 z
& P5 }8 f+ R0 d( [2:- e8 R" M( U8 b+ @5 U0 q5 ~
( R, G  H; b6 Q4 m, D6 k
    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序
( u  q3 D2 D8 Q8 @& F5 s! S5 m" `) ?; [. ]3 a& p0 u& y
    启动客户端进入游戏(后面要用客户端)
9 |( l1 N( y: z6 R. H  W' Q; Y0 o+ c/ P  }4 G1 b& n
    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
$ M; d% i7 D" l5 A% J4 n& H" g- P- D5 D" R4 z: W7 s: i: M- @
    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序 8 B. i& [: g; l& K; u9 d
; ^* m& h9 a! G
    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到$ {) S) E! w. r; E* ^9 }0 U

, e$ _1 v3 v  _/ G' g/ D7 j    od停在
; \- ?& w2 u) P1 t$ m$ q( ]
. [2 a4 f- Q( Z( q, \0 t/ T    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "
2 d5 @. h: Q; J6 j; i; [+ g9 T6 F5 a
  L; ~$ d. d6 d: {4 V, B1 A    双击这一行 再次看到od定位在汇编代码显示页面
/ N1 H0 v) @# _- x+ ?" E
7 m) [. K9 i* m7 f5 O" `
. b' S" Y2 k- c( q7 p1 H        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: "
3 @( N0 |: ]8 g; [3 o2 |- G        0052A0CC   .  E8 C7A5EDFF   call    00404698                                . n; i, R- S3 W. r% r7 W
        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容, B2 j2 V9 L& ?+ n. @
        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用
' B- L" `  I' o7 k$ ]) P        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道          h( D* v/ T& N1 Y9 Y6 s, {" n
        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB8; m5 {7 P8 i, ~; x) S, i
% V% r4 a' Z  ?7 B3 s, ~- d9 d9 k3 b+ _/ g
    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????
, ^& E4 ]! c! }  K+ J   
" O) M7 d0 W5 R+ \    这时od会被中断, 断在刚才下的断点处, 这时按下F8 1 U' Y+ ^( ~4 O( @
; m& U( V, x6 {. J5 F
    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩* O. A7 Z: ~5 S

* x" [0 f% \  }7 ^, N& }    同时发送数据给客户端$ N' R8 k9 d$ Z. F, `* |
# H/ U5 j) ~5 f/ A8 ^
    ( `0 p. e, g+ |: ?; C
    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过1 N, u2 A4 c6 N; @6 {0 H' [
  2 X3 R4 _3 J7 u5 ~0 M
        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)5 X! _5 M/ q: f( R
        0053BBFF  |.  0F87 41020000 ja      0053BE46
% N6 C4 V) m- t! H6 ^
7 R4 ~9 ~- l- c0 A. r8 a- a    eax 这里是3 一路F8比较下去到下面这里
2 v3 O5 r) D4 i& X4 U' m
( u7 E! d  c: I8 R" [1 _9 Y        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC
# h' N) J7 E7 a        0053BCDD  |.  66:BA 1F00    mov     dx, 1F
- n0 `( ^) B0 {4 ?3 H, f        0053BCE1  |.  66:B8 1F00    mov     ax, 1F" ^8 m6 d5 w2 V( Z. K
        0053BCE5  |.  E8 EA54F2FF   call    004611D4
3 i5 \- u2 j  i$ h8 N, L& m3 q% w2 ~% e- }. ]
    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数
' `: \; P9 r, a& ?' Z0 J1 t4 z2 ^    * L  Y5 y# e/ ^" i0 e
    call    004611D4  就是调用 winrgb: i- ~. b: r: U  C8 ^

$ V; ~* ~: d( |8 u& @# P' [6 |7 A0 }8 Z7 [$ n
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
0 d$ {$ p8 G" _3 ?/ r$ z7 {( M

* v' [$ S3 H# V* H6 O5 q
    dll里面进行内存地址读写& W- m2 I2 H6 Q! `9 l

' h5 j3 O) C' r# e& q! p" h
    我是在( f) a# ?8 R7 m) v) |" F
   3 T  |1 c2 k$ K8 E3 o
    0053BBFF  |. /0F87 41020000     ja      0053BE46
7 g! c( `1 Q- v) P/ q
, q% C" I0 t- k' Z; _! u
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写- p" |3 {. k. _6 {7 t
: j& b9 N; E* F& \( ?9 {, g
    procedure InitDll();
) w2 u: X$ T1 j6 `* b+ P6 z5 b
    var' x. i! g  M0 D! T4 R$ s
      p: Dword;. w6 T2 |0 ^! A! M5 ]8 n- O
    begin4 b% v1 n# Z& ^" R! e" }: V- y
      p := $0053BBFF + 1;1 L8 \' y5 [* |+ t$ A* ]
      PDword(p)^ := Dword(@proc_0053BBFF);
- d( F9 K/ |3 s! e) Y. ^% N1 `
    end;* P+ o. \! B: n9 |

" ~0 o; L1 {2 V! N! R9 X4 {* _3 @
    在自己的代码里面写一个色彩增加的函数判断比如
" Q7 }8 @. B1 K  {+ L% e

$ s. g* }8 K- d3 y. H
    delphi代码:' A5 |5 ?! n$ Z; w0 e- K
5 G) I  u) k# h( ~$ {
    var
+ w4 \8 N" k$ c0 C* d
      EndAddr1_0053BBFF : Dword = $004F470C;: j; U+ _( {" D6 T  \
      EndAddr2_0053BBFF : Dword = $004F44CB;! D7 x* L5 b6 i+ w3 n# Y& g, D/ @
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转9 a* i  n( o) A. M* ^, Y- G
  s. ^, ^( \7 _8 k9 K
   CallAddr1_0053BBFF : Dword = $004611D4;
6 G0 C, S- r& C* r# u. j9 m7 \
      CallAddr2_0053BBFF : Dword = $004611D4;
3 S+ l$ E% U2 Z# @, e: b1 e
5 P* t% l- g* e" T% z; T
    procedure proc_0053BBFF();1 C  q! w4 d( X1 }  H4 V1 ~
    asm) j8 N% [) f+ m' W* R( F
      cmp     eax, $10                        //与预先设定的 最大17比较9 \0 h3 g+ z% _. e2 q. y7 o& }! O
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值3 L2 V5 y/ Z7 x* B* Z
: o  @. |7 L2 A% e4 K7 I+ r
      cmp     eax, $10                        //比较是否等于16, w+ i6 V) K! _: A
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分
+ @3 Y6 n0 m8 B# B. T- H

1 m: H  L$ N$ o3 k) ?9 j
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
6 m/ r; y) v; @: P5 E: R% N
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF- K0 [& W+ [8 ]( U1 j4 {' @4 R
      mov     ax, $A
# D1 Z) o' p; [3 l' R
      call    CallAddr1_0053BBFF
+ C4 V( r1 R7 |! V& e' L
      mov     edx, dword ptr [ebp-$14]
6 J3 }4 @- Q8 E! a8 j
      mov     word ptr [edx+1], ax
+ x* J8 _. Q' V& T/ g  z, P+ n

: n/ Z% S6 G0 T
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试( U7 {6 B! k9 ~' L" m
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
! }' k/ ~7 i1 D( z( Z+ X
      mov     ax, $10
4 F& l0 r4 A( }7 U# a' @
      call    CallAddr2_0053BBFF% L' D' X: `+ b) L
      mov     edx, dword ptr [ebp-$14]9 x" P3 q9 q5 m' Z* E& ~. ^
      mov     word ptr [edx+3], ax
8 m) w" z. S* r* F, c; q9 g$ w
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
2 I3 f5 P8 h9 y2 n' E

# \, @! q9 j* y7 Q+ }  y6 g3 z1 b
    @Seventh:2 ?: j6 `! Y& r" E) y3 l$ Z
      cmp     eax, $11                        //比较是否等于17# N1 B' r' w4 _) x
      jnz     @out                            //不等于就跳转到默认部分
/ `6 n; ]3 p& E# \; }
- c1 [" X) \. W
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试) C( d! t2 }% ?" x" O! g' q
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF; g" T! Q$ x# X1 s% [
      mov     ax, $A
2 r- \( a/ F  C# v0 e1 o3 _+ m
      call    CallAddr1_0053BBFF
) e/ c, |4 ^$ I
      mov     edx, dword ptr [ebp-$14]8 |1 q) s& ]$ n( F
      mov     word ptr [edx+1], ax5 ^$ _  x9 y& u- J1 P
8 E. i+ H1 D; H4 E, ~. j; I0 ^; d
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试0 q! `* t0 l" M0 s+ \4 Y
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF) `) U- L7 z- h
      mov     ax, $10! O# z* u8 q" P2 P# V4 h6 B
      call    CallAddr2_0053BBFF4 I7 _, n  g9 l" c
      mov     edx, dword ptr [ebp-$14]
. i+ Y3 b( P3 X' p0 n) c  T
      mov     word ptr [edx+3], ax
! F. R" r$ j1 i6 M7 n; C* d, e3 |( _
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
4 m# u' e3 x/ c" k) l+ U% D
                                               //2 L! ?3 x% z& [6 o
    @out:% v( }6 S1 o# i
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点
/ @% f1 _. z. K! Y9 p2 d% y
* W  A. }+ n# o; G+ t
    @OldCor:1 U6 h: t& u( L6 ?" r9 l
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值
4 X  \7 S  ~, [
    end
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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