本帖最后由 快要发癫啦 于 2023-1-6 09:35 编辑 . }2 h3 K! H/ p; r# _
! g. U! m+ o* D" _, k7 U上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在+ x, Z( A( x. T0 ?5 H0 I# w
! _+ S4 Q! i9 D' U! e dll里面进行内存地址读写
- n2 m: p- D5 M. @) w% ?. v+ h8 m7 i; f. m! v ?1 |
我是在
Q* W" O% q3 C' [% J* g' ^! ~ 3 n0 l3 V7 h; e
0053BBFF |. /0F87 41020000 ja 0053BE468 K. e. Q- r1 X
% `5 B6 W* P& j3 ?
在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写$ B k( i- Q; @" j+ X7 |3 Q
4 F3 y& T5 v2 g# `2 o
procedure InitDll();0 P# n9 c3 z& n
var
8 a- R; C' @- I4 X0 d( I p: Dword;& N/ \8 [& `' p
begin6 j: H ?: F) s6 I1 d5 Z
p := $0053BBFF + 1;
9 k( E7 P* H2 Q; j& P! g PDword(p)^ := Dword(@proc_0053BBFF);
- c, s* n+ Y* m- Q+ _ end;9 w: F7 I0 J" ?3 h
! X. H( n# O% K( K; P. V
在自己的代码里面写一个色彩增加的函数判断比如
+ b7 e; a: S0 l' Y/ d! K( L! F `" y' o/ Y5 S; D9 `
delphi代码:7 J9 N4 F# U* Y# P9 @2 E: M1 ^
" ]1 \4 j# [, X+ I5 A' H( F
var1 |0 E: R( _% ~ C; R" F
EndAddr1_0053BBFF : Dword = $004F470C;/ z9 X X( T5 G
EndAddr2_0053BBFF : Dword = $004F44CB;" y* v$ ~- s3 f) B% G* u$ b, u- e8 d
EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转- ^( ]* e0 Z/ d6 i: q
) n- W$ B, _/ u9 N: M
CallAddr1_0053BBFF : Dword = $004611D4;
; b8 T2 o9 b: W' r0 g& H CallAddr2_0053BBFF : Dword = $004611D4;0 D0 _8 D) [1 ^4 j
2 y' i, ~6 } {2 E* |& C. f8 S) X7 h procedure proc_0053BBFF();
( r* E* T3 D. B$ K' } asm ^ C! [9 `) h: W7 ? w
cmp eax, $10 //与预先设定的 最大17比较# H: m& v; |7 ^# ^+ A% k
JLE @OldCor //小于就跳转到默认16种色彩赋值
! K1 \) m* h5 X
: Q" h$ R4 G. c2 H9 t cmp eax, $10 //比较是否等于16
+ B4 `! F/ P# ], r8 g jnz @Seventh //不等于就跳转到第17种色彩判断部分
/ K+ X* ]$ M( i
3 K4 T5 p( G2 K4 G- d; M% S3 B mov cx, $A //字色或背景色? 没有去详细了解请自己测试
) f. L( a2 d( O- a1 S mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF8 X/ M7 U( ?- e" B0 c
mov ax, $A
# Z/ k/ d6 t; r; M; q( L( @, A call CallAddr1_0053BBFF
$ ~9 y6 x$ B. x% h mov edx, dword ptr [ebp-$14]
+ C, O3 U" x1 d mov word ptr [edx+1], ax
9 a2 V, K. [6 O% I [% ^5 @. a" r/ P2 ?
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试( Y" a v$ {3 {4 _! ^4 i& `
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
) r' I4 L4 ~+ L1 Z mov ax, $108 J* z( J( N2 x' U
call CallAddr2_0053BBFF
% B- t8 R1 J# `8 d$ F mov edx, dword ptr [ebp-$14]
4 H# r; j: I6 c i# i mov word ptr [edx+3], ax5 U) ]6 w0 _+ ~
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
# P. @3 |+ n; @7 v2 T0 w8 ?8 j1 o, O* i
@Seventh:+ p, G' L v$ j; Z7 z! T# j, l
cmp eax, $11 //比较是否等于17 3 S5 R4 I, h D" R% Y
jnz @out //不等于就跳转到默认部分
4 t; Y7 S8 o/ f2 c0 i% m3 i- Q! c) ?* X( ?+ j
mov cx, $A //字色或背景色? 没有去详细了解请自己测试/ F1 R: A( u9 h3 T5 J2 |
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF8 V% A+ s6 S( f: F' n8 A
mov ax, $A
) O. v# F4 |1 ?! G1 E i+ U. z call CallAddr1_0053BBFF
- Q9 y$ `5 r6 d4 {0 M& L5 r! Q2 F% f5 m mov edx, dword ptr [ebp-$14]4 H) k w( w* h {# K* X' u
mov word ptr [edx+1], ax. N0 V o1 i) N
) e3 s& _3 x4 W( e k
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
; e" E1 O7 H% z: m# D/ Z mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF+ G1 V/ f* E0 d7 M
mov ax, $10
1 ]1 F$ @1 E1 l call CallAddr2_0053BBFF
! H* t5 ], d; f* J4 y T& g mov edx, dword ptr [ebp-$14]+ A* U7 R9 C" j I- g
mov word ptr [edx+3], ax0 w# [/ r) `/ B# ?8 T6 K
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
' ^" `- G6 o; ~& Y //: ^4 i% k+ L: c. |2 z) [5 Y1 W
@out: $ }- t j- }1 K( b
jmp EndAddr1_0053BBFF //这个是跳转到默认的点
- D) j& e) M# U% }
0 ]/ B- }: I6 V$ ]% T @OldCor:6 f1 j% f h, Q' o& X# S, j
jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值& N( h" p! O0 A3 D
end
3 g- [- H: c: D& `9 b! ? |