本帖最后由 快要发癫啦 于 2023-1-6 09:35 编辑 . B* e& J% u1 n. r, X L
* ] b5 i u" M
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在$ o; L6 J6 o1 t# G/ J# X
. ~: F$ f: \7 Z3 Y dll里面进行内存地址读写
; |9 @8 G$ [& M+ v6 R5 j" G' e: B* [
我是在 + w2 K d- p0 D- F% L; S
; w" a t) X; x- }: N 0053BBFF |. /0F87 41020000 ja 0053BE46
& ^9 S' A+ R* x" y$ a# y/ ^4 @$ ~2 b( g+ i! W1 d
在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写
" p2 V' u9 s) k& U, ^0 M+ @1 o4 {/ }; C) w( X" C, g
procedure InitDll();3 b# U/ R) T9 c$ f' l: W! R0 h
var+ Z& m4 ]) D3 n( D7 [: ^% R ^
p: Dword;7 Q6 g; S! J$ M" e
begin
4 U, a3 E# J" X" a4 m# K3 b p := $0053BBFF + 1;
+ B# L) x |- l N PDword(p)^ := Dword(@proc_0053BBFF);
. f- z. S3 X! i3 v% d end;
; } z* [+ r8 e; W* w9 o! V2 n% e! z+ V0 K! X
在自己的代码里面写一个色彩增加的函数判断比如+ f& I) B% `/ F. }8 j
& P+ i+ O3 i, {7 t, ~- V; ` delphi代码:5 }( L1 o( @1 O5 |( D
2 j0 t* c9 e3 \8 [* G9 M8 n" S var/ I$ n2 S( L( u, }. Y
EndAddr1_0053BBFF : Dword = $004F470C;7 Z; Z# h' h$ v% w2 W0 f
EndAddr2_0053BBFF : Dword = $004F44CB;& S. j$ K8 C+ i1 Z
EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转% w9 v" i) P0 ~, V$ E
% e1 T# O7 W2 z6 C3 p$ i CallAddr1_0053BBFF : Dword = $004611D4;
) g. B/ T/ y8 ^4 M" u8 f! z CallAddr2_0053BBFF : Dword = $004611D4;
/ c4 `5 y1 g! E) `& |$ s0 n3 o+ O3 W* Q# b" n$ e. C
procedure proc_0053BBFF();7 `# A' e5 |. v5 g) E# |
asm
* f* @) u1 n8 o# j cmp eax, $10 //与预先设定的 最大17比较
: g( W4 v: r, m3 a$ D \* V JLE @OldCor //小于就跳转到默认16种色彩赋值' O7 r; Z" L. J: Z9 [
& `, U; m6 ?9 o/ @6 [* o; i3 |# n2 ^ cmp eax, $10 //比较是否等于16
3 ?$ p; q; }& l# c/ A2 _0 k jnz @Seventh //不等于就跳转到第17种色彩判断部分
& z/ O( R9 ?) Z. Z
* P" \- D4 S' Y: d. w+ r mov cx, $A //字色或背景色? 没有去详细了解请自己测试
; |( W* S7 k( m* V, |" T+ W& ` mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
5 e$ O/ k% X0 x mov ax, $A
Q2 z. \+ @1 D8 \$ K& b; n5 \3 ] call CallAddr1_0053BBFF
! G8 J4 X3 P) @5 A; k mov edx, dword ptr [ebp-$14]
) A- u I' g" t mov word ptr [edx+1], ax9 q, H, R/ k* h1 w. z" Z
& G5 @" E, b6 d, M0 a0 Y4 S mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
6 s a% f |4 n2 v+ o7 ? mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF" g( X0 C/ I* T" B1 K* l: ?
mov ax, $10
3 d" I4 w6 ^4 c J/ r& O" R call CallAddr2_0053BBFF
6 D* W! F; G+ _- _( j6 ?# V mov edx, dword ptr [ebp-$14]
0 }2 }' \% E4 b3 M; t% ] mov word ptr [edx+3], ax9 b/ ?, }6 n. h$ ~7 G8 q+ O L J
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs! @. D9 J8 e* n! }- b
/ d: o3 w1 v/ f4 m# K. o @Seventh:! |1 Y+ {7 k& M1 Y& r4 V
cmp eax, $11 //比较是否等于17 3 E5 P1 R* g, ]* s' H. w
jnz @out //不等于就跳转到默认部分# R# e9 H1 `3 L, ^6 F, L/ L2 v
+ F, C% w/ D# l2 x" x# Q1 b8 \( U
mov cx, $A //字色或背景色? 没有去详细了解请自己测试
" n) y6 P5 W( n( V1 e8 n mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF2 d2 R& J$ L5 h, a0 x' y( m. J
mov ax, $A
6 ^4 W5 X7 ]; i9 n3 s# U$ J6 u. n call CallAddr1_0053BBFF
% |! H; \+ A" ~; ] mov edx, dword ptr [ebp-$14] t1 H; _& ?( Z4 i r4 q
mov word ptr [edx+1], ax
& V0 s" n) `% y3 X- ~: J: i' j- V+ |' H0 u/ ~6 I7 T: u* O
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试1 N; b/ \( `# D: }: T2 S. t4 i* l4 W5 [
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF$ ]+ S! t( j8 y& m, t0 O- \. B
mov ax, $10
9 J3 r0 D: t- c call CallAddr2_0053BBFF 3 N+ W( [1 h$ a/ ]1 U* e6 D
mov edx, dword ptr [ebp-$14]2 A1 H2 ]" d: }3 n5 l
mov word ptr [edx+3], ax/ G3 Q- r4 i7 ~4 \* I
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs( \' i5 D. v: _/ b! V
//. d1 S0 n$ a" g, T/ _% t) ^/ q
@out: ! X1 | o# t) g8 O% z
jmp EndAddr1_0053BBFF //这个是跳转到默认的点
9 E0 o/ x! L; z: V; T& Z* Z$ z6 U0 I/ f* O0 X1 q- k
@OldCor:
+ j/ Q& D. F3 N2 }3 b& ^* G jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值/ c e6 B2 Y' O( Z9 ?0 t; v1 c
end * @7 l% f* Y* W% R( l
|