三千论坛
标题: 初步了解tgs插件的写法 [打印本页]
作者: 异仟年 时间: 2022-9-5 20:27
标题: 初步了解tgs插件的写法
本帖最后由 异仟年 于 2022-9-5 20:28 编辑 ) C' r5 U9 u' A
/ H+ |, F" [! @% b2 F编写需求条件:1 K2 Y# k: U) C
0 S$ t: O1 H3 r1 m( j0 Y1 D7 V5 A$ x
od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)* F% f* r7 T8 n o; {: h R0 n
9 }4 M0 f9 L" U- G+ X2 F7 S
6 k1 U' E) \3 D* D) G
编写过程1 G; {& s! `8 I
& G+ e. G% ? y! g第1步:: q+ C) [+ m5 U7 ~/ d' A
6 C4 T0 z* Y. t, y8 W, F/ \/ n 用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面; _" G+ f$ }% i
- H, ?2 m# |7 o
3 p& c" T% i- a0 o第2步:
- M: u( Y" d# D, e% M8 a) B
1 A% p1 @- Z( |" _6 Q" e 打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序7 I& T+ |. J9 @: F) F" Z
: |% K' C# h8 `; i' v
启动客户端进入游戏(后面要用客户端)2 u# q; Y/ `+ L8 v2 d
0 D' u, E! H0 Q7 a, _1 K/ M& X 调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe4 j; O4 [+ {3 b- R4 w, F
( O. j }. v1 @6 v9 P1 O
在出现的界面上右键 菜单->查找->所有参考文本字符串 od 会扫描程序
. Z2 D9 I- @/ y6 K. y' {
/ n! W- p! _6 L4 J V; n: K 提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到4 w$ x+ |$ |( J# u O) z0 `( f- o0 m
4 f/ x1 n) g+ V/ u! W9 g
od停在9 z9 p/ F& G# z/ _
3 I' C' L+ }: C1 M G4 r/ K 0052A0C7 mov edx, 0052FDD0 ASCII "<SYSTEM>: "
6 v' n' R8 g6 `- v2 z% U. [" X; Z! Z) F% w3 Q
双击这一行 再次看到od定位在汇编代码显示页面
6 c( B- L- \, J% m2 | }( p# `3 `/ }+ A. @: \6 U! M
) [9 I6 Z3 R1 ~+ `2 U1 P
0052A0C7 . BA D0FD5200 mov edx, 0052FDD0 ; ASCII "<SYSTEM>: " , ]0 p. |: Z/ y- o$ \+ X
0052A0CC . E8 C7A5EDFF call 00404698
' T2 y) s: q" J, P- v! T 0052A0D1 . 8B95 ACDEFFFF mov edx, dword ptr [ebp-2154] ; 赋值edx 为中间屏幕显示的内容' i. Q5 o: t- F
0052A0D7 . B9 03000000 mov ecx, 3 ; 这里是色彩的选项 后面会调用* F& Y5 g1 O, s! f K5 i" A
0052A0DC . A1 70855600 mov eax, dword ptr [568570] ; 这个是UserList地址 参考侠中道代码可以知道
; \0 P% V1 }( T7 v5 ~. x2 C 0052A0E1 . E8 D21A0100 call 0053BBB8 ; 屏幕中间喊话的call 0053BBB85 k8 d+ r4 B9 q A
1 K- R+ S7 j0 v2 W
定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM喊# ?????. }0 t; |- m9 P2 `% q# b- a" _
; \' D! F% \$ y. O, ]
这时od会被中断, 断在刚才下的断点处, 这时按下F8 ) k0 Q% o! n E, `* u. u
. z- M3 y0 T, m- k
到call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩
* n5 Y K7 f" e4 t: W
6 S; S- `) X/ z0 R6 `* {9 } 同时发送数据给客户端
/ q: T" @# j9 I4 M. z3 [3 [8 Z
2 z" j# k: T, G) F , n/ l- s) h N) g( G9 a
进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过% r5 W& R7 Q- P
. u4 G5 W: C. N. G& M) C 0053BBFC |. 83F8 0F cmp eax, 0F ; Switch (cases 0..F), F5 R7 p9 `" @
0053BBFF |. 0F87 41020000 ja 0053BE46
/ D+ U) f) S+ D2 p( t& i: L9 t+ X8 [( y9 |9 M9 g) X: M! ?$ b6 v& T3 D
eax 这里是3 一路F8比较下去到下面这里
- q& t8 O" d8 I5 x5 h |$ k6 ?7 T7 R
0053BCD9 |> \66:B9 1F00 mov cx, 1F ; Case 3 of switch 0053BBFC
7 G3 y( G K& `$ b: m2 V 0053BCDD |. 66:BA 1F00 mov dx, 1F
+ l" j5 U/ M, e! k V, \/ T8 w 0053BCE1 |. 66:B8 1F00 mov ax, 1F
8 [% J) K& R9 s) @ 0053BCE5 |. E8 EA54F2FF call 004611D4& O$ Q! P3 D& G
) }9 i7 F; B8 v; {9 b( f1 N7 J* ~ 这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 的3个参数 % S$ N3 q# X1 D. b9 f. w8 T
$ g, o5 q2 l5 j# _# b call 004611D4 就是调用 winrgb: p/ t1 l; J! W- ]. L% G
& O- K/ Q; ~3 b5 O8 V- U" `" N/ q
/ K1 d/ P$ l. K+ ` `
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
* v" ?9 z# b2 I& p
' n. j1 u4 d1 t7 d Z% Y: H dll里面进行内存地址读写+ ~" Q2 e0 f$ N3 B
j( h* M Z! r: l; N3 d! z$ @ 我是在
! p. |1 _% C$ G; S8 N ( J6 V1 b% u/ B
0053BBFF |. /0F87 41020000 ja 0053BE46
+ e( G; U$ |; r: k' q" |) C9 v$ Q6 {/ x% i
在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写* A$ b0 t# Z; b0 U/ j' ~
$ P6 b: B9 u! x. ?3 j: J L# T, S procedure InitDll();
9 p, i( v& r0 e$ e6 H3 \# U var, o( E1 `- C0 S5 ]3 [* U
p: Dword;& _+ D4 h& t# @( w
begin# s" y& _3 J$ U! T0 J- d0 A# y! E
p := $0053BBFF + 1;/ N$ b$ T" F C
PDword(p)^ := Dword(@proc_0053BBFF);
9 \% K' c4 ^, R8 j7 s% V: R x end;
2 m" t( ^# t$ @" e Y! D: `! F# G6 ]) ]% n) D1 a* R2 e# L
在自己的代码里面写一个色彩增加的函数判断比如/ Q) @- q; k" h& X: c2 k( H; [
- O8 h$ _/ D8 }: D' l delphi代码:/ x X: x7 e% b( c1 q- E
0 b% M* |/ z+ z$ s3 K
var
: t, l; x% @ g- _) j EndAddr1_0053BBFF : Dword = $004F470C;
' {; R' z5 v; F0 J4 ~ EndAddr2_0053BBFF : Dword = $004F44CB;9 K# V; ] s7 T( b1 J
EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转
% f% c4 W3 f3 L- _4 c4 |4 | K1 I4 s1 {$ ^6 }+ d3 P1 b* Z D4 _2 a
CallAddr1_0053BBFF : Dword = $004611D4;
/ V8 n2 B# K- @$ i5 O7 Q CallAddr2_0053BBFF : Dword = $004611D4;
% k4 q3 A; |/ x4 n' S$ @
p+ U8 p& N) N procedure proc_0053BBFF();! k( z) q" ?# f1 P9 n. ~
asm
( e6 }) J+ a0 o$ \3 @. S- t cmp eax, $10 //与预先设定的 最大17比较
) u- S. F8 k0 o! e JLE @OldCor //小于就跳转到默认16种色彩赋值
" M- x, E' D' t" X: K$ S" K* g. F6 }( ?6 G3 u
cmp eax, $10 //比较是否等于16
! h" T' d1 S( f N jnz @Seventh //不等于就跳转到第17种色彩判断部分
3 S' j* n' ]& b8 E" X1 g6 o, e
/ T; r+ A9 |: r% C( o mov cx, $A //字色或背景色? 没有去详细了解请自己测试
+ _) f) d, k' `& `$ S4 b' V8 ^) F mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF% ^5 R, g3 o7 `9 ?) u! {0 B
mov ax, $A
5 L4 A& S, q8 X+ L% i# l call CallAddr1_0053BBFF
9 l0 Q; O' P o mov edx, dword ptr [ebp-$14]
% U) ]( j! b/ Y- h u0 k mov word ptr [edx+1], ax
y" P) l! {* ~# D Z: e- t1 j" A/ ?7 V% @
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
2 ?$ [/ m7 y ^+ i8 _, V mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF: y2 ^( J4 B; p
mov ax, $101 H3 \+ ^% c3 R" S/ h$ _
call CallAddr2_0053BBFF! D' K5 v6 s0 h/ e
mov edx, dword ptr [ebp-$14]$ c/ [/ ^! @+ b B4 B
mov word ptr [edx+3], ax- a& R! F' n! k2 W& h! d3 l. ]
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
, Q7 j3 w3 t1 Z! M2 q! D
# S, l# @/ ` n' t0 S [ @Seventh:
0 F1 {3 E+ Z% b. Q8 ^; a/ S cmp eax, $11 //比较是否等于17
1 O6 {" |- d5 y( W9 K jnz @out //不等于就跳转到默认部分
9 ~" R% q2 [; ^1 \, P
' k2 j' C' t8 C* J mov cx, $A //字色或背景色? 没有去详细了解请自己测试
( ?- I8 ^" [2 ` mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
1 i! n- V/ t) o% T mov ax, $A6 v. c) [3 j. H# m# X# n
call CallAddr1_0053BBFF
4 [7 f) Z/ R* c' F. l9 `2 W4 O mov edx, dword ptr [ebp-$14]
4 w" N0 ~+ [6 S M6 u+ _) K mov word ptr [edx+1], ax
4 V/ ]. \5 [$ m0 _' b
% U( c r* q% U; w mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
- _; h& W# U8 V mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
3 ~6 D7 ^* Q+ d. _& O! f( H1 c5 J8 f mov ax, $10; S; ~3 U. O0 [. y
call CallAddr2_0053BBFF
) R L0 E6 H9 ~' a; q2 v2 P mov edx, dword ptr [ebp-$14]5 |$ q. d& L0 T- [/ T6 Y
mov word ptr [edx+3], ax1 n. q! O _0 f$ U0 b! @: ]
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
) C; ]) X! n2 }2 o //
4 x, f$ R9 ^+ R, ~& x0 A @out:4 j, Q6 r; ]( d4 F5 c3 Q
jmp EndAddr1_0053BBFF //这个是跳转到默认的点
; |- q9 ~1 K2 f- A8 b, A
; ~, D# z: j: U2 Z4 P @OldCor:& L1 m! r' }4 u0 g* f6 `) F
jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值
6 E: ~4 w* W) T" m end
欢迎光临 三千论坛 (http://www.3000y.com.cn/) |
Powered by Discuz! X3.4 |