三千论坛
标题: 初步了解tgs插件的写法 [打印本页]
作者: 异仟年 时间: 2022-9-5 20:27
标题: 初步了解tgs插件的写法
本帖最后由 异仟年 于 2022-9-5 20:28 编辑 4 I) |; U) Y: z
# g$ G* E, L% M; r
编写需求条件:2 w4 R: P+ a7 P6 f2 @
7 O9 y% c$ G; j- | od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++); C# O- h, v/ }# q! U1 i) `6 i
. }( G, n4 a! D9 m k; z
6 O/ l' N! O6 u! k) e编写过程
. \ O/ Z) L; g& k. I, {* R
5 X3 S) K/ e, y* [第1步:
* H7 B5 I0 e, Y" x8 F$ l
1 w! V/ o( w( [% J- B* n: F1 ~& M 用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面
6 Q+ ]% Q1 l0 K9 A6 ~" q/ l+ z; o w" l' A9 l J
" A/ s5 l9 e5 E5 ^0 i第2步:1 Q3 j/ o9 k6 V- I1 ~4 V
* N6 @0 m; o- e) Y0 I* F" x 打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序 ^' C) z: j+ S6 D- f. f
) P" c* U, _! u* A" g, Z: x, v: f% O, X/ L 启动客户端进入游戏(后面要用客户端)( Z7 o) y/ Z" ], b2 s4 V' B9 `
# T* |" X1 D; Y% H# n/ E 调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe, u2 c; [- [# x# z$ V) t1 D
. I, j8 V% y* f) t2 S. D- a 在出现的界面上右键 菜单->查找->所有参考文本字符串 od 会扫描程序
* ]: {5 ~% X3 I4 W1 y8 T( ~9 m. i9 I/ l: R% Y
提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到3 L( J, Z6 X. t& E
$ |7 l. N: m; Y7 B1 J od停在! A5 V6 x2 ~4 H" ^0 u c
6 h% s! R) P( w; K: E8 K
0052A0C7 mov edx, 0052FDD0 ASCII "<SYSTEM>: "
. @$ m! V e. B# [" E# r* ^0 M. E. K; f
双击这一行 再次看到od定位在汇编代码显示页面
3 |; f: L u h
! W" H+ _3 r! w0 p# q9 F" L: k, \; L, I7 n0 {+ z Z' U4 m# j
0052A0C7 . BA D0FD5200 mov edx, 0052FDD0 ; ASCII "<SYSTEM>: " + u$ o4 @: Y8 N2 m0 l, U; ^9 v* Y
0052A0CC . E8 C7A5EDFF call 00404698
, V6 p/ N7 ]& A# r6 {# z4 n' k* s 0052A0D1 . 8B95 ACDEFFFF mov edx, dword ptr [ebp-2154] ; 赋值edx 为中间屏幕显示的内容6 I% C) a5 f" u8 E' f; x, x
0052A0D7 . B9 03000000 mov ecx, 3 ; 这里是色彩的选项 后面会调用' D! m ]9 w# x0 @8 T
0052A0DC . A1 70855600 mov eax, dword ptr [568570] ; 这个是UserList地址 参考侠中道代码可以知道
$ A ~5 K" q3 s) X6 |2 A" k 0052A0E1 . E8 D21A0100 call 0053BBB8 ; 屏幕中间喊话的call 0053BBB8
& M2 k& N8 y4 t+ N7 L, I
, q. E6 H* _' b `6 j 定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM喊# ?????& f, O3 [; o( x* v5 L& z
' n$ B2 Y% k' R% N( ~* a: {7 Q 这时od会被中断, 断在刚才下的断点处, 这时按下F8 2 F1 K$ A: S1 g; Y0 X6 c
; v. n- r& M/ z' l! y: r* N
到call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩1 O) X7 _0 u+ t/ I5 q
, i3 Y4 C( X5 d: o z
同时发送数据给客户端
! h; w/ c Q+ h" S! M8 j2 ?7 o# t s" M+ C8 H) p6 Z) }; a1 k
4 F( `( M" b9 r" w 进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过
$ g$ _3 C; N5 x& y
* p( e3 q8 M! Z( f; @" p 0053BBFC |. 83F8 0F cmp eax, 0F ; Switch (cases 0..F) }9 `% D% i, ]7 m# J( o p
0053BBFF |. 0F87 41020000 ja 0053BE46 ~- t+ W" O- y' f; K
U8 N' F9 E- I2 {8 ^) K eax 这里是3 一路F8比较下去到下面这里
6 T9 i' a/ O, t1 e7 J6 x* A& s! O! s. p2 E$ U
0053BCD9 |> \66:B9 1F00 mov cx, 1F ; Case 3 of switch 0053BBFC
' @* [( r- K* h0 j0 Y( ` 0053BCDD |. 66:BA 1F00 mov dx, 1F8 `& ]5 M5 V# ]$ r
0053BCE1 |. 66:B8 1F00 mov ax, 1F; o5 o3 X ?* N. p
0053BCE5 |. E8 EA54F2FF call 004611D4
$ n& I& @" d$ g" N7 G: s+ G( X# D+ }9 @
这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 的3个参数
& {- b. ?, R2 \' {7 j. ] * ^+ a/ q7 `# b7 c
call 004611D4 就是调用 winrgb; d! h0 b, V5 F) x& E
/ T# ]7 B, }/ W I( Z4 T
4 u B$ V' o& D9 i, i* ^
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在; |8 E) q1 {) B' | c3 ~! i; f
$ V& Y# F& Y: K x7 h* H dll里面进行内存地址读写+ |- M3 _/ u- s' M, s
% P8 u! n4 h5 K+ z) e 我是在% S# z5 I# z, S7 n: J: i/ l4 t; B
8 Q) R1 B# \) G2 Q7 j8 r. G
0053BBFF |. /0F87 41020000 ja 0053BE46
, p' V% O; d; S7 i7 U
V5 e# h; D, t6 c 在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写
( ~+ \" l3 R/ a
_' d. x' H% |3 r& T7 p1 Q procedure InitDll();
) q& t" t5 U! t: @8 B# z var, D/ Z% h' `; A$ e9 {
p: Dword;9 k- v/ [& |/ U; M
begin
r) r% w# i7 r. R p := $0053BBFF + 1;8 R4 U5 n0 S& X$ ^ {6 W
PDword(p)^ := Dword(@proc_0053BBFF);+ V5 G, p9 @6 H0 h3 g8 R
end;
; k$ g2 Z" u* \6 ]3 ]' ]/ L5 u; o8 S& E' L! B5 C3 a% x+ b5 U- x
在自己的代码里面写一个色彩增加的函数判断比如 \# G1 c2 D: D% o6 K8 L
}) W: u% D6 B- { delphi代码:: l$ f) a3 X6 v, h7 p
* u8 y+ _+ X/ Y0 P var
* _1 D5 B3 K# w EndAddr1_0053BBFF : Dword = $004F470C;
/ Z& K( k+ z+ x' U2 d+ M EndAddr2_0053BBFF : Dword = $004F44CB;- x6 e' g1 w, a7 ~0 U q% Q6 j
EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转
' U$ U5 H9 k7 ]/ P7 V3 _& C, [5 n# d/ U8 l# l S9 ?' B8 ~
CallAddr1_0053BBFF : Dword = $004611D4;# Y+ T. \' z- e5 ?; s
CallAddr2_0053BBFF : Dword = $004611D4;
$ t u5 j: e8 ?! m0 _& o+ ]
+ P7 ~, f! k. t% p0 a procedure proc_0053BBFF();
, Q& a+ h& P: J$ x- Y" \6 w asm A7 m' a1 n: X5 P/ l4 b+ X
cmp eax, $10 //与预先设定的 最大17比较3 m7 |' W5 b4 Z9 o; Q
JLE @OldCor //小于就跳转到默认16种色彩赋值- j/ ^0 ^7 t) [4 h, p, M* n4 W, a
* ], T0 l7 _+ B4 N cmp eax, $10 //比较是否等于16 z; I( c+ [5 `) W- A+ ]1 t
jnz @Seventh //不等于就跳转到第17种色彩判断部分) \5 ~0 M3 E U4 m3 y1 D# T ]
: w$ F* E' t3 O9 k1 e. e4 D mov cx, $A //字色或背景色? 没有去详细了解请自己测试* v* s3 M) P3 {" D2 x
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
. d! `' l' P2 F mov ax, $A8 h8 N$ k% w5 _% G% w8 H! [
call CallAddr1_0053BBFF
7 ?: m9 U' O# j5 I( G mov edx, dword ptr [ebp-$14]: E7 u2 t; d: y
mov word ptr [edx+1], ax, t% v9 U" M6 s# G, `
" L; X$ e/ w8 H0 H% q
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
/ D. g4 O& }2 ]% Q* F) r6 F! e mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
/ h2 q, u% U6 s( W mov ax, $10- D" N, u- m0 _6 x
call CallAddr2_0053BBFF
& ~& v8 F, ~# l7 b mov edx, dword ptr [ebp-$14]% Z% j7 H5 ]- \2 O9 S
mov word ptr [edx+3], ax0 P" I) H) {7 t7 q
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs2 {+ {9 r- f% l5 Y4 ^' N+ H
. r [, T1 X. F2 H1 F- o7 H @Seventh:( l4 F0 _9 M- n: |" ~# ~3 e2 f
cmp eax, $11 //比较是否等于17
- o' [' R( f5 b2 c8 f jnz @out //不等于就跳转到默认部分# y9 \- H/ _' l
Q m. k5 ^( |# d# d, h+ o mov cx, $A //字色或背景色? 没有去详细了解请自己测试7 e0 H" y# C5 E* {' {4 P* j5 O* G
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
' n/ R9 Q+ c( F z mov ax, $A
8 g5 Q* U1 J4 T# A g | call CallAddr1_0053BBFF; h* e6 g# k, M5 U& S
mov edx, dword ptr [ebp-$14]
$ ~% S7 X* O' b) A% H5 x+ e mov word ptr [edx+1], ax$ @8 m' v7 M/ S0 `7 X& ~' r
/ a. _' m3 }1 X; w. k$ N1 r. R) A mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
$ r$ f9 a0 ]7 F/ Y) d. E* U. V mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
' |7 j; T: R$ ^* q- a. B- @ mov ax, $10& t, I, [3 ?, s: U# a
call CallAddr2_0053BBFF0 O% G n2 ]7 Y8 [/ |, h8 w
mov edx, dword ptr [ebp-$14]) d& H9 h" a W, v& F. K& w
mov word ptr [edx+3], ax6 G* F: R1 f( ]: c4 R4 n4 Q( ~
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
9 p9 f7 u* ^% d' |/ e //
) c8 w9 C5 E+ F$ Y; t; U* k1 B @out:
4 g# p J" Z2 f) I; l9 M& p( S5 J jmp EndAddr1_0053BBFF //这个是跳转到默认的点: \( ~4 ]* z$ M! Z
& y* t! D/ ?" {+ ^/ ]1 d# l
@OldCor:3 e6 G3 L0 L6 g& K, T5 F) m9 p" O9 C& J
jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值2 t5 ^9 c( D; w y
end
欢迎光临 三千论坛 (http://3000y.com.cn/) |
Powered by Discuz! X3.4 |