本帖最后由 快要发癫啦 于 2023-1-6 09:35 编辑 8 W4 V% a% ~5 Z' y( _% ^
% ?2 }. _. t, Z" ]6 G- D
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在9 T( x4 {# J7 k6 ?$ v" }
$ a- o4 l6 h; n6 H" P- ] a dll里面进行内存地址读写
( w1 Q1 |) ~: Y \0 I5 p. M2 [
( o* C0 p6 B l- y 我是在
" g: N' q- E/ S$ a3 X1 |
/ @, O8 }5 ?+ n4 Y3 { 0053BBFF |. /0F87 41020000 ja 0053BE46
3 T6 ]2 O0 t+ s4 H0 Q$ S
- W2 T! _0 v: Z 在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写
7 r) R% @8 i$ z! h Q8 r F7 r+ \7 }& [* c* F! @% |: N
procedure InitDll();
+ {7 K9 Y) E& b3 l; r' H& Z var4 C |5 u g5 y: m8 `- D
p: Dword;* J6 a3 i8 A; |3 {
begin
# t; B/ {) L ~( T+ L p := $0053BBFF + 1;
: P2 U! K/ e3 X j5 j4 Y8 N6 ~ PDword(p)^ := Dword(@proc_0053BBFF);" r9 [7 @5 @# O( M u1 S4 T, B
end;6 \2 Q7 U' J5 K" J
3 Q6 V R$ B' Z% b8 X 在自己的代码里面写一个色彩增加的函数判断比如' ]5 S" _# `6 b3 g, d: f5 \4 W1 j
- h# L! ~+ ]2 s+ b" G delphi代码:
7 h2 O. n5 q5 P! N1 k+ [
; J) s6 C* }7 b2 H7 d) L var
4 a: o0 C* p' f7 w F" G5 F EndAddr1_0053BBFF : Dword = $004F470C;. \" c5 N2 L4 ~8 q# }4 z* E( u
EndAddr2_0053BBFF : Dword = $004F44CB;- D$ b* l( M, |9 J9 I2 k! I
EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转8 x, f6 {2 E, Y" s: \& K k
9 k1 Y. S9 f" s' o CallAddr1_0053BBFF : Dword = $004611D4;
! S. g: a/ y3 i/ y7 M3 ^ CallAddr2_0053BBFF : Dword = $004611D4;* X7 P& |* x( R6 A6 a
7 w4 Q6 m( k0 B1 X u
procedure proc_0053BBFF();9 k' J+ p$ I# ^, b0 ~$ E
asm+ a- w9 @ I. V9 I2 a
cmp eax, $10 //与预先设定的 最大17比较
% ~# S" c) i& N JLE @OldCor //小于就跳转到默认16种色彩赋值+ l( V1 i, x5 `/ t) O3 q$ t
& L* E8 m( W2 a4 Z" I# [
cmp eax, $10 //比较是否等于16 - T* M. n8 {& y# H( {' `, Y
jnz @Seventh //不等于就跳转到第17种色彩判断部分4 w4 T1 v1 [) S
* b" G" ^( j4 e; W mov cx, $A //字色或背景色? 没有去详细了解请自己测试
7 F3 B! x( a. N+ M0 j { mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF' w& k L/ C A9 U8 F+ l6 y
mov ax, $A4 v: w0 U. W2 }: V/ S: y- L) l6 X
call CallAddr1_0053BBFF 9 @$ W1 E, d) Z- ]
mov edx, dword ptr [ebp-$14]
; f7 J) H* a1 Z) R( O* j, M mov word ptr [edx+1], ax. Q, K/ K( G. Z& j
$ t5 c8 `6 o. Z mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
+ O0 T0 s7 T, }: I0 i! Q mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF4 {8 J& o0 [3 |1 n3 H0 X! J( m4 R- R
mov ax, $10: C* m3 P) v" q* I" q' V
call CallAddr2_0053BBFF 8 ~4 ?) _5 F, l9 k! t; G3 w! d
mov edx, dword ptr [ebp-$14]
8 W l7 `$ q: ~- ` mov word ptr [edx+3], ax
* a. o4 i$ h9 J4 k3 ?3 N n jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
$ l: ^& [! D( g6 ]+ I- i/ K7 K3 M8 [. o O( x+ ~
@Seventh:
5 J% }2 I' M$ G" w5 b; ^ cmp eax, $11 //比较是否等于17 ~! ^0 z" [+ y$ \" A# A( k* q
jnz @out //不等于就跳转到默认部分
4 M1 ^6 ]; f5 k z& v( m/ w: b& o. S2 G! Z: h. k0 v! C
mov cx, $A //字色或背景色? 没有去详细了解请自己测试
0 d# f+ j1 a/ A G- _- m b4 o mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF8 l6 g. O0 P* @) J$ N; t; v6 F
mov ax, $A& Y- ?8 D3 g3 l
call CallAddr1_0053BBFF
, n3 O7 _4 k% u1 b+ x, a mov edx, dword ptr [ebp-$14]7 P+ F0 |/ P1 Z7 t
mov word ptr [edx+1], ax5 C' d( C3 Q7 C# Q. H9 U
1 Y3 s! Y' P& C2 _9 x( }) O& l3 K
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试4 I1 i* H0 K8 a8 m9 R
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF; o7 ], P# T( @, J) v: i5 y
mov ax, $10
! {6 Q9 E; f0 l! T- ~$ ]4 P call CallAddr2_0053BBFF
! }% s( N% E' c- j" @ mov edx, dword ptr [ebp-$14]
% q# I6 y8 J5 m mov word ptr [edx+3], ax
4 D* J* h8 `7 a( M: J2 W jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs& z5 B7 X* G, I
//
: f' U7 a Z y. ~( G9 E @out: & z8 C6 R) z4 i( L7 G# b4 h" @
jmp EndAddr1_0053BBFF //这个是跳转到默认的点
, ^1 L8 Y k- X; l! U! ^) }$ B+ f, k5 R$ T; G
@OldCor:$ G# O- n1 X$ H, E# e3 K1 }( o. H
jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值
+ {, i: P( A8 r# { K8 F end 1 [! k) d" Z" |" H
|