本帖最后由 快要发癫啦 于 2023-1-6 09:35 编辑 : O* M: c7 N1 O2 l" d z3 B
9 @* l7 F7 ?3 `' [& o# V上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在- E: A! M k* y! c
* N' v2 n0 k. ^$ w* C
dll里面进行内存地址读写8 r R; Q$ G" o# A* q2 c% h( S$ [
) q- F7 G% R5 A- h9 l* S }) ]
我是在 ; j: P# f8 k A! X4 { b
& C; `" R% s% q 0053BBFF |. /0F87 41020000 ja 0053BE46$ v1 v. d/ K8 c$ I' q3 z
" ^1 d% ~- s K8 R" q 在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写
) l* k/ H# w0 {: X+ o2 E- [! F% f8 {/ {8 r5 b
procedure InitDll();8 W( A; h. `* E( ~" ]& d- j# N. a
var
0 H5 }" \! s6 `1 F p: Dword;$ }0 n' U8 l- g0 r W& O
begin
; x/ [9 ?5 D- [3 ]1 @! E9 [ p := $0053BBFF + 1;- `2 D& R" @. l" J/ F0 l& @
PDword(p)^ := Dword(@proc_0053BBFF);
& \, E( c$ W$ z# U1 n- l& b end;
2 r$ x6 Q q( _# G+ c2 q! @$ `
2 Z# V: Z# u- @3 [. C; L+ D 在自己的代码里面写一个色彩增加的函数判断比如; Q0 l$ [& I: q, c4 f, M
0 Q) S5 V& D# U w. L# ?1 W delphi代码:
" d) b. F* V2 t: z; p$ ~7 {. Q8 |3 S; @5 l" X; H( ]
var
5 Q% F" X" p$ A. q EndAddr1_0053BBFF : Dword = $004F470C;
% b* P+ ^: A! q EndAddr2_0053BBFF : Dword = $004F44CB;- E( y9 O2 D3 _7 {
EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转
- F' s" [( C b5 P( r+ D; h' N& H j$ q' p
CallAddr1_0053BBFF : Dword = $004611D4;
* _( h2 @# h4 Y CallAddr2_0053BBFF : Dword = $004611D4;
6 d; K' k k) w4 r# ]* H/ u2 i+ p3 k3 X- Y3 v, r6 u
procedure proc_0053BBFF();; c. A6 Y8 A. G
asm
9 @$ |5 L- \3 ~8 t. y# z cmp eax, $10 //与预先设定的 最大17比较
$ ?* Y8 |! [$ o: |7 } JLE @OldCor //小于就跳转到默认16种色彩赋值
2 g" B/ h; U- f2 }/ U% V$ c( d9 J n6 X1 D) i
cmp eax, $10 //比较是否等于16
+ m) v3 }, P& U( V% c% E jnz @Seventh //不等于就跳转到第17种色彩判断部分
1 C. \* g) M; {
. X. n3 p! N9 p$ C/ U Y mov cx, $A //字色或背景色? 没有去详细了解请自己测试
, T/ s3 P6 @6 ~+ s% [6 U mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
+ x4 W5 E I. j2 j mov ax, $A
- C! c, `6 b9 v. M5 } call CallAddr1_0053BBFF
. `! M* c) g8 L+ u! ~ mov edx, dword ptr [ebp-$14]
9 k- o5 G3 z4 ]. b. b& E+ w mov word ptr [edx+1], ax( ?+ B8 r2 _! J7 f
4 v) l6 q' V% j; a: f0 D/ G7 ?
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试* R/ G M6 w% q
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
7 ^6 j3 G9 N* r( C* Q1 C5 H' z mov ax, $10
2 f0 X0 S B/ d, X4 A call CallAddr2_0053BBFF
% G4 U; O3 M; m" E3 r& | mov edx, dword ptr [ebp-$14]
) P r; Q. T* b$ d. a4 |+ N1 z mov word ptr [edx+3], ax
# v" a/ t+ r. Y' e! Z# ]$ D- K jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs: b/ R; h$ a5 C5 U9 B: ^
/ A- O' ?) d% C( q( X @Seventh:
0 r1 F; L+ `8 i* H- E2 z cmp eax, $11 //比较是否等于17 3 t' y! s; O& A9 g/ z$ s3 J
jnz @out //不等于就跳转到默认部分3 w+ l! G/ K w- B3 m
( `4 [. i5 W! o" x' e
mov cx, $A //字色或背景色? 没有去详细了解请自己测试' }. }, A2 A9 i, ^
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF& s! a0 Q# A5 K9 Z
mov ax, $A
) p$ N% x: P" x) T5 \. K( _ call CallAddr1_0053BBFF
" \, ^/ i* U( j& |$ a, E3 J mov edx, dword ptr [ebp-$14]
: T `4 B I. { mov word ptr [edx+1], ax( b2 j2 I! C. m" V: [
) E! F/ D2 m( A3 x. |
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试9 |9 R$ h7 v: o4 }$ I
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
" ^$ `5 o$ m7 P( p: M3 P mov ax, $10: G# Q4 c7 w0 ^+ \2 K/ _7 y
call CallAddr2_0053BBFF
: a# p: [5 N# _ mov edx, dword ptr [ebp-$14]
9 t+ [( N0 k# e1 \! F9 i mov word ptr [edx+3], ax$ b s6 |! _& u8 w6 Y8 T3 }& M
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs/ ^9 U. F& _% g& i1 }2 x2 q3 L
//
* y! i3 P* C* c" m% G+ q. U/ R @out:
1 F+ J, [0 _2 R$ H( M jmp EndAddr1_0053BBFF //这个是跳转到默认的点# S" U- w4 y* n4 N* M4 X5 _) i) K
6 p1 C0 ^+ u! }: @ @OldCor:
+ m* {! g; Z A, ~3 \( x jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值, z% g, i9 F' k
end
1 y; @# e2 S9 [4 B |