本帖最后由 快要发癫啦 于 2023-1-6 09:35 编辑
6 K; y7 C1 n' k' D. a5 |8 t# S/ [
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在" ?: U% _. t9 r6 J* {7 z
) V: E" d5 u; |# v# t+ W, N
dll里面进行内存地址读写" I: N# {5 U* P* \: Y4 `
/ s5 C0 o$ C& u% W) F. s7 ]- c: A 我是在 6 f$ o* l! `; ?2 E! T
y2 l. N6 L+ F5 F3 d+ ]
0053BBFF |. /0F87 41020000 ja 0053BE46
: T. r: `; _' K1 ~
" S+ R y% X- s j0 G1 q 在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写
& c# q# F' C+ Y2 C- |6 o: ?/ A3 x
% U' O( r2 }( ]9 B7 T procedure InitDll();# {4 u/ T9 c9 g' D% Q' v; u$ v
var
) ^2 w/ S" D9 D! n2 _ p: Dword;( g& l W* @% W/ h0 T8 p
begin
+ F& O7 ~& n* Z0 I! M# Q* c( y* s p := $0053BBFF + 1;0 ]1 O) y" G2 v4 i0 s
PDword(p)^ := Dword(@proc_0053BBFF);
7 b+ u# n# t9 D0 i2 r3 I. D$ T/ m end;# x6 e( J7 a# D. v3 n+ `
4 Z& h U9 ^/ F$ V: E 在自己的代码里面写一个色彩增加的函数判断比如2 r6 S R: h5 b& o, S2 S
; i7 T# j9 }0 [ U6 C! o! @ delphi代码:
! i& ^ r7 r- E4 M2 J( d; e, G- q) R& C6 P
var( y. \, X' t" M( g
EndAddr1_0053BBFF : Dword = $004F470C;
6 I/ }* `% w: ]: d3 a# w9 n EndAddr2_0053BBFF : Dword = $004F44CB;/ { f! Z1 r$ c" B5 _
EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转
0 j+ d- m7 r3 P4 H, _
" K6 p2 k- E" E+ y. ] CallAddr1_0053BBFF : Dword = $004611D4;
& k' I% o0 d3 O2 W CallAddr2_0053BBFF : Dword = $004611D4;
& r: C c* e- E
0 A7 p. A" {, {% u/ u5 H3 w: O7 v procedure proc_0053BBFF();
! S* ~' h6 `5 [ asm- F2 `. G2 Z N* n. I, v7 W, r
cmp eax, $10 //与预先设定的 最大17比较+ w+ V) r% ^! T: ?
JLE @OldCor //小于就跳转到默认16种色彩赋值
0 T7 T5 E; a+ G. @: Y! D
. m/ L. i1 T# o+ k P7 J! h cmp eax, $10 //比较是否等于16
# Q3 s: z5 Z, o# g jnz @Seventh //不等于就跳转到第17种色彩判断部分
: X8 J6 G# Q& e- H% L# q: f3 U y( U9 K! p5 T
mov cx, $A //字色或背景色? 没有去详细了解请自己测试
( ?% g) C9 c2 S3 D+ A" r mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
7 X; K% F3 `& T; T- X M5 H' W9 f mov ax, $A
* C4 f( x% f- ]" m! t& x call CallAddr1_0053BBFF 0 ]: R7 n+ `# J. O/ W3 Z
mov edx, dword ptr [ebp-$14], ~- p9 i* D) ~9 d* J
mov word ptr [edx+1], ax# v/ H! { W0 @9 c- Z7 ]$ ^
. J Y5 b7 P C* n3 L
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
' N- v2 |' ]! d- J. }2 [( K mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF9 ~* I2 C' V# D+ H7 U# H- }
mov ax, $10
+ P, R5 c+ z; E6 `! R0 w, } call CallAddr2_0053BBFF 7 P6 A0 O! y! [% z
mov edx, dword ptr [ebp-$14]
1 I4 t- i+ ]) @( v4 ^3 h$ G mov word ptr [edx+3], ax
' W: }& ]3 t- ?: B, N jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
$ m" b7 ~3 d" L* g
2 b8 H9 j* _9 K; x6 \+ w @Seventh:
9 |: P P9 W* ?' a/ C cmp eax, $11 //比较是否等于17
- @5 |- a1 ` {6 G# U* [% o5 z! ? jnz @out //不等于就跳转到默认部分
; l9 m1 K, m# M6 u* M" n" ^9 ?! A$ a. W+ b9 D4 ]1 b2 `# A9 r
mov cx, $A //字色或背景色? 没有去详细了解请自己测试1 E7 e5 b, p; e! y( M a4 D& n
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF, y7 {) Q0 f& v$ `
mov ax, $A1 h' ^2 t3 K J* m8 }" g
call CallAddr1_0053BBFF
) S! @6 Y. x2 x: \7 t* ?9 f mov edx, dword ptr [ebp-$14]
2 d6 v: T9 z" U% B) r* { mov word ptr [edx+1], ax
0 @+ v' i2 R% u+ X6 l6 L4 Z& y
- m, J2 H6 w& _ p/ x mov cx, $10 //字色或背景色? 没有去详细了解请自己测试 X- r% B3 S; f q' p
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
) s+ b+ X3 G$ q! Z mov ax, $10) _: F; a) m8 |5 ^
call CallAddr2_0053BBFF + G+ x7 n% y) @3 r
mov edx, dword ptr [ebp-$14]
( c1 b. [% u1 Z0 b6 T) u8 o mov word ptr [edx+3], ax; z: D4 ]. r$ ]0 v/ m% U7 A9 m3 h7 H
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs g3 l' [1 g# r: p) t$ i) U4 W
//
; w( _ Y6 a; s% a. E @out: " o+ i& d1 j* W/ Q
jmp EndAddr1_0053BBFF //这个是跳转到默认的点
/ Y# Y& v- ^. @$ o6 k! P; n d( `; J V( f
@OldCor:
5 e7 ~" A) d! ~& f# t; o jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值& ^5 I0 T$ I: \) `& f0 s
end
+ z# ]6 H$ _$ k' t4 L# D/ | |