本帖最后由 异仟年 于 2022-9-5 20:28 编辑
4 X, v- N. ^, |' f# r; f
7 H, T/ n% t$ q' m3 B编写需求条件:
& G: P: y2 S3 u0 ]" ~
* ?1 r2 C- o/ F' y; D/ ` od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++). \6 |, x r6 Q5 P% z. k! f
. R& d5 O3 v. `# [6 q
3 z* d" `8 j! l) Y; w
编写过程6 A, p) q/ k& Q
- N9 y/ ]8 o+ j3 {
第1步:6 f- w% j( p9 X; U4 p( l7 s+ x
3 @* `3 y; `" S
用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面+ p5 s- g- V; P* h
) Z5 V5 a# e6 ^: S" J% k9 j0 V8 j! h* Q
第2步:
2 G( _- w/ b4 S2 t/ k9 N) U3 x! c F1 @, U( W) s& z
打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序6 p% } Y( t: d* A& V( b: s
' C: q3 {$ f E0 Y1 g& c# K 启动客户端进入游戏(后面要用客户端)
8 b4 I ~% H$ [6 x0 U% o/ u7 e" Y5 K1 K. O z! w' } `) d3 n2 _8 m
调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
9 y |/ q9 u" Y
3 X5 G: n; t$ q$ K' p 在出现的界面上右键 菜单->查找->所有参考文本字符串 od 会扫描程序 + l& }0 u' I) Y' {, B+ ?) _5 w- H
0 d+ w. t: b( j7 N& P* g 提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到3 }/ e& r! e0 ?3 U/ [% H
' a3 O0 d( k4 l' T2 ^
od停在
9 U' x3 D$ Y5 n* z) d; ^) d0 \) M' [. J1 D& f( f' M# B# b( V* c
0052A0C7 mov edx, 0052FDD0 ASCII "<SYSTEM>: "& x! ~: P8 g) d& B% D" {% F: b
2 y+ G- X& e- k% a$ R
双击这一行 再次看到od定位在汇编代码显示页面
$ K1 U P$ X" C3 y# p8 L: `4 o! m7 r
% ^ H7 E9 P, C" n9 n; _" } 0052A0C7 . BA D0FD5200 mov edx, 0052FDD0 ; ASCII "<SYSTEM>: "
9 Z0 V( J/ Q+ K3 K" r [ 0052A0CC . E8 C7A5EDFF call 00404698 6 ^: C+ u" h6 t, W
0052A0D1 . 8B95 ACDEFFFF mov edx, dword ptr [ebp-2154] ; 赋值edx 为中间屏幕显示的内容
, C& K" c- B4 e* I, B- `* j1 V( m 0052A0D7 . B9 03000000 mov ecx, 3 ; 这里是色彩的选项 后面会调用
5 S3 C; R: Z2 M9 Q/ k* \ 0052A0DC . A1 70855600 mov eax, dword ptr [568570] ; 这个是UserList地址 参考侠中道代码可以知道 # h0 H Y$ f2 `+ \$ _1 r
0052A0E1 . E8 D21A0100 call 0053BBB8 ; 屏幕中间喊话的call 0053BBB8
$ r& P2 K& ^& x) y _5 M1 |, t& X5 Z( `( U8 G! x3 |
定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM喊# ?????/ |9 c+ q9 e0 @
% R, l& }8 s M/ S
这时od会被中断, 断在刚才下的断点处, 这时按下F8 ; x9 w( e% b0 D0 d6 k! p
0 B7 W( X* P1 G$ {& X 到call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩9 k7 s% P5 @+ Y' ]) n. \, _ \
( w9 ^2 Z) k! y+ p. m( r 同时发送数据给客户端
5 {+ o7 e# X: X9 ^% s; T5 n; C5 ?$ m
2 O2 D' E0 J: h' E+ y
进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过
+ j$ t/ l3 L A% ^; u 3 c/ [- o0 d' Z4 J8 ?: j2 C
0053BBFC |. 83F8 0F cmp eax, 0F ; Switch (cases 0..F)
# C6 _ r% o5 j3 M 0053BBFF |. 0F87 41020000 ja 0053BE46
1 q* ^+ _) ~6 Y' @' T
8 e7 s; Z4 ~2 x eax 这里是3 一路F8比较下去到下面这里/ y7 o1 Y8 P6 z1 v" C1 f% S9 b
9 ?/ F+ v. X( R) S8 L
0053BCD9 |> \66:B9 1F00 mov cx, 1F ; Case 3 of switch 0053BBFC
, M. j6 x) c5 z- S0 u& @# Q 0053BCDD |. 66:BA 1F00 mov dx, 1F1 g$ n& U. U9 U$ i
0053BCE1 |. 66:B8 1F00 mov ax, 1F
5 l* U4 W1 L. F% U 0053BCE5 |. E8 EA54F2FF call 004611D45 v9 }3 Y7 G3 x) U5 ]% T, n
% A' Q. q& X; z: v+ l2 p1 e
这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 的3个参数
5 g1 X2 ^7 m6 |$ \8 D' \: F
3 e+ `/ w- y) e% `& C b; S9 c call 004611D4 就是调用 winrgb, l a a8 j) e! A
' {8 b K; O) F, I5 D
0 S, x" {9 u+ E: i6 B0 l: m上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在2 l- ?. p5 V. t
! y" l% B9 X0 F- y+ A5 E3 n dll里面进行内存地址读写% A( T( `0 H/ H1 S5 O0 j2 j
' r/ n) M/ U/ E6 x' ], K 我是在2 p7 |+ L! ?% A$ F0 t
6 a+ Q6 r- _# v, p+ l 0053BBFF |. /0F87 41020000 ja 0053BE46! l- s" V: m; I; R4 U: N' H
( G$ `& f* b ] V, f( J' V 在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写
! \+ G9 q. D/ U) D- u5 X5 u/ A
% o0 V: z1 z& S2 @! e procedure InitDll();
c( J/ |6 _. T+ X7 `% b var
) u: V7 {1 Q) ]3 _1 F5 j p: Dword;
1 J3 R: D% N6 k begin+ g \* T" M( j! I" _* ?5 H; s+ M
p := $0053BBFF + 1;
/ ]" x8 z" v" m6 _& m- U) N PDword(p)^ := Dword(@proc_0053BBFF);; B+ ~+ K D4 e
end;+ A$ O6 U; Y A, ~+ S
/ }- x% M% P8 L; M 在自己的代码里面写一个色彩增加的函数判断比如
' I% o# H4 G5 z* I4 e
/ M: u# a+ S/ L delphi代码:
0 _/ } v& x! b" S3 _/ y
" r( n. F0 [5 s( W var5 z7 N6 ~0 L. Z
EndAddr1_0053BBFF : Dword = $004F470C;
5 G6 j3 q# h' m; N; v) j EndAddr2_0053BBFF : Dword = $004F44CB;5 w- t E8 }8 {# c$ q
EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转( |' `- V" `- K/ E0 [- g
: Y* ]7 x/ r- |- `5 j CallAddr1_0053BBFF : Dword = $004611D4;
9 R3 y' B. V* W* ^ Q/ e CallAddr2_0053BBFF : Dword = $004611D4;: g: b1 r# _* n3 w
; f3 C! o. v, `1 \8 r6 z% l
procedure proc_0053BBFF();
. K# ?& @# ^& E: \8 v asm0 x! T% m7 V- Z7 U1 V- L7 q
cmp eax, $10 //与预先设定的 最大17比较/ Z) U8 `, r1 c9 d0 x
JLE @OldCor //小于就跳转到默认16种色彩赋值5 ~, u* \2 k$ J6 N
% |- h i5 r. p" r2 g. q3 f
cmp eax, $10 //比较是否等于16
1 Z" h A- D6 V3 K% m4 o, K% ^ jnz @Seventh //不等于就跳转到第17种色彩判断部分
0 {: n) {% a. z
# @+ j9 b0 L- F, e) Q0 f mov cx, $A //字色或背景色? 没有去详细了解请自己测试
; ~6 ?) ]$ O' D: k mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
6 ?& {$ H; u9 i) }, P9 m mov ax, $A
5 E0 j1 x7 V" B. X' B! H" P7 c call CallAddr1_0053BBFF0 y3 B- D( K/ r7 y, B+ A" F1 I. B
mov edx, dword ptr [ebp-$14]
" c' k; {8 \$ h1 r3 i8 } mov word ptr [edx+1], ax; x; a, }+ L. v: f/ t4 c
Y/ s& y) o, `3 T
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试$ x6 F$ U+ q# D* n
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF, t2 J* A+ T4 j& O: t8 k1 N+ \; [- T
mov ax, $10; }! _* b- s9 Z
call CallAddr2_0053BBFF$ V, \9 M; W, d+ \
mov edx, dword ptr [ebp-$14]8 \$ I$ r; c. Z8 E- Q+ u
mov word ptr [edx+3], ax! ]4 J# J2 q6 i% D! _! |
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs; j% L$ @5 X0 c. Y5 v) s2 L
. D: p# z! c, \" Q0 z) B @Seventh:- `8 y, i0 m7 W" x+ _" @
cmp eax, $11 //比较是否等于17' o V+ I' _# E, D, W
jnz @out //不等于就跳转到默认部分. ?! ~% G7 E7 S, M. N! K v0 F- ^
, O! o: w7 Q4 @4 h
mov cx, $A //字色或背景色? 没有去详细了解请自己测试$ o6 V4 w! f% s: R' D5 }2 l q9 K8 y
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
& G, l f( ^9 L v mov ax, $A, @, G! |' F4 U# `& d# t
call CallAddr1_0053BBFF$ d& B& k: e& n D- |
mov edx, dword ptr [ebp-$14]4 M2 R- ?( T% u% p# j0 C
mov word ptr [edx+1], ax
$ T2 B* r' q# s. ^; d- w' c" J
6 |! Z+ T% L9 ^: R+ {3 k mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
4 Z8 I* @7 t3 s( k0 J mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
1 [6 M5 Y v) F3 { mov ax, $10
. O2 ^6 B! @% G4 |3 c; N call CallAddr2_0053BBFF+ d4 R" {. b% l; r- d4 r0 K
mov edx, dword ptr [ebp-$14]
% ^! f: u' |& ^ mov word ptr [edx+3], ax+ q9 U% p- v. {# n1 K7 A7 G
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs! l5 u" Q9 }% ?$ \, u0 l
//
+ O: ^& T( G5 ?9 ^5 {2 }3 J @out:
9 Z* }( H5 v$ `8 d7 D: ]5 o jmp EndAddr1_0053BBFF //这个是跳转到默认的点' [1 v( W0 H" x& k
& Z% R- p" Q6 d' e+ Z
@OldCor:; p W# {! M/ L2 P8 H. P! D; H
jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值+ O, f- G$ ?5 m3 e2 S3 k
end |