本帖最后由 快要发癫啦 于 2023-1-6 09:35 编辑
" \) [1 o5 c7 t- T; t" N
; n4 N0 O5 `' Y上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
* T8 h% A, e# }' i
! Q! f( X; t6 M$ E$ N, E# X" z dll里面进行内存地址读写; ]2 L$ c! {$ H! ^$ Q
3 M* F7 h5 t9 C6 c, ]
我是在 ( \) B$ y% P, U4 H6 d) N% C# ?. ^( G
, P! H3 `+ b$ p
0053BBFF |. /0F87 41020000 ja 0053BE46, P* J" F7 P9 G
0 n* e9 _% R8 j3 w# a: D2 I 在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写( a0 \! z4 w0 `
7 L" `: G0 T* r9 H' y
procedure InitDll();) V7 I$ `# @# d/ f0 W3 Y0 g
var& C9 N9 K! R% _ W6 G! j" s7 m
p: Dword;! i( f4 r* Q6 K' V
begin; w S1 {( ]% e7 \- K
p := $0053BBFF + 1;
0 u* i* ^0 c4 @/ p PDword(p)^ := Dword(@proc_0053BBFF);" n! B9 `+ `% n" M7 J6 Q
end;
. _( d; A* ^. Q: M
% c: }' ?% S+ ~% h/ D; _/ p$ \0 x 在自己的代码里面写一个色彩增加的函数判断比如9 {8 q0 e' [: g g
u$ T7 S9 w' \5 M) K delphi代码:: i: T7 O7 e. v9 Q0 S. S4 m
) i8 B0 n- o: R% O: @) n5 R! | var# B0 _/ b1 ]! |; J1 ?0 g, j) O
EndAddr1_0053BBFF : Dword = $004F470C;1 c$ }% C G% ~. L! T
EndAddr2_0053BBFF : Dword = $004F44CB;
* \5 N3 h2 N# H% m* R: R) k EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转
( J" s; [* L: @' H& d* |6 N: m N2 p
- Q0 R% O4 z$ @: v$ K- W CallAddr1_0053BBFF : Dword = $004611D4;
+ H6 b, N$ n* v/ E: m- Y CallAddr2_0053BBFF : Dword = $004611D4;: L6 ]+ `/ `0 x9 j
% ^5 P E% c; j8 G2 k, \ procedure proc_0053BBFF();
1 h& L' ~- u6 S! A6 ~ asm
0 t5 t* S. D% {6 `, v cmp eax, $10 //与预先设定的 最大17比较' N+ h6 \3 o: i7 W q* S
JLE @OldCor //小于就跳转到默认16种色彩赋值" Y# H, L9 X; `; U9 ]" f! T
5 R5 M3 X m4 K4 ` cmp eax, $10 //比较是否等于16
( r, s% C% p: t6 w2 n jnz @Seventh //不等于就跳转到第17种色彩判断部分* ^# Y0 I) D- C" Q) y* z$ f* @ t5 f0 X
2 c7 H0 s; m) P$ \8 s
mov cx, $A //字色或背景色? 没有去详细了解请自己测试
* t* O6 @, m; a mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
' E* \+ G8 v4 u5 w5 ]0 _# N, z mov ax, $A
, \4 F* t; X/ S4 {8 e( | call CallAddr1_0053BBFF ; u9 Q( p+ m! C; K
mov edx, dword ptr [ebp-$14]
h/ l8 q g: @% H; Y mov word ptr [edx+1], ax! \5 p5 |5 U6 _: |- z/ Y- E' U, X
- M; I Q6 h/ g$ T
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
8 ^- b/ q! w) d' U% v& Y5 s3 f' f% a- ~ mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF6 a4 t8 L4 Y7 ^8 @2 S
mov ax, $10
+ P9 @. P; G4 A7 Y( n! f call CallAddr2_0053BBFF
- L, S- v' F1 Z mov edx, dword ptr [ebp-$14]% q2 v1 L: O& O4 q
mov word ptr [edx+3], ax) l- F- e+ O$ q4 S' K4 C
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
: R/ e" y& `4 d& c$ r$ f. f% _
0 ~! |3 ~+ O1 A @Seventh:
6 B& ?/ w5 U" L7 Y: R& @ cmp eax, $11 //比较是否等于17
" [$ ~$ \! h w- j# | jnz @out //不等于就跳转到默认部分
& R' N) W3 q% r3 z V
4 Z' l& C# w. @4 Q- F( ?, k/ S mov cx, $A //字色或背景色? 没有去详细了解请自己测试: ]; e1 ]' k6 x( W: w, T% q' h! b
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
J G% V# k+ @4 L2 ? mov ax, $A
9 N6 L! u; H6 l. D" H4 z call CallAddr1_0053BBFF
7 Z& D, g. K+ a0 s" J mov edx, dword ptr [ebp-$14]$ e) ^+ j, {8 C! {( d
mov word ptr [edx+1], ax
( I) J1 s. r% C$ V3 g1 q5 Q, ^; n$ h5 d, |- b0 F2 s
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试" d# S1 }6 s6 w6 U
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
. O+ m+ J) z8 K. L' T mov ax, $105 n z& e: ~4 K8 e) _
call CallAddr2_0053BBFF
2 X, q) _. t+ _5 b6 ^9 D; k/ v mov edx, dword ptr [ebp-$14]% n, }% ~( C) q, \4 P% e; z
mov word ptr [edx+3], ax
5 \5 B; e/ S9 t1 e( ^ jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
" I6 B1 |9 a7 o: M( I //2 n9 \$ ?& g7 m$ i. z
@out:
8 C. j1 X- Z- M ] jmp EndAddr1_0053BBFF //这个是跳转到默认的点3 ]) y' V/ ~/ S8 v# J0 m& w- y
# c8 j6 k0 o; S& v9 ~: T! z$ V @OldCor:
- A$ x- V3 D, o/ y8 S; c jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值$ Q! _4 t) g3 q1 C u0 V: L
end
8 X/ n" t0 O5 q; |4 J |