本帖最后由 异仟年 于 2022-9-5 20:28 编辑
4 y% O8 t: `! c$ L( u' S% B# B, C4 J) z
编写需求条件:7 B- W4 Q2 U0 G7 ]: N
y4 y- e; a J od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)
& o) ^/ X, I% ^% h
( v2 Q. e5 t i; Q- q j$ _
; n" U* m* R3 q4 ]5 q" ?编写过程: A n, n: [' o+ ^% ]
7 C7 G6 U$ U; a0 J
第1步:
/ R% _4 \5 @! \ F* k8 _- q1 v/ J
/ Z4 l) c% ]) x0 G- z 用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面
+ j: R$ p- j8 Y! \. ?2 e$ ?
5 z) F" T9 |) w3 g
0 z$ h& x; T4 m, ?# }第2步:
. b% L' V: S- F- |* G B# v+ [
/ c$ r8 N6 W1 f; b. Z 打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序
% K5 T9 u8 c/ l8 A% @- {6 Y( `; h+ c4 }6 B; T$ s
启动客户端进入游戏(后面要用客户端)7 [/ e" N1 V9 z! o" c' s
7 Z( G) A- F5 p. `( D `, T 调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe! V$ e0 r6 o( M4 `. w0 f+ _/ ]
4 x p4 x9 e4 Q, J2 @
在出现的界面上右键 菜单->查找->所有参考文本字符串 od 会扫描程序 : N9 X1 u B0 N. _, W: }8 a" }
2 J+ d1 j# a: d$ n 提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到
* w/ |9 B" h" B& Y
, ~ C d: W" L7 Z& V D& T7 I od停在
+ `3 q- E/ F2 X) D+ X/ a: p. }& @ }
0052A0C7 mov edx, 0052FDD0 ASCII "<SYSTEM>: "
) Y9 Z m6 ]. [! m2 ^0 f' K' k; s/ z1 ]7 M
双击这一行 再次看到od定位在汇编代码显示页面 O8 @' t& o6 e5 r: x; t
1 f0 S$ C9 L# D+ g
8 ]9 k; v8 d( }/ F* y* i
0052A0C7 . BA D0FD5200 mov edx, 0052FDD0 ; ASCII "<SYSTEM>: "
9 a5 D {- k6 F" I8 p 0052A0CC . E8 C7A5EDFF call 00404698 7 c2 @0 |6 E6 a" P9 r7 t% h' n
0052A0D1 . 8B95 ACDEFFFF mov edx, dword ptr [ebp-2154] ; 赋值edx 为中间屏幕显示的内容9 K' d, E5 n+ X% ^; T, K- A% E
0052A0D7 . B9 03000000 mov ecx, 3 ; 这里是色彩的选项 后面会调用8 l# Q1 e7 ~8 h* B. q0 ~; D$ t
0052A0DC . A1 70855600 mov eax, dword ptr [568570] ; 这个是UserList地址 参考侠中道代码可以知道 4 N; j" T/ A; b) ]% C
0052A0E1 . E8 D21A0100 call 0053BBB8 ; 屏幕中间喊话的call 0053BBB8
; V6 d% a6 w# {; N1 u D* R0 \# b% B8 \, H
定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM喊# ?????
! y# G1 u8 u( a0 T) D
0 b, V* F1 |6 ?/ Z. n6 h# M& ` 这时od会被中断, 断在刚才下的断点处, 这时按下F8 1 J5 w- R3 q. h. {4 t Z
/ W2 I5 H9 X# ], x: V) x) v
到call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩
$ P. t2 W+ [2 G7 g. `$ Z
& R8 q. `3 U+ m! ?$ k* O 同时发送数据给客户端' i' g6 X3 G! @6 W
; {- G2 X9 ?( I5 @
$ V( }" I/ |5 W 进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过3 {! } P) z2 V0 b5 @; ^
4 e# w8 u9 F/ V% { 0053BBFC |. 83F8 0F cmp eax, 0F ; Switch (cases 0..F)7 d3 r. x# O2 c, i0 ]5 ^2 A, X) i" w
0053BBFF |. 0F87 41020000 ja 0053BE46: I p& t4 V# k/ L5 S# ~; r
8 V8 F8 B1 A/ Z5 k' ^( O7 F eax 这里是3 一路F8比较下去到下面这里 O# m: J0 k7 ^
% \1 z ]/ Z/ q: K5 S 0053BCD9 |> \66:B9 1F00 mov cx, 1F ; Case 3 of switch 0053BBFC
# f' Y9 q9 \2 U3 B- k! I 0053BCDD |. 66:BA 1F00 mov dx, 1F9 `$ l* R7 @' U7 U. {
0053BCE1 |. 66:B8 1F00 mov ax, 1F5 r0 L% `+ g' @3 q
0053BCE5 |. E8 EA54F2FF call 004611D4
* \6 }/ t3 \1 K
. \. j/ j- y3 Q; Q# d- s: C 这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 的3个参数
: @; t5 e8 k5 ?( I0 s
9 s. C/ T$ T" n7 `5 w1 I' h call 004611D4 就是调用 winrgb0 v$ n* A0 |, d
, y0 a# O9 N& F2 y1 H, L
- Q& V" i) a2 u# D& w) g, x, o6 u上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
- F- M; x3 M# ?: Q) C+ O" ?2 _4 u* U& w5 s3 M* H
dll里面进行内存地址读写7 j6 J& y s) j; P7 h! S3 B
! h* Z8 \: L& E& O2 j- g 我是在
7 t6 N p ~& g9 c4 \) R7 P( m0 P
7 P7 |3 i, ^7 Y 0053BBFF |. /0F87 41020000 ja 0053BE46
3 S: x7 E5 }, t' w
; J5 {4 P4 \ F/ @, y 在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写; f w# {; d6 D7 O3 N' N
- A- Q/ j7 \# Q procedure InitDll();" f/ s7 i! g+ Q" D$ W8 p/ D) _
var
& j" }2 G4 |- `0 }6 X* P p: Dword;
2 e/ q* L& K1 M' \/ x begin
* ?' k- U9 S6 m0 o. Z9 f& a5 K) a p := $0053BBFF + 1;
& N2 v- \# |8 Y) z& X) z; z7 a# G PDword(p)^ := Dword(@proc_0053BBFF);
& k( Y7 \, R0 ~5 c+ N6 z end;8 f! {; D: Y& ^8 ~! p$ W
" _- r) ?9 x" J3 V' G/ m: `* ~ 在自己的代码里面写一个色彩增加的函数判断比如& W% i% h+ O: g) c1 `# p
1 O8 R4 w& @# Y- J" \5 |& |( W
delphi代码:( l$ l) p8 t5 x! T: `. A7 `
" Y( t5 [0 i8 ^( ^
var- ?0 r& A8 J ~4 S3 }, j
EndAddr1_0053BBFF : Dword = $004F470C;
. r& t; {3 v! j! m* k EndAddr2_0053BBFF : Dword = $004F44CB;
( D" L* M$ u+ X. J |( K9 N0 s7 F EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转 h- H. t# ?9 v/ J% T3 i
. w; W- C1 V+ H* L
CallAddr1_0053BBFF : Dword = $004611D4;. M! z& r Y/ ^( s* n- H
CallAddr2_0053BBFF : Dword = $004611D4;
7 b; ~ M }$ u# n( ]/ K) B
: `) M% i" L% T0 [ procedure proc_0053BBFF(); S: y+ Y% I& L, H
asm. G1 f$ L' a& I4 a: M8 Z) Y
cmp eax, $10 //与预先设定的 最大17比较
- b& }& Z+ m7 x JLE @OldCor //小于就跳转到默认16种色彩赋值- Y# v1 R- K$ W4 }9 ]7 k1 c4 `
. d' c& J6 @& f
cmp eax, $10 //比较是否等于16
2 C: U: D, O( A5 Z6 J jnz @Seventh //不等于就跳转到第17种色彩判断部分, r/ r( A: y+ P. I; B1 _
0 r9 h/ N- Q } mov cx, $A //字色或背景色? 没有去详细了解请自己测试" Q% w0 V N7 G+ Z/ B) t
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
0 V2 d( r: p9 I# h8 { mov ax, $A
: K% L @2 d$ |) O2 d2 I7 ] call CallAddr1_0053BBFF* A9 F" g& I' a
mov edx, dword ptr [ebp-$14]
0 `2 ~5 h" G2 N2 I+ f mov word ptr [edx+1], ax D/ q3 V2 E4 p5 Y6 B8 f" [
, e; U" E0 X: O& G( A, u4 C0 h mov cx, $10 //字色或背景色? 没有去详细了解请自己测试0 Z2 J! e! E9 d$ x# Z; E9 ~
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
; G+ C! X1 Y$ e mov ax, $10
5 i* [/ \4 |) s) V call CallAddr2_0053BBFF6 R4 V& M, o- F8 }9 h
mov edx, dword ptr [ebp-$14]
: r. ?( o# h8 Z# P; G mov word ptr [edx+3], ax
0 R0 e! M7 e* k jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
9 P8 v" m8 U6 N0 n* h" G9 f7 g5 m% W6 Y C- _# T& k% t [. K- t
@Seventh:+ y3 J- b+ k% H$ K8 ]; c1 r
cmp eax, $11 //比较是否等于17
K/ ]) J. j5 @' b7 x jnz @out //不等于就跳转到默认部分$ n3 T. J; w/ H) Z' F( n) H6 ?" G
+ L, F" t) R& y mov cx, $A //字色或背景色? 没有去详细了解请自己测试
6 L' m7 |5 l1 u4 S( X mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
: z" u; U- h( t4 Y+ m. D' i mov ax, $A4 \# J9 @+ A2 B: Y" e
call CallAddr1_0053BBFF
! \: s8 M% u) Q6 P/ [ mov edx, dword ptr [ebp-$14]
( M# T8 I0 l6 A mov word ptr [edx+1], ax% I* R, i! I& Q8 V5 f% s
, s* j' b2 m* j" I4 ~! A6 l, w mov cx, $10 //字色或背景色? 没有去详细了解请自己测试. t9 [5 T2 Z/ i% I: n2 c" V
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF( H7 A" Q O. L, ~* y K
mov ax, $10
_5 ?% _" `& g2 I3 j/ J8 M call CallAddr2_0053BBFF
; L- f0 T) R ~9 R& I% M+ O mov edx, dword ptr [ebp-$14]
4 f0 B' v0 H. M; v( e$ w7 f mov word ptr [edx+3], ax
& [( U( _5 L c2 ] jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs/ q$ j' M9 F3 l9 J5 x1 w ^& z# l
//- b4 h/ w T3 {6 d
@out:& r0 Q- k: d7 d% w5 Q, l+ N; S6 P
jmp EndAddr1_0053BBFF //这个是跳转到默认的点" }+ N( }' ?& B5 C
1 e" Y( ^2 I# H: E6 ^ @OldCor:
$ ~1 ]. v9 n& Y/ [4 Z jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值, V" y) F* _ I1 t/ H
end |