本帖最后由 快要发癫啦 于 2023-1-6 09:35 编辑 # u7 l) ]4 o+ c% Z/ e9 o
& D8 k' C- s9 j: C
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在- k8 f3 d) t3 H) B5 c8 _
* O6 c* f- `. w5 P
dll里面进行内存地址读写- @6 w9 ?* Z+ ]+ B2 j9 z: t* q
9 h! _& }8 X3 P" X* f1 e 我是在
4 T" H# n, o. Z5 }% f6 L
+ K! c/ x7 Q) p+ E 0053BBFF |. /0F87 41020000 ja 0053BE46( Y' `0 D0 D% [. h) A3 _
) F% R' I6 D) Z ]6 x4 F
在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写; J& Z) w4 p- B+ x
& O# j5 |! \0 g; k9 z
procedure InitDll();
+ x0 b- z9 Z8 }' @' d2 H) e" m var
, U# b, H( ]8 u) G v* w5 ~- T' ]9 ? p: Dword;& i$ A6 e" b/ S6 B* ~' q2 @1 _
begin/ V: g' g& C, G. B4 ]" G
p := $0053BBFF + 1;+ ~0 N6 o& i5 m& `6 i% o
PDword(p)^ := Dword(@proc_0053BBFF);
' q. r9 I# Q8 j7 B) c8 \5 N C- \ end;; L/ ]& s& W& I: @
/ R, O: o6 e4 V$ c; t
在自己的代码里面写一个色彩增加的函数判断比如
) I9 M- V" L( i- n* j+ A M" C+ s$ o* n! x' u1 P/ X, \
delphi代码:
5 k: J! q. w, q6 g, s+ n5 e. ^; A$ x2 e4 Z" b0 P
var
2 E- I+ v; y- F/ P: c EndAddr1_0053BBFF : Dword = $004F470C;: m( ]; {6 x: W) J: B" ~
EndAddr2_0053BBFF : Dword = $004F44CB;. D c& ~0 q8 v/ t- e
EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转
/ y- S9 J8 P( i# R: \% A: v( C1 ^& R* S5 \" M
CallAddr1_0053BBFF : Dword = $004611D4;
8 U, o; B1 ~: s$ U: s- j8 S Q CallAddr2_0053BBFF : Dword = $004611D4;/ Y& A5 F' W n d( |$ w
, n2 K: ~. i8 Z% A procedure proc_0053BBFF();4 U% y* r$ o. I' U0 j* _
asm
9 ?' L$ t! B, x4 R) W$ o5 u cmp eax, $10 //与预先设定的 最大17比较
/ f ?% a9 c! ^, x JLE @OldCor //小于就跳转到默认16种色彩赋值
7 T. v7 ~4 i6 M4 n/ y+ M( B* C! L$ g# H6 S5 K4 _5 G, O, w5 a) @
cmp eax, $10 //比较是否等于16 0 W: R' J! R9 |) T% M; W" S
jnz @Seventh //不等于就跳转到第17种色彩判断部分
& C7 L2 ^$ m& B" B$ b# ?- t9 Y4 x& E/ @8 V, m; X
mov cx, $A //字色或背景色? 没有去详细了解请自己测试
! Q4 [( S% s/ ?. O6 i# o mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF5 d+ v2 _3 Q0 G# `: K' H4 \$ p1 |
mov ax, $A5 P3 p% t( l) J/ f! J1 q$ V
call CallAddr1_0053BBFF 3 U4 g! K5 U Q7 [+ J1 X3 p6 R
mov edx, dword ptr [ebp-$14]
; i( m2 B* f( p1 b mov word ptr [edx+1], ax N( e* Q& {% A( f
L. C' `6 o7 K5 e# ^
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试* `! S0 h/ o7 K+ _% f5 G
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
. M- o( g6 l t5 X mov ax, $10
% p4 i( l- F/ L0 X5 E' K call CallAddr2_0053BBFF - @- ~. B! @( q
mov edx, dword ptr [ebp-$14]
- W6 v' I; a+ r3 ]* T0 l mov word ptr [edx+3], ax
. _% l: j) Y) u4 }) g, t$ u" O jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
4 F( O3 } @/ O& t, j, Z, W( S( _
@Seventh:
) @- H2 `6 t* D! Y% M cmp eax, $11 //比较是否等于17
7 }2 `4 L( k/ T, L( ^1 j4 w) p jnz @out //不等于就跳转到默认部分5 f4 W% b0 P# [& Y
; W! l9 @- ]" a mov cx, $A //字色或背景色? 没有去详细了解请自己测试
2 d7 r: ?. R+ ^, ?( G- U& [& ~* ` mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
: l0 I% S, p+ G( I8 I mov ax, $A
% w1 I, ~7 J' R* V* Y call CallAddr1_0053BBFF
7 P; y- A% X) k mov edx, dword ptr [ebp-$14]7 U; a5 X) f9 w( W
mov word ptr [edx+1], ax1 k% ] [0 T6 p) ] n
7 i" Z ?- i+ g6 g2 O8 G$ U4 k+ O9 u
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
, {, Y/ i. _5 D4 N4 u. ^ mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF$ V" q* A% r' ?3 t
mov ax, $10/ }! K: e& s- K( `
call CallAddr2_0053BBFF
$ ^7 f. Z, _0 P+ i K- d) n mov edx, dword ptr [ebp-$14]+ y" S- } h! ?- t$ ~# N8 a7 A: m
mov word ptr [edx+3], ax
' n2 i2 t* l7 d: M/ q jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs2 X" ^+ i5 N$ J; Q$ l, ?7 M
//
* l4 d2 B# I6 b/ b2 b @out: . ^ x' g& U8 \+ p( G/ W: b
jmp EndAddr1_0053BBFF //这个是跳转到默认的点
9 Z6 N4 q6 b- v E1 L/ D7 l4 K9 x( a0 ^
@OldCor:$ r; }6 C8 x$ L. K* |6 M# V' `. ?, T I
jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值; X- \; D. M6 M. n& S( _/ P8 T
end : _0 r5 m j* c) m# o" r* S
|