本帖最后由 快要发癫啦 于 2023-1-6 09:35 编辑
5 ?7 g. f( R: l" k0 e9 a4 e+ L
, J- F8 u' i) v( p2 d上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在% ?( A6 W; I6 t1 V$ l3 c" v
& m# z1 M1 d2 K* V
dll里面进行内存地址读写
# R9 I q! Q- z- C P: X7 j0 M9 { q0 v# f* k. W
我是在 4 P, _' s' F$ J' |# s
8 b9 \2 E" g0 R
0053BBFF |. /0F87 41020000 ja 0053BE46$ W2 }# v; e+ P0 q: a- S
) J ]) |* a6 G% e& l 在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写% {+ ]8 s0 n( F
8 B7 r& p" P( ^5 c5 L procedure InitDll();
9 n9 F4 D ]7 ^% @ var$ n, ^8 J, A: l6 `' T
p: Dword;* x% @9 |# ^3 R5 H: k
begin; b, D9 x% H# A. i. q1 j
p := $0053BBFF + 1;
9 K6 j- R) g7 ~8 l- g2 f. ?: | PDword(p)^ := Dword(@proc_0053BBFF);3 n4 G( n2 O6 P3 n% M( l0 u
end;
M v3 I- o0 B9 r0 {
9 u! [& z/ r! K3 G; r3 b 在自己的代码里面写一个色彩增加的函数判断比如" f# H9 |2 z! d
" R) p' x$ w0 Q# f delphi代码:
' [! b* E5 _5 X5 P- @" a' o5 C3 l; T ?, m+ d+ g- n
var
$ `6 N% W5 ^, U. P( X EndAddr1_0053BBFF : Dword = $004F470C;) d8 M( W/ c% j& Z2 e4 T, ]% R$ d
EndAddr2_0053BBFF : Dword = $004F44CB;5 V& Z _3 B3 g
EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转
. y4 Y* m7 g3 F$ x
& Y. P! i4 k2 D CallAddr1_0053BBFF : Dword = $004611D4;
2 X! z# W$ o! a/ X" ~& c0 Z6 d2 u0 ] CallAddr2_0053BBFF : Dword = $004611D4;
+ Y' v2 I+ x) ?7 v6 q$ j
& ]4 A+ r6 Z: f procedure proc_0053BBFF();% C4 T4 s1 ^/ K' ?& h
asm7 x) s5 g m# @$ Z* x' ]1 l9 z: [+ v
cmp eax, $10 //与预先设定的 最大17比较% Q9 N9 t1 t! \/ v" A6 H
JLE @OldCor //小于就跳转到默认16种色彩赋值# U8 L+ u d9 g3 @2 s3 N* i% h. G
5 L: l' B$ y& W8 [" @9 x$ r cmp eax, $10 //比较是否等于16
! s* Z r& F; r jnz @Seventh //不等于就跳转到第17种色彩判断部分
+ E. G' I% V8 I; W5 o' H$ ^; @; {/ p5 c7 L& z
mov cx, $A //字色或背景色? 没有去详细了解请自己测试
- \- r. f" G. J mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF% M0 O! ?! [6 p
mov ax, $A) D! H8 \2 Z- k& R0 |
call CallAddr1_0053BBFF
* b% ]8 Y0 ^2 ]' f: h. t2 T# ~ mov edx, dword ptr [ebp-$14]
: j! @& J+ i1 I7 m mov word ptr [edx+1], ax
& q4 q4 D1 p1 @4 X* B& U( W: W6 L) j8 p6 N& t! _3 `+ d
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
" K9 \) d; R& o) f. v& ]4 t mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
% n% e; W6 K/ J0 ~ X mov ax, $10$ S5 R! R0 Q9 g' j; a/ s* P
call CallAddr2_0053BBFF
, c0 J) F' i3 m, c. |- H mov edx, dword ptr [ebp-$14]
7 C) w7 j% l- o5 A mov word ptr [edx+3], ax! \* _( n# N/ y( l
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs9 d/ I4 K2 E* { O! S0 c" X" F5 Z2 A
) C3 F/ ?5 N' E/ J# a& ^- m
@Seventh:
. r" r" a4 D1 Z4 R cmp eax, $11 //比较是否等于17
/ w5 L+ T! G9 t4 Z7 e jnz @out //不等于就跳转到默认部分
% S6 [+ F Z3 }; g: K
; H* z. W5 u5 p" s/ p: x, a0 L mov cx, $A //字色或背景色? 没有去详细了解请自己测试; S) X* s7 e- L
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF) N+ f R7 ^/ f# ?% ], |5 b7 E
mov ax, $A
+ k7 `2 n" O9 i9 |! d# O* f call CallAddr1_0053BBFF ' o3 D* f* M9 _ Y; M A6 V
mov edx, dword ptr [ebp-$14]
! ]+ Y% p! n; }4 u; u mov word ptr [edx+1], ax
0 w c" w7 |0 I) [, u2 z
- j6 G) _5 I5 x. @ mov cx, $10 //字色或背景色? 没有去详细了解请自己测试9 W( T& ]9 b( v1 l8 x4 W
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
% { f) i; t/ O6 F0 R. T/ [2 g$ l: }# u mov ax, $102 e& _- }* u1 H, Q8 u. J( W
call CallAddr2_0053BBFF ) V T* ]& t8 N: G: W
mov edx, dword ptr [ebp-$14]" n& v' S% ]5 j% c
mov word ptr [edx+3], ax; w; S1 W" y# q4 b1 e
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs3 W* t! L; ?% r4 N
//
+ f& Z, \" H4 t: ^/ g( P& p; v @out: % c% g# z$ w3 s3 F: r. t3 v
jmp EndAddr1_0053BBFF //这个是跳转到默认的点) q/ Z a( ^- g; {& O3 D
" X& y- [6 I& m8 X7 r2 o% c7 r
@OldCor:
- ?0 s0 r1 S r; m6 J jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值$ l# s* h1 \; w- c
end
0 g% e. s% \, S% p |