本帖最后由 快要发癫啦 于 2023-1-6 09:35 编辑
9 I0 y1 X6 f# M' U* d" M; f) c0 y
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
6 D! F4 M7 c( H$ C
8 K _: b: c+ Z0 f- U3 z dll里面进行内存地址读写
5 Q& Y( J6 T& w0 L
% A: L' f1 a) P5 c& i* X0 o U7 S 我是在 ' D% D6 Q4 M. h9 \3 f2 T( l) G7 D+ V
8 w8 H8 y- J% V4 j+ S% X
0053BBFF |. /0F87 41020000 ja 0053BE461 g- M# T3 l3 H: J+ N3 S2 L
: Y# w- e" C. {! |
在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写! h: Q! G6 ^* F$ D- m6 e- Y
" i, Y3 A, j. k procedure InitDll();
1 v! E0 m: Q/ ]/ w$ `4 B var
. ~ p d/ D7 G5 C/ Y p: Dword;
, U* c1 W3 E# x$ V begin+ f6 m2 {! _2 z/ b3 f" W- N$ @+ ^
p := $0053BBFF + 1;& U0 U5 g$ E0 j8 E. ~5 b$ T
PDword(p)^ := Dword(@proc_0053BBFF);
+ N9 M/ X1 V) I# X+ j end;
9 _6 z( J7 i8 g" M, u1 F' T+ [# z% m& u+ g0 \: ?
在自己的代码里面写一个色彩增加的函数判断比如
3 y+ D' z( l* I$ c, K3 a) S; \4 s% U3 ~
delphi代码:
1 D9 `% K3 Z) x+ w' n# E7 o
0 j% n0 l/ t3 e. w( I3 D, K1 ^ var
5 o8 D/ S& e8 P% Q$ Z EndAddr1_0053BBFF : Dword = $004F470C;8 M5 o6 Z$ Y; w( ?' k- L
EndAddr2_0053BBFF : Dword = $004F44CB;
. Q: @# D7 _! Y+ H" L EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转9 \: H8 Z0 M# \# j1 ~; _8 F
; k/ w" s+ p( _/ a' m' X CallAddr1_0053BBFF : Dword = $004611D4;
& d- q$ S9 v% z' z | CallAddr2_0053BBFF : Dword = $004611D4;
) E8 [& g: n% X6 ]3 Z5 s# N F; L$ T0 g6 q
procedure proc_0053BBFF();9 h: ?0 O4 @& i' C
asm ?2 |# [# b: |
cmp eax, $10 //与预先设定的 最大17比较2 w/ c/ h& k5 [! ^
JLE @OldCor //小于就跳转到默认16种色彩赋值
. S1 I( r4 }1 G1 Q& \/ \. m: t
) N' c6 T r0 M; S( b cmp eax, $10 //比较是否等于16
3 T3 N. h/ f' X; E jnz @Seventh //不等于就跳转到第17种色彩判断部分3 f; n7 ] Z G' Q1 d$ t
' {0 N2 V' O* z7 x; W( J$ x7 {
mov cx, $A //字色或背景色? 没有去详细了解请自己测试( |# j; H0 i& p+ H2 V
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF" M4 }- j% a& W/ s& t6 d
mov ax, $A! \1 K5 S4 ?( W4 F: I7 r! T: b
call CallAddr1_0053BBFF
4 M) Z( [; F0 R! i) x mov edx, dword ptr [ebp-$14]* w% @4 K( R2 U- B& X/ }
mov word ptr [edx+1], ax: Z5 D% @7 H. K& h
/ Y7 x' j: s& [- S& x
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试8 B w* E$ h4 m* x8 D6 q7 r
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF; f! f1 [7 v7 n) i+ f0 g/ F% o: ]
mov ax, $10
; E! q. R$ ?$ R: t* D2 L2 u call CallAddr2_0053BBFF
* G, G2 A& T) v9 r; U- e mov edx, dword ptr [ebp-$14] D. D1 F e7 ?: K, s# N0 d) N" G; z
mov word ptr [edx+3], ax
# H8 R+ U5 c6 \8 g2 F- x8 A( A4 L jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs3 U1 E+ a7 f# \) y
2 [4 I# ~9 A! \% S b
@Seventh:3 u) n# O$ e" n8 C K5 r7 L7 u3 }
cmp eax, $11 //比较是否等于17
! K. B0 L( F2 X8 l4 \4 i jnz @out //不等于就跳转到默认部分8 l4 ~ t) B# T2 F" ]
( o8 r/ U6 h' a' f, G. ~% \& S mov cx, $A //字色或背景色? 没有去详细了解请自己测试$ \" @7 r' i l3 W+ w9 Y
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
0 ?9 t: M7 d/ J; f- v mov ax, $A( |& K! [* G5 U3 @1 l
call CallAddr1_0053BBFF
, g5 A, }9 W& u0 J+ a0 n mov edx, dword ptr [ebp-$14], ~, f" ?' _$ K8 K3 f
mov word ptr [edx+1], ax( v/ s7 I' ~3 p
# d5 @3 ^. S3 Z. J1 c. P- |* x% }' s
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
K) g+ H" K, Z7 p" k. W9 g) Y mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
% v1 F' A+ F# _3 P# S& N mov ax, $10: r5 p: E4 Y, M' \
call CallAddr2_0053BBFF
1 ]1 V" K! @( X( |7 R% M mov edx, dword ptr [ebp-$14]3 [4 V* [8 H! H2 B# |% ]- t5 a
mov word ptr [edx+3], ax
2 |* h7 @: R2 r H% f jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs' ?& Y* S* o, n* E. i
//
6 ]! B. p- D# J+ x; W9 q @out: ' ~" l) m4 `4 r1 F* x m! ^
jmp EndAddr1_0053BBFF //这个是跳转到默认的点
3 S8 N; B K1 z0 E
0 r- w# Z( Q: ]* D3 u9 z) A @OldCor:: |8 Q" [. o2 f. E& c3 P* F
jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值! @2 z$ d! S* `/ \3 M' l
end : n% N; I2 I6 k1 \+ c' r5 ?
|