本帖最后由 快要发癫啦 于 2023-1-6 09:35 编辑
; @$ y1 H- K4 h2 R# R p, c @0 c" r, r0 ]. h% r. p" Q
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
( N' Z# f$ L1 L7 o: Y+ o- r1 m U% z8 H
dll里面进行内存地址读写
+ J) b; s$ r& {. f" n! N
) M5 t' S7 Z' m 我是在
& i( p6 Y0 F5 |% N# `
) c j# }( ?1 Y- S9 } 0053BBFF |. /0F87 41020000 ja 0053BE46
9 `. Y% m5 z3 w7 a/ B3 Z4 r, T ~3 \+ w; J& g
在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写8 ^# m5 Z: Q' I; N
2 N$ l: c) F: F" L" R( r1 g
procedure InitDll();& v( U5 {# l% B3 Z6 @1 x
var
# x! G% c4 l6 B4 y( H p: Dword;& ?7 V4 p8 D3 T4 ?
begin4 N9 R/ @9 e4 k# \2 l0 p
p := $0053BBFF + 1;+ \/ ~! n+ a6 K8 J( t
PDword(p)^ := Dword(@proc_0053BBFF);
) g# W( p2 g/ I& D9 J3 e# M end;
& [8 K0 S6 U$ N. v. F5 H# m3 y+ m5 Q* t$ @
在自己的代码里面写一个色彩增加的函数判断比如
9 U0 l. ~/ A6 l' X" O0 i/ |8 R
: ^0 z! A# n, V, ^ delphi代码:
^" ~* w6 |3 ~* F9 Z2 o/ e1 K6 u3 n- K( N! n
var
. z) A$ M: ^ f EndAddr1_0053BBFF : Dword = $004F470C;3 a! q! X5 i8 [: J
EndAddr2_0053BBFF : Dword = $004F44CB;5 e2 }, q2 z- J% x( _* Z/ Z: U
EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转& Y0 t5 m! ~' Y. ~+ A; P
: t6 e2 ]& N. E: Z8 ^: k+ l CallAddr1_0053BBFF : Dword = $004611D4;, [7 e, L6 R, B9 B5 q# O( k) ?
CallAddr2_0053BBFF : Dword = $004611D4;
4 \$ O+ n3 M4 I+ X# Q
( u! E3 w& e/ ]& y9 ~$ y$ \ procedure proc_0053BBFF();
$ Q: f$ q& z; _ asm V" I1 J ?: L) L( a* L
cmp eax, $10 //与预先设定的 最大17比较
* P0 ~- g% ^/ h* E( v JLE @OldCor //小于就跳转到默认16种色彩赋值 j* n' Y0 S1 u% ?# x
+ c( |2 e6 k0 U8 P" m) J8 m7 D
cmp eax, $10 //比较是否等于16 5 ]9 C! M$ @" X2 U6 E
jnz @Seventh //不等于就跳转到第17种色彩判断部分6 h1 ]( R' a. A% h, ^
# i7 R1 B7 o4 ^7 c2 w
mov cx, $A //字色或背景色? 没有去详细了解请自己测试( e( o% \6 Z6 y9 s p/ M
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
' r0 |$ f- ^4 G. ]( m) {/ s mov ax, $A3 g7 O* z! {" p) A
call CallAddr1_0053BBFF & ?; X( \7 f- B4 V2 f/ Y; P
mov edx, dword ptr [ebp-$14]
) x) C; q3 \ B7 V9 D8 M: l; V* w @ mov word ptr [edx+1], ax" s! D [7 A; D( C! i# S
5 j; c" _( A4 e* `; h mov cx, $10 //字色或背景色? 没有去详细了解请自己测试! X6 f& ~1 G" g* p9 D, Q; o, x8 m
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
$ w( R( A$ Y; I) } mov ax, $10- X$ _" I, u3 m0 K/ N
call CallAddr2_0053BBFF 8 R0 i. M8 E2 @2 n/ {* X0 {0 p
mov edx, dword ptr [ebp-$14]9 j* Y) _9 e/ |7 u
mov word ptr [edx+3], ax5 z% Z- p6 k; O( t2 N# V2 O$ o6 A4 V; l
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs) ^8 i1 k. b1 I# D, w
- k8 g' ]$ ^$ v3 R1 R5 ]) j
@Seventh:
. A( o/ r3 r @9 Y cmp eax, $11 //比较是否等于17
% o7 n6 y7 Q3 Q0 I9 {4 K0 K jnz @out //不等于就跳转到默认部分5 u% G- _, F( `: D
# m& l$ O! w4 [% _/ R
mov cx, $A //字色或背景色? 没有去详细了解请自己测试
9 l3 w$ _9 i) I9 C l7 j! H$ R: X mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
+ v& O8 B& s$ B" `$ o/ b% I& b mov ax, $A
7 G2 z- U3 T$ f/ W! }. o6 V1 | call CallAddr1_0053BBFF
# |3 p; }0 l8 B5 C' ^# A mov edx, dword ptr [ebp-$14]
1 f: ]! b8 g( F4 [- ] mov word ptr [edx+1], ax
/ n3 c( n& P* s1 b/ o. e4 V( R# e
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试, B& r, Y; \! @) f5 R/ `' O9 w
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
, o- u6 o6 N0 P9 @1 A( P) m0 N; C! i mov ax, $10# S( H$ K. d# \" |# j
call CallAddr2_0053BBFF
! M7 A/ t, F# y. z; H5 ` mov edx, dword ptr [ebp-$14]
/ B! P0 T# |5 a1 y' i* T* D5 ^- G& P2 U0 [" A mov word ptr [edx+3], ax# d+ |( m( ?, W" `; |8 u
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
2 L4 i4 ` Q1 s+ | //
7 s; j" u: I9 T1 y @out: 1 X9 g2 v8 h# a' p0 T/ Y9 o7 c
jmp EndAddr1_0053BBFF //这个是跳转到默认的点
; ~0 k) e% x: A: I3 K' {
) R7 g- ]3 b x9 T @OldCor:
: r# A$ R6 G* p- {# _6 J jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值3 E1 Q# T D7 H: w. N
end
, M( m/ U+ P8 X0 ]; R0 @ |