本帖最后由 快要发癫啦 于 2023-1-6 09:35 编辑
, l; i( o4 ]: Z4 L" @" s
; {9 P k# ~* T; h上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
. C1 e l: ]9 m
, y' r3 _; t: [5 Z: f dll里面进行内存地址读写
' _, T. L2 U, Q* L& R" _3 L7 z0 [; m0 Q+ |$ `% X; {
我是在 ) G4 G/ x" J: V0 q6 j: m
. o& Z3 j; u1 S3 a: P6 { 0053BBFF |. /0F87 41020000 ja 0053BE46( T2 ]; S! p- }$ S1 b: `
. K3 ~/ h2 ^5 V
在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写1 \9 a7 ?7 ]! C: r% P. W
! U: e W3 c* F) o0 n procedure InitDll();
- k% Q7 c8 Z! h var: X0 N6 H5 t4 x1 f& g r
p: Dword;
; q: L: ^: k' J9 d) p- J- d. D1 A4 [ begin/ s7 V k% ?$ n; w3 X- e2 v1 e: ~
p := $0053BBFF + 1;, f$ B/ c( d' S" z* f- E
PDword(p)^ := Dword(@proc_0053BBFF);
7 g9 v" T6 N q8 B end;
: {1 P% J4 I% A$ G
# a% B' s0 E0 L/ ]" Q& ` 在自己的代码里面写一个色彩增加的函数判断比如
: M. z# C/ E" G1 b$ d6 b5 g! H6 @. d# Z
7 I$ i* ~5 R) f, s5 V, J/ g$ \ delphi代码:: p0 Y3 g: y; g; y% u, e N/ b
. V! v) V+ G$ b! G( X% _+ [
var
3 _0 W5 ? ? \8 L EndAddr1_0053BBFF : Dword = $004F470C;/ ~; p& p) B' k5 w7 J* R
EndAddr2_0053BBFF : Dword = $004F44CB;
, I& c' ?6 v7 [" ?. o# } EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转
e6 G4 k3 c8 ` m: [, v' N- ]5 a3 q
CallAddr1_0053BBFF : Dword = $004611D4;
0 l3 ~$ G. v* i CallAddr2_0053BBFF : Dword = $004611D4;: \! A: |1 q: N
5 T- T0 Q0 U6 c8 k' T b7 l procedure proc_0053BBFF();# ~% S* i% u. w k8 I- Y
asm
, W/ n6 W% |- f$ u. T& F$ L% Z cmp eax, $10 //与预先设定的 最大17比较
$ T8 f3 t& `, S0 I: X) y2 I" { JLE @OldCor //小于就跳转到默认16种色彩赋值
' o0 w, k j$ r+ X+ o
! K W# Q( L% _& W6 P# o5 n) ^/ t cmp eax, $10 //比较是否等于16 0 r# W/ \7 p: L H8 L$ z8 X& j
jnz @Seventh //不等于就跳转到第17种色彩判断部分2 n# [! X/ i* c3 F3 f% Y4 C" c
0 e; _& Q& k7 G
mov cx, $A //字色或背景色? 没有去详细了解请自己测试2 _( d) w6 G0 H: G% r
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF6 z7 ]7 R9 _ \# {
mov ax, $A2 t) b* \$ d* T) T! x9 B1 p
call CallAddr1_0053BBFF
9 B5 O6 o% L& [4 @5 `5 A mov edx, dword ptr [ebp-$14], _! l" i9 E0 ~7 i; e% E2 l
mov word ptr [edx+1], ax
5 W2 X( e0 E; T# @3 V- u& M8 w/ L* {1 M5 M1 R8 I9 m0 F
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试9 v. B+ |, b. B- o) f$ z" J
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
& o: }' q2 r0 l5 q( H+ T mov ax, $10 r. z. z( V! I) ]/ g
call CallAddr2_0053BBFF ~; B; U: O( e$ S! l+ a
mov edx, dword ptr [ebp-$14]
" d7 j9 E: u3 G u5 b mov word ptr [edx+3], ax
: w5 s9 A# @% P+ ~ jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
7 o' |! d( r4 I8 }$ {. C
" e* _6 Q' k/ c* n @Seventh:7 ^% U- H: `/ E% u
cmp eax, $11 //比较是否等于17
; x j- s9 D8 W/ L2 E+ j( I# Q jnz @out //不等于就跳转到默认部分
y: s7 `. y ]8 E) t; I( p
1 f/ |& F5 S/ _8 ? mov cx, $A //字色或背景色? 没有去详细了解请自己测试0 T. b7 W: n+ e6 m* I( M
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF4 F2 h+ q# x$ }; S, j0 L
mov ax, $A
2 E8 D8 p5 U- [) Z4 \ call CallAddr1_0053BBFF ( A/ e) I' V6 Y- X
mov edx, dword ptr [ebp-$14]6 i( x- l* v) m
mov word ptr [edx+1], ax2 l. q) l, B2 A6 [7 a
A7 [! `6 F' x( C' i
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
: ~& e E, A. |4 b0 V9 n; D0 v mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
$ E% T9 p. f4 L2 f/ K5 m n mov ax, $106 x8 `/ R! ]$ b1 i
call CallAddr2_0053BBFF
; ~4 z/ t* N% Y, }( g1 k _# ^$ P7 Y mov edx, dword ptr [ebp-$14]: e. ~) I9 Q/ e9 J* J
mov word ptr [edx+3], ax
2 b+ s- K) Q. r' Z) Q$ A jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs$ F t6 e; b6 s1 h8 c
//
0 d! j" G/ N% T) E7 z- E1 ? _ e @out: & j, V0 v0 q# z* t. S
jmp EndAddr1_0053BBFF //这个是跳转到默认的点' Y( ?6 j- o$ }: h s6 d9 I
3 `" Y2 f0 x7 O; B9 g" v5 A @OldCor:$ r$ e' N8 r2 W; H. v: j
jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值; j# V* S/ N4 P# |: C+ R
end
- ]7 j+ n! d$ ^# h/ x" [- c |