本帖最后由 异仟年 于 2022-9-5 20:28 编辑
9 |8 X; B! Q6 L2 }8 n) Z+ H9 }. q% _: F% `
编写需求条件:5 c& F8 F* Z" M
: O [. f2 `; {2 k* A. ^5 O od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)
- G& k+ f; ^& V5 n9 F Z$ S
% r' @) r; s2 b& b" O; S
5 V3 Q3 {8 t* I. [: A% }编写过程
9 o" I. w5 Z0 z# ^2 e: V. u+ V* H% q0 P' L6 r% P4 e5 n( z: e/ I0 M6 E
第1步:; |- {: n' R: K' X
0 J) a, ^9 c; x7 J
用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面) J2 b' T& P" S/ b$ b c
$ y) ? v- [! S) i
& M' d* W: b3 I0 N$ H3 \第2步:
+ I3 t3 @8 a- i# l0 R3 S5 A3 w8 O
打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序& p; A) G1 J- Z `
2 {% {3 W+ x3 h! J3 u2 {+ W' ` 启动客户端进入游戏(后面要用客户端)
& w% H1 }: G7 b$ q* r* [4 V' A
4 ]% {! i1 W/ a$ J4 t: O% m9 ^ 调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe5 b0 ]3 W4 v; I' C2 F4 O
3 L* J# O4 S0 W( l' r2 P* r
在出现的界面上右键 菜单->查找->所有参考文本字符串 od 会扫描程序 ' G6 \' p2 ]! e
# s1 g5 h8 w" H0 z+ L2 D& H4 f
提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到3 L& a4 h( x, A: z9 E3 ~, v
# b1 p4 l8 m/ O0 L, a# U- h6 Z) n* |
od停在# E+ u8 k" s) }: a% H# s8 G
% b. Y4 @8 }2 c9 B& R3 v1 _, v 0052A0C7 mov edx, 0052FDD0 ASCII "<SYSTEM>: "! D1 u/ B; C6 v6 `* Y1 S% i
9 X, M6 m, B4 f& s/ |& b 双击这一行 再次看到od定位在汇编代码显示页面
* t. z o2 R3 B: v0 M/ V
3 n5 h" x# e+ c: Y* F3 J& X% _; X
& u( Y# M5 ^8 ?5 z 0052A0C7 . BA D0FD5200 mov edx, 0052FDD0 ; ASCII "<SYSTEM>: "
% `/ W* W, e% B* y 0052A0CC . E8 C7A5EDFF call 00404698 E0 s' @! v- `4 @
0052A0D1 . 8B95 ACDEFFFF mov edx, dword ptr [ebp-2154] ; 赋值edx 为中间屏幕显示的内容
, y f0 T& K: |" v% X# O 0052A0D7 . B9 03000000 mov ecx, 3 ; 这里是色彩的选项 后面会调用
" ^$ v5 Z6 G1 I1 ^ 0052A0DC . A1 70855600 mov eax, dword ptr [568570] ; 这个是UserList地址 参考侠中道代码可以知道 . r9 Z6 `" _! @* L: p
0052A0E1 . E8 D21A0100 call 0053BBB8 ; 屏幕中间喊话的call 0053BBB87 Z% W8 w; L, {( m
6 T, \$ A1 x# Q7 \" S) y, K 定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM喊# ?????
9 G- k* |, ~0 A- U " P5 R J/ X- i% f7 [; m* p
这时od会被中断, 断在刚才下的断点处, 这时按下F8 h. x% Y: W2 _- s0 ?5 J
3 E7 F- X3 v% J' L 到call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩6 R/ V( i: w Y5 d- q% g& O5 c
2 c% O3 m1 t/ Y: | 同时发送数据给客户端( r6 m' e7 Y9 I( _; K) o2 d
: A0 O4 Y8 s. b$ I$ m9 C: l
# W- o+ H4 L0 m- t& L9 f: o! S# l 进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过
# Q/ t& n7 t/ O' O, h
4 d l9 B3 s, |! W 0053BBFC |. 83F8 0F cmp eax, 0F ; Switch (cases 0..F)8 n. J# f- R. D' C8 D* O5 J
0053BBFF |. 0F87 41020000 ja 0053BE469 A0 K& w5 O1 o/ S% v
; T* u$ C: L6 Q9 O6 D7 A# I+ ^ eax 这里是3 一路F8比较下去到下面这里
. K2 B; S& D: ]3 C# t( y( L+ O1 Y( N" A. u4 e. j' ~$ ]- q" o
0053BCD9 |> \66:B9 1F00 mov cx, 1F ; Case 3 of switch 0053BBFC' a/ v# K8 }4 q0 d$ H' C
0053BCDD |. 66:BA 1F00 mov dx, 1F( {4 B3 P4 H& S
0053BCE1 |. 66:B8 1F00 mov ax, 1F9 u4 l& n$ T$ Q) a! k2 Z7 l% y8 z
0053BCE5 |. E8 EA54F2FF call 004611D48 ^" ~& `9 I+ M) Z: P) c2 _4 h N
* z# A, c/ z/ `6 K# L, U" M: O5 v 这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 的3个参数 2 \0 u$ v; x- G) E2 h
6 b+ j3 ]- I% ? call 004611D4 就是调用 winrgb) k% u3 K& c$ n# z
7 h! F' @) y" P2 a$ v& y
, C. L/ S2 p9 H! `0 Q上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在" _. Y1 D: E( |" S& l
8 @2 A! T$ B8 v Z. J dll里面进行内存地址读写" }& _" I3 m4 I- z& `
% C z, F: P' j; Q
我是在
! s3 g8 e4 ]) g5 l1 U; e( |
% p' I+ Z% j% y, d 0053BBFF |. /0F87 41020000 ja 0053BE46; a+ l2 `( _! }/ o) Y
3 ?$ [8 ^4 F# |6 d$ q 在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写
! F2 Z0 o9 `7 c# J% `. J. j4 _3 \
procedure InitDll();
$ u3 Q/ }5 ]8 |' A2 y var
6 L: `( d* {6 z4 T* Q p: Dword;; v% ]% x) l5 E* v8 G! ^
begin
$ A7 I9 D; l* W# O- S, n p := $0053BBFF + 1;& J/ I9 r# `' F, w+ ^
PDword(p)^ := Dword(@proc_0053BBFF);
* h6 ?$ W1 I# B3 l; M end;5 i! o2 }7 }( g5 G
) V& E+ Y9 w0 i; W5 @
在自己的代码里面写一个色彩增加的函数判断比如1 d" _7 j0 A0 K" K
+ h v- v0 _( L& | delphi代码:* u0 g U/ u& R1 ]3 b5 c
, T0 K1 \0 a7 [! {& p+ b
var
) Q3 f. d3 F0 I& Q, ]0 f EndAddr1_0053BBFF : Dword = $004F470C;
! u+ f) k1 W. l% L$ q1 E EndAddr2_0053BBFF : Dword = $004F44CB;
. l% z4 p. B; h& ]( w EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转
2 U' z) j' q. z+ \( S0 V' T6 W F* ^1 T& Z2 P2 E& T
CallAddr1_0053BBFF : Dword = $004611D4;
3 D4 g* e/ d9 C" [" T CallAddr2_0053BBFF : Dword = $004611D4;5 G. \2 V. P$ i" f3 a
8 k% J& U! F B1 N% ~1 w2 V+ u0 K procedure proc_0053BBFF();
* L5 R( e% J/ M) y asm
) e7 e# F6 d: Q" X3 D2 h cmp eax, $10 //与预先设定的 最大17比较$ |7 S( S; I8 f) I9 m3 S( @' J
JLE @OldCor //小于就跳转到默认16种色彩赋值% }" ~( I: A. K5 |5 k6 g
& P" ]. m7 \2 Q+ @. m cmp eax, $10 //比较是否等于16( z1 u7 u5 k/ Z0 ?) ~% \4 X1 U6 I9 u
jnz @Seventh //不等于就跳转到第17种色彩判断部分
. f5 ]: f8 r: {. x# O" R* e& `3 ~. j( j, q) W
mov cx, $A //字色或背景色? 没有去详细了解请自己测试
: v* W2 B. W' z% G; q: u mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF9 k1 x0 F ?+ X9 J E1 o& R
mov ax, $A1 o% v2 b" b7 P4 B ]+ p$ f
call CallAddr1_0053BBFF
9 h; ^) R+ B3 J! e* z mov edx, dword ptr [ebp-$14]
0 z4 U/ f: R! j8 s9 l mov word ptr [edx+1], ax
/ F8 T: h, v, U+ P$ t: Q1 c4 {- f, q% c( a# O
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
" }' y9 I3 @, `) S4 n& l mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
$ u& K+ X2 g) t- e! X4 k2 j3 E mov ax, $10
8 r, ?: n, M1 ?3 d) t8 z' }' v; k call CallAddr2_0053BBFF+ o; U/ k" v, E0 q/ p
mov edx, dword ptr [ebp-$14]0 q2 \( b, ?( F3 S/ C
mov word ptr [edx+3], ax8 T1 r1 ~, i: Y) L
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
, b% B" [- n% N* a& R; E8 [" }
. B1 B3 b3 |+ [3 z$ p) c1 S" V& m/ q( d @Seventh:, x9 T9 {: ?( h& z( O
cmp eax, $11 //比较是否等于17
4 r4 y0 c; C! |1 P/ s( G6 d9 |( r jnz @out //不等于就跳转到默认部分
( R; F$ n& q; W$ E3 R0 s$ ~( D( A; p* h5 N( q) D
mov cx, $A //字色或背景色? 没有去详细了解请自己测试
) X' t/ C. y C8 [ mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF% v! |7 X4 n4 V4 P9 @
mov ax, $A+ n9 _( ^6 q8 x2 }- h8 \
call CallAddr1_0053BBFF2 p) N& B% J, x
mov edx, dword ptr [ebp-$14]2 L% I$ U9 f6 K7 M i
mov word ptr [edx+1], ax% @% c8 O8 } z( ^- a
( ]9 Y; X+ s* q3 T" I2 V mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
, T/ \- Y/ X+ o4 e mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
/ X, V H; V1 S" C6 u mov ax, $10- N, |* t- t U+ B B1 b5 J
call CallAddr2_0053BBFF
. p: T- h& Q) l ^: O mov edx, dword ptr [ebp-$14]
! V' |: w( F" t1 D% Y- l$ C# w8 B mov word ptr [edx+3], ax; L T E' J% a
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
% ?9 e# e5 `7 J. E/ R4 i //
( P+ t9 w) Q5 c: J @out:! |% o2 a" N6 P. ]6 z) C4 [* h/ D
jmp EndAddr1_0053BBFF //这个是跳转到默认的点
% S5 W0 V2 P C# W
1 R. \4 m( z# I" S @OldCor:- V% I) A. `7 }: E' r, i' f
jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值
/ U/ o+ \: s. \& V) n end |