本帖最后由 快要发癫啦 于 2023-1-6 09:35 编辑
# q8 G0 y }" ?+ M) B o5 K% ]: Z! e) ]- C/ Q
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在, Q# Y* g7 K t3 ]8 q- M$ c6 [' f
; N* @ {: m- A/ Z. y
dll里面进行内存地址读写
+ }' P; f! I! O' [; e- m" D1 v: f- p: R- [9 [
我是在
3 n2 K9 @6 v8 @; ]' Q$ [ ; x w5 d0 R1 X# e* B1 H" D
0053BBFF |. /0F87 41020000 ja 0053BE46
- A; J. l+ h+ l' `3 a8 z1 c" N' f) N6 [% a
在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写) Z- \4 l+ r* G3 N9 x
& U$ S6 y5 P9 o procedure InitDll();0 g* o2 a8 f0 }$ G; O
var
% n8 C2 x) [& X1 ^ A! V* V- I p: Dword;
) F+ y8 W2 L3 ^; A begin% s) h2 X, p$ S
p := $0053BBFF + 1; d( u2 a6 a+ L4 J0 d# q) |9 I8 h
PDword(p)^ := Dword(@proc_0053BBFF);
7 p3 \- l8 Q' Y8 L end;$ `3 {; f7 M4 D7 l, B- A7 q; g
. G5 M; o- e" g3 Y* } 在自己的代码里面写一个色彩增加的函数判断比如
3 b( V& x+ O8 Q( E& @, N
+ a6 F# i: Y. Q' p$ ] delphi代码:
3 S V8 G) U# Y" ~$ ~ j
, o4 h X- u8 k var
" Q" l6 j" S$ w EndAddr1_0053BBFF : Dword = $004F470C;
2 ^* o& m$ m V; g V EndAddr2_0053BBFF : Dword = $004F44CB;, M9 m' @! t: R n/ X/ f* F1 F
EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转
% D2 W' @# O5 _+ n3 c& x
# S. o; [) q* e Y) O CallAddr1_0053BBFF : Dword = $004611D4;
9 p H' i) A/ n" Z) k2 x% P% o CallAddr2_0053BBFF : Dword = $004611D4;1 w% H6 c9 Z f& q0 k. ]
/ |. @- Q! {) p; {0 t1 i, s procedure proc_0053BBFF();
, P- l, J% L Y7 F7 [: Z5 v* h asm% t' ?. ]2 ?% h6 t: P+ Y" B
cmp eax, $10 //与预先设定的 最大17比较
# M& v# Q: ?$ [ JLE @OldCor //小于就跳转到默认16种色彩赋值1 `: {: g a' I: j% a1 _
! a K. `# I9 ~% Y/ r cmp eax, $10 //比较是否等于16 / i/ ^5 P( y6 M& _) g, k
jnz @Seventh //不等于就跳转到第17种色彩判断部分 M5 K$ Q5 [1 V' {
* p3 Z# W0 @+ t$ P M. k! U mov cx, $A //字色或背景色? 没有去详细了解请自己测试; X! I; k( o- L( T8 Q) j
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
; R' @" }: b( Z mov ax, $A4 s/ `/ _5 P& h
call CallAddr1_0053BBFF ( p" ]) k3 r9 z
mov edx, dword ptr [ebp-$14]1 J- `. L6 E+ F
mov word ptr [edx+1], ax
" K# g3 L/ G/ t# N1 P
2 ^ f/ c& z- E+ M4 I# g$ }2 h mov cx, $10 //字色或背景色? 没有去详细了解请自己测试8 @3 I- K- e+ E" }. N
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF% ?( ? H4 N0 H W Q
mov ax, $10
, |4 @0 e$ \1 s f& S call CallAddr2_0053BBFF " k! j5 s9 F* c+ `$ e. I5 \
mov edx, dword ptr [ebp-$14]! O' g8 E/ o; C! c
mov word ptr [edx+3], ax/ q1 y2 W& i% ^! i$ P
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
1 Y$ \" O+ I! d, a1 U3 y% b8 j6 @) t9 R; y" B5 S) q; v$ M( M. I
@Seventh:
$ s+ p0 s! `& R1 R! @ cmp eax, $11 //比较是否等于17
& J" {. r5 u, t, l% [' S" I jnz @out //不等于就跳转到默认部分
) H) k! q# H, D: Y. o6 S0 n# I" s; J8 |; Y% ^' K: W6 @& V
mov cx, $A //字色或背景色? 没有去详细了解请自己测试
Z7 J* W3 t3 U- h2 y" c mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
- l1 D' A W; e3 O& i* W mov ax, $A1 |# t; p! D9 }/ }* A; m' ~9 Q5 _9 W
call CallAddr1_0053BBFF
" {4 m, ~& l: Q$ F$ d9 T mov edx, dword ptr [ebp-$14]/ S' L# Q* o+ ]- c
mov word ptr [edx+1], ax
7 y. A4 E4 f7 K! N+ a. A% _
" Q \% n9 d4 c8 C+ s' P mov cx, $10 //字色或背景色? 没有去详细了解请自己测试6 s: e+ L# g. X4 a
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF: z$ e- k! G" l4 v& _- k
mov ax, $10
& i( K) Z0 m; A1 g" W5 t Q2 G, q call CallAddr2_0053BBFF , b, X( V( M0 K2 j1 E
mov edx, dword ptr [ebp-$14]1 Y5 x3 M+ N/ ^6 H
mov word ptr [edx+3], ax
# x9 ?! Q0 |0 ?7 `- l* f) V( O8 v jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs+ M3 c! R7 C* }' X- ]2 s
//5 E0 q9 [; Q- A% s
@out:
9 a# Z! k. K8 n; J b' b jmp EndAddr1_0053BBFF //这个是跳转到默认的点
+ g$ G7 z1 z- A" {& p/ L2 `+ r# o5 J# X& C
@OldCor:
9 X1 B6 |/ U: q- P# L jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值
1 T% A1 l. Q2 r( A: T' k# v end / b2 R7 [3 Q' a* A: }
|