<TABLE width=500>
: }' S4 T: w" {: y; l* z8 F<TBODY>
$ s8 a0 a2 |' F' O t6 B<TR>
% L S( A2 ]4 t6 O$ Z<TD><PRE>Method 01 $ U9 ~+ @% F& a( e* Q( B' ^: D
=========
( t* B; ~8 y' A$ Y4 S, Z
# _ x3 g8 C v: `% R1 v; g4 jThis method of detection of SoftICE (as well as the following one) is
: |/ R0 ^; o+ i2 ~8 qused by the majority of packers/encryptors found on Internet.5 S8 j5 N) D/ i0 ^' J! a
It seeks the signature of BoundsChecker in SoftICE) _- a# Y' j3 G3 C
& @# B, {4 Z# `$ F5 E* e mov ebp, 04243484Bh ; 'BCHK'
. y$ X3 {* w+ f mov ax, 04h# R) v9 [, D4 b; Z' H1 c
int 3 ; v% N$ S2 U c0 z3 U9 m
cmp al,41 h/ L& g' v. }
jnz SoftICE_Detected
$ ^6 h, W# v/ j/ F/ A% s; z
3 r. e) H5 n+ s9 U; d x___________________________________________________________________________, i; f, C# N1 d; M3 J
) C# h3 P' F% b
Method 02
8 a M8 D4 X3 v O0 M3 g: J=========
+ D4 I; M9 h7 q' W+ F, k$ P
) a' G& p3 K- G6 p. ^Still a method very much used (perhaps the most frequent one). It is used- S Z* a5 a$ W
to get SoftICE 'Back Door commands' which gives infos on Breakpoints,
' |4 n0 y; N+ V% f" T& |9 |or execute SoftICE commands...
! ]" g$ H0 J- d3 `; d" \It is also used to crash SoftICE and to force it to execute any commands
+ Y# O6 V1 w% m1 | Q; ~' J(HBOOT...) :-(( 8 T( v; U- n) N, Q3 _
' J& t* p6 h% N6 J% DHere is a quick description:
( e6 g4 \ {9 ^+ w* L( W-AX = 0910h (Display string in SIce windows)* P- g, i# m+ s. e6 u+ H
-AX = 0911h (Execute SIce commands -command is displayed is ds:dx)* _' u) Y7 y! B
-AX = 0912h (Get breakpoint infos)
# F0 A! B$ W. f1 w-AX = 0913h (Set Sice breakpoints)
4 c4 r b/ \, H0 k# f+ N, Y-AX = 0914h (Remove SIce breakoints)
/ y, a6 C9 P1 J) N3 A2 s" i* z, q% Y0 S8 N
Each time you'll meet this trick, you'll see:
3 \- ~" ?- ]( ^2 g9 C! E9 G3 p-SI = 4647h
. L2 M# W9 O6 }' a/ L" d" g-DI = 4A4Dh7 j S, {6 a! j
Which are the 'magic values' used by SoftIce.
9 F2 ^# K! k0 E7 @For more informations, see "Ralf Brown Interrupt list" chapter int 03h.
( Q" v. H6 s. L7 o
5 F, Y3 \' L- [2 A4 k1 r2 l8 X* yHere is one example from the file "Haspinst.exe" which is the dongle HASP
! u _, j) Q. \3 PEnvelope utility use to protect DOS applications:- {0 w' D0 a- i# u
9 p7 ~% a% x- ~( ^. }, a
2 j( {. @1 p- r$ p$ e, C( a) V
4C19:0095 MOV AX,0911 ; execute command.
7 z$ P& O$ V) N; I6 L" k# f4C19:0098 MOV DX,[BX] ; ds:dx point to the command (see below).4 d) ^2 ~$ ]. n( V
4C19:009A MOV SI,4647 ; 1st magic value.
8 u6 e' W. _) x C; R2 ?# t. Q4C19:009D MOV DI,4A4D ; 2nd magic value.: Q6 S, x8 Z. w: g# x
4C19:00A0 INT 3 ; Int call.(if SIce is not loaded, jmp to 00AD*)
6 S3 _ B1 i; g6 l f( ^4C19:00A1 ADD BX,02 ; BX+2 to point to next command to execute0 C6 I- V# G& c; i) D$ {0 i
4C19:00A4 INC CX. {7 z! r; w/ T8 ?
4C19:00A5 CMP CX,06 ; Repeat 6 times to execute* a$ U7 n& o7 j/ d- J7 `
4C19:00A8 JB 0095 ; 6 different commands.
8 r* P/ J0 H# A' G" K9 ~4C19:00AA JMP 0002 ; Bad_Guy jmp back.
) y. F2 N% k, U4 @3 K) p4C19:00AD MOV BX,SP ; Good_Guy go ahead :)
, `& W( C- w# `# n+ n# x4 T% ~
" E7 d4 r2 N, E! k; yThe program will execute 6 different SIce commands located at ds:dx, which& `3 M$ \( N E0 A0 Q' c6 g6 z6 w
are: LDT, IDT, GDT, TSS, RS, and ...HBOOT.2 C) x: N( E: w% ], l9 V
& U V0 L1 j2 r
* the "jmp to 00ADh" is performed via an SEH if the debugger is not loaded.( h8 j- B7 _# J0 M, {8 Q% Y$ n: O9 Z
___________________________________________________________________________
) d& w* x0 n. ?2 ~4 T+ T1 m' }1 c2 G) [! I' v6 _1 I& H5 o8 T, ~
$ r; d+ s" t5 B8 M6 ]
Method 03
% w6 ^9 W5 P4 l+ Z& c=========9 L' M/ S+ N+ N0 ? o
5 _8 G* q8 S" h7 h
Less used method. It seeks the ID of SoftICE VxD via the int 2Fh/1684h
% z( d. O! y1 Z3 y# c/ F+ b(API Get entry point)$ s0 ]6 C/ Z5 B& ^
2 S8 l0 Q% Z( f s r
1 U' f, i# t$ X xor di,di- Z3 q3 P4 Z+ z: Q6 I! G9 f) E+ J
mov es,di5 k& _. o t0 L! ^
mov ax, 1684h , O; `! a# C: I x5 J
mov bx, 0202h ; VxD ID of winice
) u+ g; B! G$ e/ T int 2Fh0 d! I! L' t1 x
mov ax, es ; ES:DI -> VxD API entry point
I/ k, U+ i0 I \- ^ add ax, di" U: h3 U: J9 P/ Z8 c- C
test ax,ax
+ ^' L% y P! F8 Z! S O jnz SoftICE_Detected6 y$ G. J; B* N7 S4 V& R; \) S* H5 N
9 H' [5 M0 _) _' Z" h' Z
___________________________________________________________________________0 Q9 m. k3 ^3 A
0 u* v" I# q, M+ ]8 T
Method 04
+ M1 Q8 f: F, Q3 ?0 ]=========; Z5 M, o- i8 f
. T* A1 I0 Q3 D KMethod identical to the preceding one except that it seeks the ID of SoftICE
7 f0 A/ p$ ^6 [- DGFX VxD.% m" ~) T) M7 W' E
) u; Y" d6 h/ o1 C
xor di,di4 M- F6 G6 [. R Z! Y O
mov es,di
: E7 u' z- j. ~; W# E' C8 x& Z" ? mov ax, 1684h
, P" D2 d% p8 x4 G mov bx, 7a5Fh ; VxD ID of SIWVID8 F2 g: l D) ~+ r [9 Q
int 2fh
7 n, O) z2 p/ Z/ {3 Y/ M mov ax, es ; ES:DI -> VxD API entry point
2 }" x" w% Y5 }, u, ? add ax, di1 u, k' s* s& P6 z; n' S/ b
test ax,ax( |* F8 `5 W! w3 w) |8 e, W
jnz SoftICE_Detected
9 s! O0 Y9 I- L9 Z, V/ I& a( Y" q1 _, T; x* S5 J/ ]1 f
__________________________________________________________________________
- ? [" u! b6 C* U! O& L, Z: Q2 k+ i/ g! C) t) n
7 m5 M# s9 s! NMethod 05
% [6 s5 M. J0 Z6 O) P5 ~# X=========
, w$ Z0 p$ o8 K! Z c- |
+ y: J- x5 g q* aMethod seeking the 'magic number' 0F386h returned (in ax) by all system
3 b* n! U7 `. A& J& e6 w- \ n+ e Ndebugger. It calls the int 41h, function 4Fh.
, ]" J9 @5 I- h: a9 y7 [There are several alternatives.
1 c- ?, ?- s- Y
$ x% A) j0 {( z7 E8 f C; I' eThe following one is the simplest:
1 {7 y2 q8 n3 r) }4 n$ |4 X" }
% X5 M& `; t( {9 X- s: q mov ax,4fh
6 H2 Z) i% U' @2 S. O int 41h
; }2 Z" V8 L" {- k7 \$ c cmp ax, 0F3860 i( j* Z2 q$ O0 l# Q+ z
jz SoftICE_detected, ~# V' C6 O- B
- D* M- R: c( _. e. Z, _
2 [' z- W$ Y& u1 Y0 @6 G
Next method as well as the following one are 2 examples from Stone's , S! `' k9 J, `
"stn-wid.zip" (www.cracking.net):8 i& y7 B" M1 a
2 R9 ?6 d8 t! N9 g& l
mov bx, cs
4 h" b4 A6 }2 K: h( O lea dx, int41handler2& z. o0 K' \$ a0 B2 R
xchg dx, es:[41h*4]
3 h% q- c/ l- W( X7 I0 R% f xchg bx, es:[41h*4+2]
$ }# x0 I; Z8 e# t) k mov ax,4fh
' ?5 j/ u3 h5 _0 X# F9 A int 41h
8 C8 Z7 L( E; p1 s/ r xchg dx, es:[41h*4]4 Y9 r9 S# o% F# p
xchg bx, es:[41h*4+2]
8 o* `+ d& G+ n8 H! A$ ~ cmp ax, 0f386h
/ ^# z# k8 C+ x1 G1 h jz SoftICE_detected
2 d# Z& y _+ Z+ c( O! N- ?& Q, W+ ~8 m6 c0 ?8 E( S
int41handler2 PROC
1 p9 H+ U: F1 Y& t iret
1 M' N+ E$ P: F- x0 @int41handler2 ENDP
3 W3 A @" Q% |1 `0 }* |; j
: W6 |) P" v' C% h( J# Q
3 Y/ X) ]/ m% S/ f_________________________________________________________________________
i% m* y' C; s$ h6 S
% y2 r$ j# z9 w8 j2 k1 m
1 N1 k3 R0 a9 c- L6 h6 }Method 06" s1 G7 w, l7 W
=========2 }* ^0 W5 B# ^& l
/ O& L" k1 |$ j A5 |& Y1 B( }0 K+ i. z/ N* ^0 c
2nd method similar to the preceding one but more difficult to detect:& M. h7 S# W7 b8 x) I- u
) W& Q+ H9 v0 [, G) B% R; n E4 H
int41handler PROC
( n: `( m, |9 J! E) A5 z mov cl,al
- {+ z, N6 v, x4 K& y6 j iret, |( b/ O# t t3 c. D: O5 |
int41handler ENDP
' \5 B; x, |/ ?, M
. X3 ^( A, o, {$ w# S
# L% `; i' L' h0 ^: C2 Q xor ax,ax8 S* j/ z, g8 ?3 ?/ n
mov es,ax
0 a1 D* L6 t3 ^ mov bx, cs! Y" ~/ [) ~1 m3 y
lea dx, int41handler9 A' D5 N) ~, r* Z
xchg dx, es:[41h*4]! X: z; C; X( N
xchg bx, es:[41h*4+2]
/ V: _2 ^' K# C) e, C7 n( E in al, 40h1 }' b1 i" k' q7 S4 P: @
xor cx,cx" w7 j7 m- k1 i# X: f# Q1 I
int 41h
5 f* j5 V0 |! ^* v8 P xchg dx, es:[41h*4]7 `! `' {5 |! N8 s
xchg bx, es:[41h*4+2]
7 k3 e" U; [5 @" \ cmp cl,al( N, }+ k, G3 z- L! E) d2 R
jnz SoftICE_detected3 ?; o, M, h( |$ M3 P" H/ D: v
) L4 b! Y7 z2 b* M. G, R_________________________________________________________________________/ {) m8 E' J; ^# j
, R9 y: w# `* b! Y0 cMethod 07% k) D7 y! \" ^* h; V. C
=========9 s, }$ F5 Q E. V( M0 e0 `/ L
( U4 ~. V; d. g1 A
Method of detection of the WinICE handler in the int68h (V86)" {+ [5 D+ ^( a3 s$ @3 V) ~
( i- l/ v# {6 v7 F. m
mov ah,43h: |! ~ [: `; i( ?* t* |
int 68h0 F+ h" W1 ] x3 w, t- S! @! o
cmp ax,0F386h
J( s3 j) y8 g jz SoftICE_Detected# b9 H |# W5 W9 w h, T. M
0 s0 J+ J# `6 x! W$ k& ?. I# h
* s) {* W; I q: x1 ]* b' i
=> it is not possible to set a BPINT 68 with softice but you can hook a 32Bit
- ?0 Y6 s- y- l# U4 m2 O: v app like this:
7 L$ s- n7 G: \9 z" D
$ \- h9 a6 N- v! E2 I( D BPX exec_int if ax==68, J& M9 E, ?4 V& f# P
(function called is located at byte ptr [ebp+1Dh] and client eip is3 W/ l. e4 s D0 b6 T9 z- N
located at [ebp+48h] for 32Bit apps). y1 b P* M, L I! y$ [! T. Z
__________________________________________________________________________& o' E% n( t. W2 w
) R+ Z, Q. K- \$ z, G1 \: p
; ]& i+ ]7 H# AMethod 08
; d; \* Z4 v6 F3 Q' ^8 T=========! {9 d% Y# D" h H$ }
9 c4 d# B! ^$ o, qIt is not a method of detection of SoftICE but a possibility to crash the
! ` ]0 t( K. s( K- Ksystem by intercepting int 01h and int 03h and redirecting them to another
C( V$ i' ^* a' Zroutine.) s8 ~+ Z6 i4 Z5 [/ t4 S
It calls int 21h functions 25h and 35h (set/get int vector) and ds:dx points
8 S9 ^* _, Q6 ^- g8 P8 Qto the new routine to execute (hangs computer...)
% J1 d% q# t# E& v
/ T4 s1 X7 d) O$ t! n Y- w- B mov ah, 25h2 u* L$ j5 L; ?
mov al, Int_Number (01h or 03h)' x7 a; P# U! W4 V L
mov dx, offset New_Int_Routine0 }( M3 w' e! k) y/ |& G: k; V( M3 z1 Q
int 21h
- L0 X# f# o6 ^3 v9 s' {+ S8 Y: e7 t8 m: v) [2 J
__________________________________________________________________________
S9 ~. Q: c5 K$ Q6 ?2 c. [; W7 j2 [! |( l- P
Method 09
$ X1 @$ Q D, \6 F& T% S7 y1 o1 E=========
3 D: f6 H& \, Q# \. E7 x" e0 v. ]! w! y% [& C- z
This method is closed to methods 03 and 04 (int 2Fh/1684h) but it is only* a/ ]" }1 J* \3 U) O5 ]
performed in ring0 (VxD or a ring3 app using the VxdCall).
: f3 m3 S4 `0 U# t9 a/ g; xThe Get_DDB service is used to determine whether or not a VxD is installed7 ?% O/ \: P1 Y7 u! I3 _ V
for the specified device and returns a Device Description Block (in ecx) for' M) Q% w: Z5 E7 h
that device if it is installed.
. D0 W% G. K `% _7 }' e1 _
; q$ A" {! `5 n, b' k7 t, L mov eax, Device_ID ; 202h for SICE or 7a5Fh for SIWVID VxD ID1 ` z. h2 h; A3 z! n/ L+ J( Y
mov edi, Device_Name ; only used if no VxD ID (useless in our case ;-)1 s v- S5 W |8 u, K
VMMCall Get_DDB
9 i) o8 I# K1 c8 Z; F) C- ^( m mov [DDB], ecx ; ecx=DDB or 0 if the VxD is not installed( f4 \5 _* l( r6 l# g2 c+ f
$ f0 q' A( k6 e& E0 W' q' Z lNote as well that you can easily detect this method with SoftICE:+ c [4 G4 w( k, X2 ~
bpx Get_DDB if ax==0202 || ax==7a5fh/ p: ]* g R% F5 o, Y. o$ ^7 _
: R/ F5 s8 X5 O( z9 M* _2 o
__________________________________________________________________________
; e; k( A% \# e8 H8 E7 Y h9 _/ m7 z" K2 u# i" \5 W' h! n( [
Method 10
: x3 f6 \+ Z0 O4 A/ h y=========
4 q: f& Z" v9 y) b1 p. F( |
- H4 H5 j1 h C( x=>Disable or clear breakpoints before using this feature. DO NOT trace with: s" U. x; O$ X- y2 J: L4 V' x# ?/ L
SoftICE while the option is enable!!
L. J$ @+ h* R9 ?2 y# d& ^( g6 @! C( w% y! I% @( a9 }$ v: z
This trick is very efficient:: X% o3 j5 e; Q* n6 Z
by checking the Debug Registers, you can detect if SoftICE is loaded
! k& Q, ?* R+ r7 M0 `# @: ^2 O) t(dr7=0x700 if you loaded the soft with SoftICE loader, 0x400 otherwise) or if
/ ]5 }' r- h3 l" zthere are some memory breakpoints set (dr0 to dr3) simply by reading their3 t7 R6 A8 m$ \1 v0 g
value (in ring0 only). Values can be manipulated and or changed as well
* d% [; Z) A6 v9 e& o(clearing BPMs for instance)9 l: Z: E7 G t
. {% I9 H: s! }. p8 Z8 ^, m
__________________________________________________________________________% m3 O- M- [0 b- B& S* A
7 N' W) g& s) `8 z6 sMethod 11
6 U4 G4 w+ y8 i# j2 c' k" o=========
M3 P3 O$ z K O; F6 ?* d& I! u
9 `, o2 a( R; c" Q9 A- MThis method is most known as 'MeltICE' because it has been freely distributed
( C' J( [9 f: `/ R: Y) Pvia www.winfiles.com. However it was first used by NuMega people to allow
8 Y3 x) p* ~/ E. R8 VSymbol Loader to check if SoftICE was active or not (the code is located9 e0 |, a$ Z) U3 B6 i9 L/ ^
inside nmtrans.dll).
* v6 ^3 @' g! v: G* n( m6 _
/ }+ {# G x" r2 n: [4 a6 u3 d" h3 BThe way it works is very simple:7 `0 B+ @3 ^3 e( b' l. A8 K, y
It tries to open SoftICE drivers handles (SICE, SIWVID for Win9x, NTICE for9 `% _+ q, T! S
WinNT) with the CreateFileA API.
?0 m6 |; G1 p0 W6 e x. ]3 K; w5 T9 E
Here is a sample (checking for 'SICE'):
& Z7 E2 W5 `. U+ P( F/ r& {, c; X. W& e
BOOL IsSoftIce95Loaded()2 [- {9 Y' B V" U1 K
{& K- h. g, E4 p' G( Y; \' W h" Q# C, C
HANDLE hFile; , {% Z3 |1 T+ o2 E9 M1 Z
hFile = CreateFile( "\\\\.\\SICE", GENERIC_READ | GENERIC_WRITE,5 ]+ n0 d. d! @1 w% ?
FILE_SHARE_READ | FILE_SHARE_WRITE," C/ g) i3 S5 J/ R1 l# _. i9 u) h
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ W3 J# l# ], ]4 d/ R7 y! W. f if( hFile != INVALID_HANDLE_VALUE )1 W; @. I$ z3 C# t7 |! o5 K
{/ A! M( c w0 r, J) f
CloseHandle(hFile);& B# p% j R3 _" v
return TRUE;
* [1 j8 T( {/ E$ Z }
. O R$ G) F, t+ N return FALSE;) Z, u( j' z# r T2 k8 L) z3 B) f+ o
}
# a4 N( z( i! t' o* K- {# G/ S3 V
Although this trick calls the CreateFileA function, don't even expect to be
2 r. s J* t) S4 ?, V" oable to intercept it by installing a IFS hook: it will not work, no way!
- S* w% C: @' WIn fact, after the call to CreateFileA it will get through VWIN32 0x001F" y) u5 C0 U' a# `; j5 f
service _VWIN32_ReleaseWin32Mutex (via Kernel32!ORD_0001/VxDCall function)
! g( r5 J9 ]* M7 U% Z- pand then browse the DDB list until it find the VxD and its DDB_Control_Proc
3 ]( T! z5 a% v" y9 xfield., R' _# W* F1 }; k9 e2 p. A
In fact, its purpose is not to load/unload VxDs but only to send a
R2 Q9 Y' \+ P" e& [( CW32_DEVICEIOCONTROL (0x23) control message (DIOC_OPEN and DIOC_CLOSEHANDLE)
/ P4 ]+ r2 f" N' ato the VxD Control_Dispatch proc (how the hell a shareware soft could try& H9 N; e% E( Y6 U: g' \
to load/unload a non-dynamically loadable driver such as SoftICE ;-).
4 j* ]/ E D. P$ ^. ^If the VxD is loaded, it will always clear eax and the Carry flag to allow
6 o* a' t+ @5 @9 uits handle to be opened and then, will be detected.
& S' c2 n; x+ C$ {, H0 KYou can check that simply by hooking Winice.exe control proc entry point
9 c6 \) j, E6 A7 r. m# d iwhile running MeltICE.% p5 z- R( G: C4 T8 s
" V5 ^' P/ K+ B
' L) J7 K- n9 U; f' O4 G) i6 T
00401067: push 00402025 ; \\.\SICE
) P* q5 {4 C8 \9 r5 o7 Y% L 0040106C: call CreateFileA* [' B* T) b# ^4 C0 r; P
00401071: cmp eax,-001' A1 g, J8 a( `
00401074: je 00401091% e& G* e! C( \( K9 V& v& X
/ x4 f. Q$ A. M* `% \5 g
* U; I% X* g; X- [% H! ?There could be hundreds of BPX you could use to detect this trick.
! f0 d: Y/ o$ ]: {7 S-The most classical one is:
1 Z B0 n$ ~/ y7 {* U3 g BPX CreateFileA if *(esp->4+4)=='SICE' || *(esp->4+4)=='SIWV' ||7 I" w, `% h) B! {4 L
*(esp->4+4)=='NTIC'
# y' ^* c7 I# R: c1 s+ ~2 h9 R# Q V) a- Y% `; h3 R" o$ ?3 S
-The most exotic ones (could be very slooooow :-(
$ o4 I5 ^3 _& D. Q. e! \) S BPINT 30 if eax==002A001F && (*edi=='SICE' || *edi=='SIWV')
7 y4 r6 \6 z' x) h5 z( N ;will break 3 times :-( D; A) `. A j4 N) f
- Q7 x+ B3 ^4 {# g! y
-or (a bit) faster:
* m. l7 }4 N' D3 h9 H BPINT 30 if (*edi=='SICE' || *edi=='SIWV')
& W" k0 w8 O% o8 y: A6 @& i6 y+ B4 ]( [, F
BPX KERNEL32!ORD_0001 if *edi=='SICE' || *edi=='SIWV' 2 `4 C. p7 n- d; W% u% P, M! L0 v' g
;will break 3 times :-(6 T9 N, r3 g& @5 _# A: }
w' {, ? u8 S-Much faster:
6 _( M$ X- u$ z1 s/ S9 x9 t BPX VMM_GetDDBList if eax->3=='SICE' || eax->3=='SIWV'* f# { H) z" s2 H" L1 \! K
( \7 B6 r; S3 k9 f$ FNote also that some programs (like AZPR3.00) use de old 16-bit _lopen. N* J3 ~) e4 x9 }
function to do the same job:
; e3 g/ r4 F- h4 A7 g; ~+ C. q- @2 B) X2 y& g+ o/ k- i
push 00 ; OF_READ
0 ?0 |8 Z+ E8 `2 }/ I) r/ B5 G mov eax,[00656634] ; '\\.\SICE',0
1 T% t6 A! d1 \9 d6 h push eax
3 q% Y. g) ?" H3 K, {# E call KERNEL32!_lopen; Z* g5 J- O2 u7 o
inc eax2 r/ a6 X( L: ]/ d) O
jnz 00650589 ; detected0 F' W9 H1 c# m( R' j
push 00 ; OF_READ J F8 H: f6 g G
mov eax,[00656638] ; '\\.\SICE'
- y6 |# `2 r" @( }* r4 k push eax, X4 f+ W/ c3 A: s/ g
call KERNEL32!_lopen
, |3 R: S' x; s( M' o inc eax! O. X8 M6 ~, s9 ^
jz 006505ae ; not detected
& f/ g" W q% {* f
9 a) J- @* K0 C% H* z
2 M) I$ a$ F7 T% V6 a__________________________________________________________________________
1 ~& c" S" q2 e: U! P& X
! _ d# \9 S% C# a4 iMethod 12( B) E/ G$ c* ?# S4 `" }% O% E/ l
=========
; B* O, q6 a" [) A1 S0 F: D# p+ D& w/ q7 W5 w/ {
This trick is similar to int41h/4fh Debugger installation check (code 058 R) L! ~4 l4 E
& 06) but very limited because it's only available for Win95/98 (not NT)
& l& J: M9 [$ o$ vas it uses the VxDCall backdoor. This detection was found in Bleem Demo.0 I/ ?9 s& i x: N5 o# P& m
9 T; F6 f% U$ F
push 0000004fh ; function 4fh
8 h4 Y+ T f- j O- |9 W2 ? push 002a002ah ; high word specifies which VxD (VWIN32)
& u! W1 b* A6 B$ F& N6 o ; low word specifies which service
& l7 D, O8 n& R+ h1 ?; R! {/ \& ^ (VWIN32_Int41Dispatch)9 {" Q( F6 u, @9 t5 R, L
call Kernel32!ORD_001 ; VxdCall
) Y$ g, U7 R& r! U0 q cmp ax, 0f386h ; magic number returned by system debuggers
- F9 E$ A. _+ F# u6 b) C jz SoftICE_detected
6 o( ~, X8 _) T/ N# m- P" P& `5 O( y. B" Y0 K
Here again, several ways to detect it:
7 r1 T& g% W4 Y9 D: C" o7 H+ O4 i4 b$ A5 `/ ]+ {5 x' |
BPINT 41 if ax==4f; k. ` I; C6 }/ ]+ V" d( }
" M; r7 y8 u; K0 z9 S BPINT 30 if ax==0xF386 ; SoftICE must be loaded for this one$ b3 T$ d: k7 R8 P
; V- w; Z9 `5 T0 o: ]' F
BPX Exec_PM_Int if eax==41 && edx->1c==4f && edx->10==002A002A
7 J: d: ~! i- m
6 N2 {. z( E; {5 D! r BPX Kernel32!ord_0001 if esp->4==002A002A && esp->8==4f ; slooooow!
; p! V& V9 o1 h- _ g
_& ?7 ^ E8 o, x__________________________________________________________________________
% s" |3 A/ |9 b6 Q
' ]& i& n' Y+ x! s+ T& q! E* {+ c' hMethod 13, ^& ]0 v2 q( K5 V+ P8 F$ Y& @+ m
=========( j% s2 W3 I: T$ v f; U% V4 v7 Y
1 i, F- o! O8 Q+ B$ ^Not a real method of detection, but a good way to know if SoftICE is) v" P3 P0 R7 ]
installed on a computer and to locate its installation directory.# f, _+ o7 f, f8 g/ G' _& N) ?
It is used by few softs which access the following registry keys (usually #2) :
. F7 |* c! a$ k9 {8 T6 Y- J \ W
-#1: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion7 Z$ T. c9 w8 Z: d A
\Uninstall\SoftICE9 \7 |! N% t' i1 Y5 Y; r
-#2: HKEY_LOCAL_MACHINE\Software\NuMega\SoftICE- N: ^# l" E, H" R; [
-#3: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion
9 J4 y6 ?2 |4 P% [0 @$ F\App Paths\Loader32.Exe5 t7 s$ s. ]& w
8 g9 Y% ^6 [6 {0 U
% V) G# L. r6 R+ Y( C
Note that some nasty apps could then erase all files from SoftICE directory
: W* U6 h; c5 ?0 Z9 `& j6 }$ W(I faced that once :-(8 M2 R( `' \$ C& b8 R9 I2 O
) J/ A& R& o8 `6 v. ]; a. NUseful breakpoint to detect it:5 d: s! H% {4 s: g& g
6 n8 u4 ? o; i: ?( w BPX _regopenkey if *(esp->8+0x13)=='tICE' || *(esp->8+0x37)=='tICE'
6 u& S3 _. m/ X# X3 D
$ R! c( ?5 e2 Z! a__________________________________________________________________________2 y" I {6 \ Z( h! U8 W
- L3 a$ z2 y" w: A7 O
0 P# {) x/ z0 P, p( z9 H* |
Method 14 8 b% ?1 l# c' f [! Y2 T
=========& A2 W9 E. z; @6 ^% O/ m3 ~- q. {# N/ J5 _
N b1 A3 j0 h" `6 p _! RA call to VMM 'Test_Debug_Installed' service. As the name says, its purpose
) ?! K+ j; S5 w3 v6 d$ mis to determines whether a debugger is running on your system (ring0 only).
- A. W3 i* I4 G8 `
- I) L9 n, U+ X/ Z' _8 V6 m) P VMMCall Test_Debug_Installed
7 T' r+ L' L0 w3 F) j je not_installed
4 I! b" @% o2 L) V7 ~& N
$ P' d( T: G. ~7 l' gThis service just checks a flag.( F5 V6 O( Z% B( z5 L+ b7 [
</PRE></TD></TR></TBODY></TABLE> |