本帖最后由 快要发癫啦 于 2023-1-6 09:35 编辑 5 S$ C* }; C+ ]' F
. O0 i; ]* e8 e! N- f) p上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在; m+ n3 k( S7 Z' I
# E, B& t. ~$ }+ ~# u u
dll里面进行内存地址读写
4 k) Q+ X! h1 t6 Y* A) o$ V- U- e4 T
9 `2 L6 x/ _; i 我是在 i4 T5 ^: i$ }: P& Z1 D4 O
; v- h) ^' X$ I$ V7 j; q 0053BBFF |. /0F87 41020000 ja 0053BE46' ~1 G# @' _" Q
# j0 X' j, F$ D+ h- I* V: D 在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写! c& b" _) y$ t# b8 Y: d' q2 `
' v7 Q8 d; m* Y' j/ m3 R2 U procedure InitDll();
# G# E3 W$ B7 v7 @$ ] var
# F! P8 n+ q& ^ p: Dword;
7 A, l' S- _ o0 }: M% W begin0 _% ~0 J2 }7 r% ?0 {: M+ x
p := $0053BBFF + 1;
+ N- V* Q# A4 T- m; C4 E PDword(p)^ := Dword(@proc_0053BBFF);1 l9 X2 l1 [) J' q! J
end;6 M0 S) Q$ B4 Q ]
. i/ |- V% l3 q$ h$ e2 z& F* x
在自己的代码里面写一个色彩增加的函数判断比如) o/ D7 M/ q- A9 O
3 z/ t; C" u/ B# S: X' e) i delphi代码:
( l1 Z5 p! L8 g2 F) o% s7 T- C6 f$ W0 D# H
var
3 S* U: E6 e% R+ c# | EndAddr1_0053BBFF : Dword = $004F470C;
; T; ? A& c z# `3 o, {) _ EndAddr2_0053BBFF : Dword = $004F44CB;! U1 i- \4 I. E% S# w
EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转
% _2 r% K4 c# ]/ ?: n' f7 k% s K# B3 w# s* f
CallAddr1_0053BBFF : Dword = $004611D4;
1 X9 [# w9 M" V& a# | w; a* R CallAddr2_0053BBFF : Dword = $004611D4;+ f$ A5 {; V) o6 l8 |5 ]
( r+ S: \7 I- a
procedure proc_0053BBFF();
`: F$ Y' O( Q5 A asm1 _# J) n& a. `' |! q
cmp eax, $10 //与预先设定的 最大17比较2 S* l5 S/ P8 A
JLE @OldCor //小于就跳转到默认16种色彩赋值5 |8 X& ]2 Z: |! s5 P, I
- @" N! d9 R! n
cmp eax, $10 //比较是否等于16 $ i) {7 |5 ], |# W3 d- m
jnz @Seventh //不等于就跳转到第17种色彩判断部分! g' V/ \/ M u, j
" }" O) K! n. @
mov cx, $A //字色或背景色? 没有去详细了解请自己测试
$ S- D4 G* D3 n9 z mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF! A% c* ` [+ E+ _
mov ax, $A
V0 l" W; C" C2 | call CallAddr1_0053BBFF
- S9 }$ ?' g! \ mov edx, dword ptr [ebp-$14]
2 P" D5 C2 s) r2 | mov word ptr [edx+1], ax# @6 Z* ?3 L; b* f9 _/ f+ c$ P
, p1 M; x6 x+ X% R mov cx, $10 //字色或背景色? 没有去详细了解请自己测试& q& b- b) @5 J1 I0 D. R! Q. L
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
: d) g. C7 y, ^5 N, u7 E0 L) t mov ax, $10
! U2 f6 n: e% G. h call CallAddr2_0053BBFF
" t8 H. ], Q+ k6 M. E: J mov edx, dword ptr [ebp-$14]/ N* S! w- c- R0 T+ m( L2 O
mov word ptr [edx+3], ax
/ Q4 l% O. d% e! O/ @; T- P jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
0 T8 B9 ^) N: j; C0 ~
* l) g$ [* F- |! \7 @ @Seventh:4 j* j3 o5 w- J1 b
cmp eax, $11 //比较是否等于17
9 @2 v* V2 M: { jnz @out //不等于就跳转到默认部分
2 _$ f, T/ q) b; A
& @$ x: l! Z" k- o: }& e mov cx, $A //字色或背景色? 没有去详细了解请自己测试
, r6 Y6 \% f( J5 R mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
# `5 @3 l' N; T5 L mov ax, $A3 T9 v2 s6 w p7 x9 o' K) R
call CallAddr1_0053BBFF ) Z- ?3 }$ b$ A( |! y( S' {9 q
mov edx, dword ptr [ebp-$14]$ z+ P+ ^3 p. l% t* S/ J! [% s
mov word ptr [edx+1], ax1 _( ]- I! i( W
* m" x: Z- Z% c) i/ s* p" x V: u
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
* Z$ d9 q: v8 \5 A- j- [ mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
. }) y8 w# C; A mov ax, $10
4 N; N1 t2 y& ?% L% E9 b# ~ call CallAddr2_0053BBFF V X ~$ c# z5 H% P9 y& F
mov edx, dword ptr [ebp-$14]
5 y0 A# A z7 h* \ @' b V mov word ptr [edx+3], ax9 V1 k3 N; J* [( w5 I5 n
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
* L3 E Z+ _/ m- Z5 o) y //: u) Z+ S# d% r( k4 H- l7 i/ I
@out: # y# b( O; \+ K, B% [& y# Q1 p" I
jmp EndAddr1_0053BBFF //这个是跳转到默认的点
! k* w) ]0 v$ K! D9 P9 d e& z( g h6 @7 |# u
@OldCor:
, }5 C, b: {/ }+ Y" y( Y jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值
. k+ i z7 X6 @% c end ' m5 K+ J3 d: j, [- b
|