本帖最后由 快要发癫啦 于 2023-1-6 09:35 编辑 * @" M: U5 I1 b8 t* ]
+ `% {- H$ r) I6 i+ s$ l! v) \上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
# O- C L2 k+ [) w7 z6 R3 r5 e% {: Z; J$ \/ M
dll里面进行内存地址读写
1 M9 ?& n: m3 ]- O
- _9 e! E% T/ N: t0 l4 `& p( v* E 我是在 $ k0 C! U4 j+ O' }8 j7 d
3 D4 Z5 V9 H& u; V" M+ H7 i 0053BBFF |. /0F87 41020000 ja 0053BE469 P& z- o3 `0 E. q3 v6 F
6 x# W4 H* j9 t: r3 Y' P o
在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写
+ |4 M) U, {6 @% h) q1 [: m. c) b+ [) B% K
procedure InitDll();
) o& W+ a* ~ ~1 m0 V( v5 A9 c var
7 H6 E' m6 c! ?4 r; \6 o5 a p: Dword;: C: w+ F8 p/ Q1 i5 Z$ c. c4 T
begin% e' e' k: X9 @
p := $0053BBFF + 1;
3 a, Y! b1 W7 [1 ?# R PDword(p)^ := Dword(@proc_0053BBFF);
* x3 m6 k; \; m5 f a end;$ ~$ p$ _" G7 b- F
; {( X; p" G/ e, K9 P7 \. ? 在自己的代码里面写一个色彩增加的函数判断比如- H" f% S! B1 E1 [
, e9 L/ ]+ f$ E4 Y7 J delphi代码:
d* j3 ^+ g8 m: G. F) W! J7 ?& W$ i n& E
var+ S, A* u- S L' ]9 ?% E
EndAddr1_0053BBFF : Dword = $004F470C;
6 d! L: ?& V- n/ t2 L EndAddr2_0053BBFF : Dword = $004F44CB;
9 O4 i. I4 d- z& a" o2 V6 O EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转
: K8 Z6 k. G: k; E! m5 M3 C9 t1 U" V! Y$ G6 \- i
CallAddr1_0053BBFF : Dword = $004611D4;4 m& e6 P2 X2 N4 A2 u
CallAddr2_0053BBFF : Dword = $004611D4;7 |- u& z5 H; H, }; Y
O4 z2 ^$ E2 E1 h procedure proc_0053BBFF();( B( S8 v* a5 J; X
asm
) `# W( ^$ k. o5 s ^/ p3 j cmp eax, $10 //与预先设定的 最大17比较- \0 {! K; R! b$ }2 ^' v( }
JLE @OldCor //小于就跳转到默认16种色彩赋值% v6 @( e; o k1 J! i
+ u, H) s& z( S+ q cmp eax, $10 //比较是否等于16
+ `- B' n$ _) z jnz @Seventh //不等于就跳转到第17种色彩判断部分: s, E7 J" L [& g( y! k2 V: b
5 a: ]: B# U0 `7 p
mov cx, $A //字色或背景色? 没有去详细了解请自己测试0 U0 @- Z8 `5 P ^8 i- _
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF5 C8 m# K7 K" N( D
mov ax, $A
1 J! d! |2 i/ ]* Z: B# [' f call CallAddr1_0053BBFF " e& s2 U, ^* C
mov edx, dword ptr [ebp-$14]$ Z) P4 Z# ~9 e4 r- n
mov word ptr [edx+1], ax% I; G: {9 V% Y
7 G3 X* u, b( ?% J mov cx, $10 //字色或背景色? 没有去详细了解请自己测试: `$ c3 ?# ?6 p2 q9 R, i
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF( L3 ~) V% [ |7 h
mov ax, $10" B# v' E! C/ i2 M ~. u- R
call CallAddr2_0053BBFF
1 V: y& t4 j: p3 d: Q( B# H mov edx, dword ptr [ebp-$14]" L7 [/ e6 [2 J1 I! }5 l$ y4 y
mov word ptr [edx+3], ax, S& m8 ?$ X6 e, d+ q
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
9 x+ g! F! }& f! G2 [; Y2 N# f+ k& W( A; ~' `1 z
@Seventh:
& U" f! A! \3 Z0 {8 ^- m cmp eax, $11 //比较是否等于17
* j6 D0 ~" `: K& Z( c jnz @out //不等于就跳转到默认部分
+ X/ `- J! Q' v* L1 r5 L6 l; E/ r7 g5 _
mov cx, $A //字色或背景色? 没有去详细了解请自己测试
: v/ [, X/ Z- ]# m mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
# w& x; @. G5 G8 k) ~ mov ax, $A( X1 [4 y) Q; x
call CallAddr1_0053BBFF
' o) i( A# g E" c/ T mov edx, dword ptr [ebp-$14]2 u/ G* Z; s+ \# o
mov word ptr [edx+1], ax# ?% ~3 q! c9 R) \+ {
- q2 n$ ^& [+ \" A2 v
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
- l7 a3 P7 D- G" y$ A mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
# `1 Q/ A% R8 U, x mov ax, $10: B7 l: R3 P5 G$ V. A1 _# f1 Z5 F
call CallAddr2_0053BBFF T' F4 A( b" g& c3 H
mov edx, dword ptr [ebp-$14]
: u, k: Z* T, p9 `* E mov word ptr [edx+3], ax
) Y2 q- f7 |( x& l jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs5 X d( G* I9 o" a# _2 C
//
' R. R0 \5 q$ v+ Z/ [ @out: & K1 f7 s0 g# K7 p- G! X
jmp EndAddr1_0053BBFF //这个是跳转到默认的点
* x; g4 \& ^/ H5 n, f- L5 E( Y. o. z/ K) \+ c
@OldCor:, M! @* n, f3 W" s, Y
jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值. H! q: I1 M6 C5 V) X
end
: ^) w; P0 D0 z6 [) r |