本帖最后由 快要发癫啦 于 2023-1-6 09:35 编辑 : x* U$ E2 u' E2 W1 ?) w% M9 s
0 N# b* M {* y! t, C上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
# D1 d ?* B' Q! q `& n) \8 h$ q9 R" m* y2 H1 g. z
dll里面进行内存地址读写$ U; g* o {% k7 F8 u2 P
5 ~" Q) ?4 o x& p
我是在 5 l/ O7 A& I! |& ?& D, w% E
5 S3 T3 ^4 f7 K# G$ I 0053BBFF |. /0F87 41020000 ja 0053BE46
' J( t/ l* @, S0 ^/ X( Z G' ]) A @# {! \
在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写- y; ~* f4 q8 p1 E( T( |+ }0 `
5 q$ ^8 ~/ ]: T. Q% T( l
procedure InitDll();
& \2 T2 k) H$ \" Y3 e0 N2 R) | var4 V' `% I, D2 j1 S/ G4 P: C9 O1 m
p: Dword;
/ X6 \. a$ N; `8 k6 c$ E q# O begin
/ |# w. s+ w' [ X+ H" z- n3 n( m0 o p := $0053BBFF + 1;
( O% g" t, X9 l: j; `: j+ W" y" e PDword(p)^ := Dword(@proc_0053BBFF);
$ q7 T2 k1 J9 k( U& L6 K end;' `# g) M W9 C) W0 C% R5 \$ h
1 V" @4 a# @, F8 N0 u# R 在自己的代码里面写一个色彩增加的函数判断比如
* d6 S4 V1 {+ F4 t
6 b# M% I8 o8 O3 z/ c delphi代码:3 K6 H3 v# O4 J/ A
. V2 u. a4 j3 h! u8 R/ n; F
var+ g y! C5 S$ m6 Z
EndAddr1_0053BBFF : Dword = $004F470C;# f/ }9 q7 ^3 z4 C
EndAddr2_0053BBFF : Dword = $004F44CB;
2 d. o3 r1 ~! l j: E# G! k EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转: e9 ~# I% ]; l5 H) S2 Y) N/ a7 }
* |- u2 Y* a3 ^/ ^! ]# K) |
CallAddr1_0053BBFF : Dword = $004611D4;6 ~+ Z' e' b* [
CallAddr2_0053BBFF : Dword = $004611D4;' [ H7 P* r) p1 q" c, b3 n( K
6 q" D2 [! p [' f procedure proc_0053BBFF();
1 y; l- F9 p" \' Z+ w" I, q asm
0 I% |4 A+ b3 h7 R/ q$ S cmp eax, $10 //与预先设定的 最大17比较. y/ h. q+ l: a9 Z/ w
JLE @OldCor //小于就跳转到默认16种色彩赋值$ S, a, ]# m2 v4 h
# }# _" ?$ ~2 |$ @4 r
cmp eax, $10 //比较是否等于16
2 @: D& e3 \" R3 u% F3 \ jnz @Seventh //不等于就跳转到第17种色彩判断部分
- Z l; t' F( I: r+ I/ W2 I) A; m7 E% a$ |3 H3 j( I5 H/ ?/ Z) B
mov cx, $A //字色或背景色? 没有去详细了解请自己测试
. N& ~7 {/ ~/ u) _ mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
9 M/ U2 d) O; m/ z mov ax, $A# m# U- p3 ?5 j% \) V
call CallAddr1_0053BBFF * {! |( v1 ^, s( @. \+ ?! g
mov edx, dword ptr [ebp-$14]" _: b( p" s- D% x, g) Y0 d' b4 |
mov word ptr [edx+1], ax/ q0 E" S1 d* _ X
. Y) c, M: Y" o+ Y& Y' P4 |, k mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
4 V+ ?5 p, ^) x mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
& g7 u0 `; r& U# u mov ax, $102 {$ d9 s' B" J" v4 K5 J7 H& {6 e
call CallAddr2_0053BBFF , r7 _5 _9 n4 _% W$ i& t2 x r
mov edx, dword ptr [ebp-$14]' j9 u. a: G) F+ p1 I
mov word ptr [edx+3], ax; Y$ P) O; N. u" \+ V, v! b
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
/ {6 {* q# c# K5 {
5 R" E$ j* {! U# m+ F @Seventh:1 D* R% U' J* A3 ?# E2 Y& k
cmp eax, $11 //比较是否等于17
0 D) Y2 l5 N0 ` jnz @out //不等于就跳转到默认部分' U) T8 j3 l5 H5 f" f( [! F
4 V. U* v! y8 B% e# J( ~( W% H+ { mov cx, $A //字色或背景色? 没有去详细了解请自己测试! W6 r2 B! r0 W" H9 r* ?4 c. l
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF8 p( W+ I" ~* [3 a/ I" _
mov ax, $A& s) n$ A% J! E3 J
call CallAddr1_0053BBFF 2 k v7 [ j* s& Z, M4 |/ v
mov edx, dword ptr [ebp-$14]
- f% W3 w4 ^4 L$ H1 b mov word ptr [edx+1], ax
) C3 W( L( C$ |! X- e: w2 f* o) A8 O4 y% g% O+ e4 T, V" @; T
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试7 g c2 d% J# Y0 U! ^) {4 H
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
/ A0 O* t& V1 M& G mov ax, $10/ q9 @7 }1 `$ o
call CallAddr2_0053BBFF
6 B5 _1 u) [' v& p3 T/ F1 \ mov edx, dword ptr [ebp-$14]
* L* W- w! M+ r# ^: b c mov word ptr [edx+3], ax
4 {8 |0 l2 k' t# o jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs; A0 Q$ _" \$ t6 W* d
//; l% `0 m3 P- o
@out: * c% N- i4 k& L% O$ o; X: d: x6 K$ R: w
jmp EndAddr1_0053BBFF //这个是跳转到默认的点* @0 q( s0 | B
, E8 P/ U$ y3 K7 f" y* v0 r! w9 d( a
@OldCor: D0 c8 s9 j7 l6 M
jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值
# V) x {: p6 @! g' G v6 E% N end
* {- U+ N) m7 _0 E) g |