本帖最后由 快要发癫啦 于 2023-1-6 09:35 编辑
# M" F3 Q! {; I$ w) I
6 s0 }5 p. e) _上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在. l) V' L S ~ _- q4 W- p- p
1 p" Z' q0 U& x, x: {" a( M
dll里面进行内存地址读写
% A2 P4 _; ^* [/ e
( j2 J& ]0 Z/ e7 c- e: a 我是在
$ v. Y0 u" }* A / ?- x3 j- W% u$ e- e
0053BBFF |. /0F87 41020000 ja 0053BE463 Y4 P: r5 l# J o# k: {
K" T- r: ^+ F+ ~7 {8 z5 e 在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写
+ B" e6 Y9 P% G5 n* m( `2 c9 d- c" ?/ M2 U$ x8 n
procedure InitDll();
/ b+ M9 C/ P9 s( ^3 ^ var% E) ~$ s! Y6 w& h, ?6 G( p1 `
p: Dword;3 a9 U" M& j# N$ n4 q, y
begin
& C- r& c* l. |- u8 R p := $0053BBFF + 1;
$ |& \3 ^$ }7 H1 w/ X1 e PDword(p)^ := Dword(@proc_0053BBFF);
) o1 J, k) n5 f3 R5 p end;
6 `! P! `: q% Q6 C4 `, X- G6 ~
7 I1 [2 r K. x ~" d" }+ w 在自己的代码里面写一个色彩增加的函数判断比如9 w5 y1 k! a( Q4 u6 E) p0 r
6 T$ B( T" Z4 F+ q. z4 J* n
delphi代码:
7 H6 N8 B4 t' ?. f S2 ^; ^4 a8 s }: @% X" ?' m" k" f
var
; [6 v- X' n9 M' H3 M. P0 { EndAddr1_0053BBFF : Dword = $004F470C;
( q; f( Y+ `6 I5 Q7 k. s2 P2 F. ~ EndAddr2_0053BBFF : Dword = $004F44CB;! b2 ]" ~) D, Z8 x( E
EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转& Y9 O' p" n* { Z$ v/ F7 {
7 J7 }2 G* u' \: O; S
CallAddr1_0053BBFF : Dword = $004611D4;
6 C: l- h2 _0 Z/ P CallAddr2_0053BBFF : Dword = $004611D4;. ^0 A# z3 k! n6 J1 p, m
9 u, J) m8 L( S procedure proc_0053BBFF();
6 b! o1 T- t- {5 D asm
: k( H g+ a) Z# x- ] cmp eax, $10 //与预先设定的 最大17比较
: ~& Y+ R) P+ M$ ^: ^1 j JLE @OldCor //小于就跳转到默认16种色彩赋值
) x6 z4 n2 {$ q' `$ f0 e
$ s' j2 f Q6 k4 ^3 ]; A cmp eax, $10 //比较是否等于16 2 p8 M* X: w9 X4 M/ a
jnz @Seventh //不等于就跳转到第17种色彩判断部分' n F- c5 ~9 w
4 } B9 y! a4 ^) r! }! \ Q mov cx, $A //字色或背景色? 没有去详细了解请自己测试9 y; f2 g { G# X0 e# _$ N5 N4 Z( }
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
: F9 p+ [7 X7 q+ [' o mov ax, $A
; S0 y6 E4 i' ^8 ?% n2 n* D call CallAddr1_0053BBFF
* h! X# W5 j8 F( \& |+ q: n! B mov edx, dword ptr [ebp-$14]; n9 x( Z, [5 _7 v
mov word ptr [edx+1], ax7 o1 \$ U! O4 h/ N# n' l& b
" j$ e, O; M3 o: b6 Y mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
1 G- n) u. F' V' O- C4 ? s2 P3 H mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF! V/ N6 n0 m. v6 e% H- y0 ]& n# J
mov ax, $10
7 d$ h0 O- I V' v& B call CallAddr2_0053BBFF 0 E `5 T& ] S
mov edx, dword ptr [ebp-$14]
! b8 e$ b, o E) u8 z mov word ptr [edx+3], ax2 c+ O$ s! w% Z; |, Q
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
& B; t \5 b$ P- p
: J" n5 g7 q1 q% \ o* y! h @Seventh:
7 _. w- x& ~' h. E cmp eax, $11 //比较是否等于17 : \9 M( |+ ~, i0 H6 W
jnz @out //不等于就跳转到默认部分
1 N! f6 Q$ H. a, d+ c% N) O8 Z' m" U
mov cx, $A //字色或背景色? 没有去详细了解请自己测试
- B% m/ \4 M; b1 S8 F( e mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
4 |! N' N; o$ s+ t mov ax, $A
) z4 V* f9 f$ z0 W$ _& A( c; E call CallAddr1_0053BBFF : \5 D7 _+ F) B4 R9 X/ v
mov edx, dword ptr [ebp-$14]
7 Z! f, Z4 o: m6 ~7 y mov word ptr [edx+1], ax2 ~; d1 i# r0 g1 I: N, U W {
- q. L `0 a( q p- ^ mov cx, $10 //字色或背景色? 没有去详细了解请自己测试+ H. I6 |* [- @* L* m
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
9 N/ S5 v7 O) C* q1 o9 x) E' G mov ax, $10) T! g; j, i, z4 j
call CallAddr2_0053BBFF
8 T0 n2 L% x* M" t$ e- L- Q mov edx, dword ptr [ebp-$14]
1 n) q* m& [/ l/ I mov word ptr [edx+3], ax9 m& A9 z" ?) k0 {' K
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs' ?+ i: ?- q2 u8 `
//
2 J* l- ], {+ S) B H5 R @out: 5 ]0 y4 k/ ^; m3 f& w/ F; s8 M5 Z; U
jmp EndAddr1_0053BBFF //这个是跳转到默认的点) r9 {, u6 o, T7 l( D
) I( H+ R0 X) Y; ^, ~' z9 v @OldCor:$ T' f% s# r8 C, R- s
jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值* M: _+ y0 o( q f4 a7 g
end
, R% t4 `8 I5 n& G1 o |