delphi¿ª·¢Çý¶¯³ÌÐò

End;

ÏÂÃæÈÃÎÒÃÇÀ´¿´Ò»¸ö¼òµ¥Çý¶¯³ÌÐòÀý×ÓSystemModules£¬¸ÃÀý×ÓµÄÖ÷Òª¶¯×÷¼¯ÖÐÔÚDriverEntryº¯ÊýÀï¡£ÎÒÃÇ»á·ÖÅä·ÖÒ³Äڴ棨ÄãÓ¦¸Ã¼ÇµÃ DriverEntryÔËÐÐÔÚIRQL =PASSIVE_LEVELµÈ¼¶£¬ËùÒÔʹÓ÷ÖÒ³ÄÚ´æ×ÔÈ»ÊÇûÎÊÌâÁË£©£¬È»ºóд½øһЩÐÅÏ¢£¬ÔÙÊÍ·Å£¬²¢ÈÃϵͳжÔØÇý¶¯³ÌÐò¡£

´úÂë:

{ ---------------------------------------------------------------- ÓÃDelphi±àдÇý¶¯³ÌÐòµÄÀý×Ó

------------------------------------------------------------------}

unit SystemModules;

interface uses

nt_status, ntoskrnl, native;

function _DriverEntry(pDriverObject: PDRIVER_OBJECT; pusRegistryPath: PUNICODE_STRING): NTSTATUS; stdcall;

implementation

function _DriverEntry(pDriverObject: PDRIVER_OBJECT; pusRegistryPath: PUNICODE_STRING): NTSTATUS; var

cb: DWORD;

p, pTemp: PVOID;

dwNumModules: DWORD;

pMessage, pModuleName: PCHAR; buffer: array[0..295] of char;

szModuleName: array[0..100] of char; iCnt, iPos: integer; begin

DbgPrint('SystemModules: Entering DriverEntry'); cb := 0;

ZwQuerySystemInformation(SystemModuleInformation, @p, 0, cb); if cb <> 0 then begin

p := ExAllocatePool(PagedPool, cb); if p <> nil then begin

DbgPrint('SystemModules: %u bytes of paged memory allocted at address X', cb, p); if ZwQuerySystemInformation(SystemModuleInformation, p, cb, cb) = STATUS_SUCCESS then begin

pTemp := p;

dwNumModules := DWORD(p^);

cb := (sizeof(SYSTEM_MODULE_INFORMATION) + 100) * 2; pMessage := ExAllocatePool(PagedPool, cb); if pMessage <> nil then begin

DbgPrint('SystemModules: %u bytes of paged memory allocted at address X', cb, pMessage); memset(pMessage, 0, cb);

inc(PCHAR(pTemp), sizeof(DWORD)); for iCnt := 1 to dwNumModules do begin

iPos := (PSYSTEM_MODULE_INFORMATION(pTemp))^.ModuleNameOffset;

pModuleName := @((PSYSTEM_MODULE_INFORMATION(pTemp))^.ImageName[iPos]); if (_strnicmp(pModuleName, 'ntoskrnl.exe', length('ntoskrnl.exe')) = 0) or (_strnicmp(pModuleName, 'ntice.sys', length('ntice.sys')) = 0) then begin

memset(@szModuleName, 0, sizeof(szModuleName)); strcpy(@szModuleName, pModuleName);

_snprintf(@buffer, sizeof(buffer),

'SystemModules: Found %s base: X size: X', @szModuleName,

(PSYSTEM_MODULE_INFORMATION(pTemp))^.Base, (PSYSTEM_MODULE_INFORMATION(pTemp))^._Size); strcat(pMessage, @buffer); end;

inc(PCHAR(pTemp), sizeof(SYSTEM_MODULE_INFORMATION)); end;

if pMessage[0] <> #0 then begin

DbgPrint(pMessage); end else begin

DbgPrint('SystemModules: Found neither ntoskrnl nor ntice'); end;

ExFreePool(pMessage);

DbgPrint('SystemModules: Memory at address X released', pMessage); end; end;

ExFreePool(p);

DbgPrint('SystemModules: Memory at address X released', p); end; end;

DbgPrint('SystemModules: Leaving DriverEntry'); result := STATUS_DEVICE_CONFIGURATION_ERROR; end; end.

ΪÁËдµãÓÐÓõÄÐÅÏ¢£¬ÎÒÃǼÓÔØÁËһЩģ¿éµ½ÏµÍ³µØÖ·¿Õ¼ä£¨°üÀ¨ÒÔÏÂϵͳģ¿é£ºntoskrnl.exe, hal.dllµÈ£¬»¹ÓÐÉ豸Çý¶¯³ÌÐò£©£¬È»ºóÈ¥ÕÒntoskrnl.exeºÍntice.sys¡£ÎÒÃÇÓÃSystemModuleInformation ÐÅÏ¢Àà×÷Ϊ²ÎÊýµ÷ÓÃZwQuerySystemInformationÀ´µÃµ½ÏµÍ³Ä£¿éÁÐ±í¡£¶ÁÕß¿ÉÒÔµ½Garry NebbettµÄÊ顶winodwsNT/2000 ÄÚ²¿API²Î¿¼¡·È¥ÕÒÕâЩº¯ÊýµÄÃèÊö¡£Ë³±ã˵һÏ£¬ZwQuerySystemInformation ÊÇÒ»¸ö¶ÀÌصĺ¯Êý£¬Ëü·µ»Ø´óÁ¿µÄϵͳÐÅÏ¢¡£

Õâ¸öÀý×ÓÖÐûÓÐÌṩÇý¶¯¿ØÖƳÌÐò¡£Äã¿ÉÒÔʹÓÃKmdKit4D¹¤¾ß°üÖеÄKmdManager»òÕßÀàËƵŤ¾ß£¬»¹¿ÉÒÔʹÓÃDebugView »ò SoftICE ¿ØÖÆ̨À´²é¿´µ÷ÊÔÐÅÏ¢¡£

ÏÖÔÚÎÒÃÇÀ´·ÖÎö·ÖÎöÕâ¶Î³ÌÐò°É??

´úÂë:cb := 0;

ZwQuerySystemInformation(SystemModuleInformation, @p, 0, cb);

Ê×ÏÈÎÒÃÇÒª¾ö¶¨ÎÒÃÇҪʹÓöàÉٿռ䡣ÉÏÃæµ÷ÓöÔZwQuerySystemInformationµÄµ÷ÓÃʹÎÒÃÇ»ñµÃ STATUS_INFO_LENGTH_MISMATCH£¨ÕâÊÇÕý³££¬ÒòΪbufferµÄ³ß´çΪÁã¡££©£¬µ«ÊÇcb±äÁ¿½ÓÊÕµ½ÁËbuffer³ß´ç£¨ÎªÁã»ò·ÇÁ㣩¡£ÓÚÊÇÎÒÃǾ͵õ½ÁËÐèÒªµÄbuffer³ß´ç¡£ÕâÀïÐèÒªµØÖ·pÊÇΪÁËZwQuerySystemInformationº¯ÊýµÄÕý³£Ö´ÐС£

´úÂë:if cb <> 0 then begin

p := ExAllocatePool(PagedPool, cb);

ExAllocatePool´Ó·ÖÒ³ÄÚ´æ³Ø·ÖÅäÐèÒªÊýÁ¿µÄÄÚ´æ¡£Èç¹ûÊDz»·ÖÒ³ÄÚ´æÄØ£¬¾Í°ÑµÚÒ»¸ö²ÎÊýPagedPoolÏàÓ¦µØ¸Ä³É NonPagedPool¡£ExAllocatePool±ÈÓû§Ä£Ê½µÄHeapAlloc ¼òµ¥Ò»Ð©£¬Ö»ÓÐÁ½¸ö²ÎÊý£ºµÚÒ»¸ö²ÎÊýÊÇÄÚ´æ³ØÀàÐÍ(·ÖÒ³¡¢²»·ÖÒ³)£¬µÚ¶þ¸ö²ÎÊýÊÇÐèÒªµÄÄÚ´æ³ß´ç¡£¼òµ¥°É£¡

´úÂë:if p <> nil then

Èç¹ûExAllocatePool ·µ»Ø·ÇÁãÖµ£¬ÄÇôËü¾ÍÊÇÒ»¸öÖ¸Ïò·ÖÅäbufferµÄÖ¸Õë¡£ ¼ì²éµ÷ÊÔÐÅÏ¢»á·¢ÏÖExAllocatePool ·ÖÅäµÄbufferµØÖ·ÊÇÒ³³ß´ç´óСµÄ±¶Êý¡£¼ÙÈçÇëÇóµÄÄÚ´æµÄ´óС´óÓÚ»òµÈÓÚ(>=)Ò³³ß´ç£¨ÎÒÃÇÕâ¸öÀý×ÓÖУ¬ÊÇÃ÷ÏԵشóÁË£©£¬·ÖÅäµÄÄÚ´æ»á´ÓÒ³±ß½ç¿ªÊ¼·ÖÅä¡£

´úÂë:if ZwQuerySystemInformation(SystemModuleInformation, p, cb, cb) = STATUS_SUCCESS then begin

pTemp := p;

ÎÒÃÇÔٴε÷ÓÃZwQuerySystemInformation£¬Õâ´ÎʹÓÃbufferµÄÖ¸ÕëºÍ³ß´ç×÷Ϊ²ÎÊý¡£

Èç¹û·µ»ØµÄÊÇSTATUS_SUCCESS£¬ÄÇôbufferÖ®ÖоͰüº¬ÁËϵͳģ¿éÁÐ±í£¬Êý¾ÝÒÔSYSTEM_MODULE_INFORMATION£¨ÔÚ

native.dcuÖж¨Ò壩½á¹¹¶ÓÁеÄÐÎʽ´æÔÚ¡£

´úÂë:SYSTEM_MODULE_INFORMATION = packed record Reserved: array[0..1] of DWORD; Base: PVOID; _Size: DWORD; Flags: DWORD; Index: WORD; Unknown: WORD; LoadCount: WORD;

ModuleNameOffset: WORD;

ImageName: array[0..255] of char; end;

cb±äÁ¿½ÓÊÜʵ¼Ê·µ»ØµÄ×Ö½ÚµÄÊýÁ¿£¬µ«ÊÇÎÒÃÇÄ¿Ç°Óò»µ½Ëü¡£

ÎÒ¼ÙÉèÔÚÁ½´Îµ÷ÓÃZwQuerySystemInformation Ö®¼äûÓÐÆäËüÐÂÄ£¿é³öÏÖ¡£ÕâÖÖ¿ÉÄÜÐÔµ±È»ÊǺÜСµÄ¡£ÎÒÃÇÕâÀïÖ»ÊÇΪÁËѧϰĿµÄÂÄã×îºÃʹÓøü°²È«µÄ°ì·¨£ºÔÚÑ­»·Öз´¸´µ÷Óà ZwQuerySystemInformationÀ´Öð´ÎÔö¼Óbuffer´óС£¬Ö±µ½¸Ã´óСÂú×ãÐèÇó£¡

´úÂë:dwNumModules := DWORD(p^);

bufferÖеĵÚÒ»¸öË«×Ö£¨double word£©°üº¬Ä£¿éµÄÊýÁ¿£¬ÕâЩģ¿é½ô¸úÔÚSYSTEM_MODULE_INFORMATION¶ÓÁеĺóÃ档Ȼºó£¬Ä£¿éµÄÊýÁ¿»á±£´æÔÚdwNumModulesÖС£

´úÂë:cb := (sizeof(SYSTEM_MODULE_INFORMATION) + 100) * 2; pMessage := ExAllocatePool(PagedPool, cb);

ÎÒÃÇÐèÒªÁíÒ»¸öbufferÀ´±£´æÎÒÃÇÑ°ÕÒµÄÁ½¸öÄ£¿éµÄÃû×ÖºÍÆäËüÐÅÏ¢¡£ÎÒÃǼٶ¨Õâ¸ö³ß´ç£¨£¨(sizeof(SYSTEM_MODULE_INFORMATION) + 100) * 2£©ÊÇ×ã¹»µÄ¡£

×¢Ò⣺Õâ´ÎµÄbufferµØÖ·²»ÊÇÒ³³ß´çµÄ±¶Êý£¬ÊÇÒòΪbuffer³ß´çСÓÚÒ»¸öÒ³³ß´ç¡£

´úÂë:memset(pMessage, 0, cb);

ÓÃmemsetÌî³äbufferΪÁ㣬ÕâÊÇΪÁË°²È«¿¼ÂÇ£¬Ê¹×Ö·û´®¿Ï¶¨ÒÔÁã½áÊø¡£Ñ§Ï°¹ýcÓïÑÔµÄÅóÓѶԴ˺¯ÊýÓ¦¸ÃºÜÊìϤ¡££¨ÊÂʵÉÏÄãÒ²¿ÉÒÔʹÓÃDelphiµÄFillCharº¯Êý£©

´úÂë:inc(PCHAR(pTemp), sizeof(DWORD));

Ìø¹ý±£´æÁËÄ£¿éÊýÁ¿µÄ´óСµÄµÚÒ»¸öË«×Ö£¬ÏÖÔÚpTemp¾ÍÖ¸ÏòÁ˵ÚÒ»¸öSYSTEM_MODULE_INFORMATION½á¹¹¡£

´úÂë:for iCnt := 1 to dwNumModules do begin

ÎÒÃǶԽṹ¶ÓÁÐÑ­»·dwNumModules´ÎÊý£¬À´Ñ°ÕÒntoskrnl.exe ºÍ ntice.sys¡£

ÔڶദÀíÆ÷µÄϵͳntoskrnl.exeÄ£¿éµÄÃû×ÖÓ¦¸ÃÊÇntkrnlmp.exe£¬Èç¹ûÄãʹÓõÄÊÇ´øPAE£¨ÎïÀíµØÖ·À©Õ¹£©µÄϵͳ£¬ÄÇôϵͳ»á·Ö±ðµØÖ§³Öntkrnlpa.exe ºÍ ntkrpamp.exe¡£ÎÒÕâÀﵱȻ¼Ù¶¨Äã²»»áÓµÓÐÄÇôţµÄ»úÆ÷ÁË^_^¡£

´úÂë:iPos := (PSYSTEM_MODULE_INFORMATION(pTemp))^.ModuleNameOffset; pModuleName := @((PSYSTEM_MODULE_INFORMATION(pTemp))^.ImageName[iPos]);

ImageNameºÍModuleNameOffset Óò·Ö±ð°üº¬ÁËÄ£¿éµÄȫ·¾¶ºÍ·¾¶ÄÚÄ£¿éÃûµÄÏà¶ÔÆ«ÒÆ¡£

´úÂë:if (_strnicmp(pModuleName, 'ntoskrnl.exe', length('ntoskrnl.exe')) = 0) or (_strnicmp(pModuleName, 'ntice.sys', length('ntice.sys')) = 0) then Begin

strnicmp ×ö²»Çø·Ö´óСдµÄÁ½ANSI±ê×¼×Ö·û´®±È½Ï¡£µÚÈý¸ö²ÎÊýÊDZȽϵÄ×Ö·ûµÄÊýÁ¿¡£ÕâÀïÒ²Ðí²»±ØҪʹÓÃ__strnicmp£¬ÒòΪ SYSTEM_MODULE_INFORMATIONÀïÄ£¿éÃûÊÇÁã½áÊøµÄ£¬Ê¹ÓÃ_stricmp¾Í¿ÉÒÔÁË¡£ÕâÀïʹÓÃ__strnicmpÊÇΪÁ˸ü¼Ó°²È«¡£

˳±ãÌáÒ»¾ä£¬ntoskrnl.exeÌṩÁËÐí¶à»ù±¾µÄ×Ö·û´®º¯Êý£¬Èçstrcmp¡¢strcpyºÍstrlenµÈ¡£

´úÂë:memset(@szModuleName, 0, sizeof(szModuleName)); strcpy(@szModuleName, pModuleName); _snprintf(@buffer, sizeof(buffer),

'SystemModules: Found %s base: X size: X', @szModuleName,

(PSYSTEM_MODULE_INFORMATION(pTemp))^.Base, (PSYSTEM_MODULE_INFORMATION(pTemp))^._Size);

strcat(pMessage, @buffer); end;

¼ÙÈçÉÏÎÄÌá¼°µÄÄ£¿é±»ÕÒµ½£¬ÎÒÃǾÍÓÃ_snprintf£¨ÄÚºËÌṩ£©º¯Êý¸ñʽ»¯×Ö·û´®£¬×Ö·û´®Öаüº¬ÁËÄ£¿éÃû¡¢»ùµØÖ·ºÍ³ß´ç£¬È»ºó½«×Ö·û´®¼Óµ½bufferÈ¥¡£

´úÂë:if pMessage[0] <> #0 then begin

DbgPrint(pMessage); end else begin

DbgPrint('SystemModules: Found neither ntoskrnl nor ntice'); end;

ÕâÀïºÜÈÝÒ׿´¶®£¬ÓÉÓÚÎÒÃÇÇ°Ãæ°Ñ×Ö·û´®¶¼ÖÃÁËÁ㣬ÕâÀïºÜÈÝÒ×ÅжÏÎÒÃÇÊÇ·ñÕÒµ½ÁËʲô¶«Î÷¡£ ´úÂë:ExFreePool(pMessage);

DbgPrint('SystemModules: Memory at address X released', pMessage); end; end;

ExFreePool(p);

ÊÍ·ÅÔÚϵͳÄÚ´æ³ØÀï·ÖÅäµÄÄÚ´æ¡£

´úÂë:result := STATUS_DEVICE_CONFIGURATION_ERROR; ·µ»Øʧ°Ü´úÂ룬ÕâÑùÇ¿ÖÆϵͳ½«Çý¶¯³ÌÐò´ÓÄÚ´æÖÐжÔØ¡£

ÏÖÔÚÄãÇå³þÁË°É£¬Ê¹ÓÃϵͳÄÚ´æ³Ø±ÈʹÓÃÓû§Ä£Ê½µÄ¶Ñ¼òµ¥¶àÁË¡£Î¨Ò»ÐèҪעÒâµÄÎÊÌâ¾ÍÊÇÕýÈ·µØ¶¨ÒåÄÚ´æ³ØÀàÐÍ¡£

Óû§Ä£Ê½ÏµÄntdll.dllÌṩÁËÐí¶àZwXxxϵÁк¯Êý£¬ËûÃÇÊǽøÈëÄÚºËģʽµÄ´óÃÅ¡£×¢Ò⣺ËûÃǵIJÎÊýµÄÊýÁ¿ºÍº¬Ò嶼ÊÇÒ»ÑùµÄ¡£Äã¿ÉÒÔÊ¡²»ÉÙʶùÁË°É£¡

ÓÉÓÚÄں˵ĴíÎó»áµ¼ÖÂϵͳ̱»¾£¬ËùÒÔÄã¿ÉÒÔÔÚÓû§Ä£Ê½Ïµ÷ÊÔ£¬È»ºóССµØ¸Ä¶¯£¨Èç¹ûÐèÒª£©ºó¿½±´µ½ÄãµÄÇý¶¯³ÌÐò¡£ÀýÈ磺ntdll.dllµÄ ZwQuerySystemInformation µ÷Ó÷µ»ØͬÑùµÄÐÅÏ¢¡£Ê¹ÓÃÕâ¸ö¼¼ÇÉÄã¾Í²»ÓÃ×ÜÊÇÖØÐÂÆô¶¯ÄãµÄ»úÆ÷ÁË¡£

1. ÓÃdcc32 ¨CU ..\\include -B -CG -JP -$A-,C-,D-,G-,H-,I-,L-,P-,V-,W+,Y- beeper.pasÉú³ÉÄ¿±êÎļþ£¨´Ë´¦µÄ..\\incÊÇÎÒ±£´æÏà¹Ødelphiµ¥ÔªÎļþµÄĿ¼£¬ÄãµÄ¿ÉÄܲ»ÊÇÕâ¸öĿ¼Ӵ£©

2. ÓÃomf2d beeper.obj /U_*ת»»Ä¿±êÎļþ£¬Ê¹ÆäÄܱ»m$ linkÁ´½Ó

3. ÓÃlink /NOLOGO /ALIGN:32 /BASE:0x10000 /SUBSYSTEM:NATIVE /DRIVER /FORCE:UNRESOLVED /FORCE:MULTIPLE /ENTRY:DriverEntry ..\\lib\\hal.lib beeper.obj /OUT:beeper.sysÉú³É×îÖÕµÄÇý¶¯Îļþ¡££¨×¢ÒâÕâÀïÓÃ/FORCE:UNRESOLVEDÊÇÒòΪdcc32»áÔÚdelphiµÄÄ¿±êÎļþÖмÓÈëһЩµ¥ÔªµÄ³õʼ»¯¼°Ïú»Ù´úÂ룬ÕâЩ¶«¶«ÔÚÇý¶¯³ÌÐòÖÐÊDz»ÐèÒªµÄ£¬ËùÒÔÇ¿ÐкöÂÔÖ®£¬»¹»á³öÏÖÒ»¶ÑÁ´½Ó¾¯¸æ£¬Ò²²»ÓÃÀí»á£©¡£

Ö´ÐÐÍêÒÔÉϵIJ½Ö裬ÔÚÄãµÄĿ¼Ï¾ͻáÉú³ÉÒ»¸öbeeper.sysÎļþÁË¡£°ÑËü¿½±´µ½KmdKitµÄbeeperĿ¼ÖУ¬ÓÃËüµÄSCPÎļþ¼ÓÔØ£¬PCµÄÀ®°È¹ûÈ»·¢³öµÄÇå´àµÄÉùÒô£¬Ö¤Ã÷ÎÒÃǵÄdelphiÇý¶¯ÊÇÕýÈ·µÄ¡£ÓôËÖÖ·½·¨Éú³ÉµÄbeeper.sysÖ»ÓÐ1376×Ö½Ú£¬Ö»±ÈÓÃKmdKitµÄ»ã±à´úÂëµÄbeeper.sys´ó¼¸°Ù¸ö×Ö½Ú£¬¶øÓÃDDDKÉú³ÉµÄbeeper.sysÔòÒª³¬¹ý3K¡£

´òÍêÕâô¶à×ÖÕæ²»ÈÝÒ×£¬Õâƪ½Ì³Ì¾Íµ½ÕâÀï°É£¬ÏÂһƪÎÒÃÇÔÙÀ´ÓÃdelphi×öÒ»¸ö¸üÓÐȤµÄ¶«¶«¡£

¹¤¾ß¼°»·¾³´î½¨

ÉÏƪ½Ì³ÌÖ÷ÒªÊǽ²½âÁËÓÃDelphi¿ª·¢WindowsÇý¶¯³ÌÐòÐèÒª½â¾öµÄһЩ¼¼ÊõÉϵÄÎÊÌ⣬ËäÈ»†ªàÂÁËÒ»´ó¶Ñ£¬Ò²²»ÖªµÀ½²Çå³þÁËûÓÐ^_^¡£±¾ÆªÎÒÃÇ¿ªÊ¼½²ÊöÓÃDelphi¹¹½¨Çý¶¯¿ª·¢»·¾³¡£

ÁªÏµ¿Í·þ£º779662525#qq.com(#Ì滻Ϊ@)