阅读:1467回复:14
查找ntdll.dll成功后,为什么Native API不成功?请高手相助。
//在访问下面其中一句时,机器重启。
PVOID WatchDevice::FindFunc(PVOID Base,PCSTR Name) { PIMAGE_DOS_HEADER dos =PIMAGE_DOS_HEADER(Base); PIMAGE_NT_HEADERS nt =PIMAGE_NT_HEADERS(PCHAR(Base)+dos->e_lfanew); PIMAGE_DATA_DIRECTORY expdir=nt->OptionalHeader.DataDirectory +IMAGE_DIRECTORY_ENTRY_EXPORT; ULONG size =expdir->Size; ULONG addr =expdir->VirtualAddress; PIMAGE_EXPORT_DIRECTORY exports=PIMAGE_EXPORT_DIRECTORY(PCHAR(Base)+addr); PULONG functions =PULONG(PCHAR(Base)+exports->AddressOfFunctions); PSHORT ordinals =PSHORT(PCHAR(Base)+exports->AddressOfNameOrdinals); PULONG names =PULONG(PCHAR(Base)+exports->AddressOfNames); PVOID func =0; ULONG ord = 0; for (ULONG i =0;i< exports->NumberOfNames;i++) { ord = ordinals [i ]; if (functions[ord]<addr || functions[ord] >=addr + size)//这一句重启 { if (_stricmp(PSTR(PCHAR(Base)+names),Name)==0) func =PCHAR(Base)+functions[ord]; } } return func; } 希望高手解释,并帮助解决这个问题。 [编辑 - 7/13/04 by wwwllg] |
|
沙发#
发布于:2004-07-13 16:25
我对用softice查看ord 的值,有时是一些很正常的值有时是0x04,0x09。。。,有时是很大的值。
但是即使是正常的值也会出现重启现象。 现在毫无进展,只有自己顶了。 |
|
板凳#
发布于:2004-07-13 17:05
贴出你的汇编代码,及当时各寄存器的值看看.
|
|
|
地板#
发布于:2004-07-13 17:09
结构是自己定义的吗?看看结构是否正确,以及结构大小是否正确(结构是否按自己对齐)
|
|
地下室#
发布于:2004-07-13 18:05
结构是自己定义的,是从winnt.h中截取下来的。
winnt.h是从winnt/native api中得到的。 只不过,我是截取的。其中如下。 typedef unsigned short WORD; typedef unsigned long DWORD; typedef struct _IMAGE_FILE_HEADER { WORD Machine; WORD NumberOfSections; DWORD TimeDateStamp; DWORD PointerToSymbolTable; DWORD NumberOfSymbols; WORD SizeOfOptionalHeader; WORD Characteristics; } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; typedef struct _IMAGE_DATA_DIRECTORY { DWORD VirtualAddress; DWORD Size; } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY; #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 typedef struct _IMAGE_OPTIONAL_HEADER64 { WORD Magic; BYTE MajorLinkerVersion; BYTE MinorLinkerVersion; DWORD SizeOfCode; DWORD SizeOfInitializedData; DWORD SizeOfUninitializedData; DWORD AddressOfEntryPoint; DWORD BaseOfCode; ULONGLONG ImageBase; DWORD SectionAlignment; DWORD FileAlignment; WORD MajorOperatingSystemVersion; WORD MinorOperatingSystemVersion; WORD MajorImageVersion; WORD MinorImageVersion; WORD MajorSubsystemVersion; WORD MinorSubsystemVersion; DWORD Win32VersionValue; DWORD SizeOfImage; DWORD SizeOfHeaders; DWORD CheckSum; WORD Subsystem; WORD DllCharacteristics; ULONGLONG SizeOfStackReserve; ULONGLONG SizeOfStackCommit; ULONGLONG SizeOfHeapReserve; ULONGLONG SizeOfHeapCommit; DWORD LoaderFlags; DWORD NumberOfRvaAndSizes; IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; } IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64; typedef struct _IMAGE_NT_HEADERS64 { DWORD Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER64 OptionalHeader; } IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64; typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS; #define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // Export Directory typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; DWORD TimeDateStamp; WORD MajorVersion; WORD MinorVersion; DWORD Name; DWORD Base; DWORD NumberOfFunctions; DWORD NumberOfNames; DWORD AddressOfFunctions; // RVA from base of image DWORD AddressOfNames; // RVA from base of image DWORD AddressOfNameOrdinals; // RVA from base of image } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY; typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header WORD e_magic; // Magic number WORD e_cblp; // Bytes on last page of file WORD e_cp; // Pages in file WORD e_crlc; // Relocations WORD e_cparhdr; // Size of header in paragraphs WORD e_minalloc; // Minimum extra paragraphs needed WORD e_maxalloc; // Maximum extra paragraphs needed WORD e_ss; // Initial (relative) SS value WORD e_sp; // Initial SP value WORD e_csum; // Checksum WORD e_ip; // Initial IP value WORD e_cs; // Initial (relative) CS value WORD e_lfarlc; // File address of relocation table WORD e_ovno; // Overlay number WORD e_res[4]; // Reserved words WORD e_oemid; // OEM identifier (for e_oeminfo) WORD e_oeminfo; // OEM information; e_oemid specific WORD e_res2[10]; // Reserved words LONG e_lfanew; // File address of new exe header } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER; 我对#define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // Export Directory 有点怀疑。但不知道真正原因。 至于wowocock要查看汇编代码,及当时各寄存器的值看看。 可我不知道如何在softice中截图 |
|
5楼#
发布于:2004-07-14 09:06
我在论坛上把相关的关键字都查了一遍,碰到了几个相关的话题。
都没有完整的解决方案。 难道真的解决不了吗? |
|
6楼#
发布于:2004-07-14 09:51
我随便一个函数(ZwClose)没有问题,不知道你测试哪个函数,在什么地方出现的问题?还有你为什么在driver中call ntdll.dll中的,而不call ntoskrnl.exe中的?
|
|
|
7楼#
发布于:2004-07-14 09:52
对了忘记告诉你我是通过App来测试你的函数的,没有在driver中测试
|
|
|
8楼#
发布于:2004-07-14 09:58
我要实现关机。zwshutdownsystem,
您能把您的app代码给我参考吗? [编辑 - 7/14/04 by wwwllg] |
|
9楼#
发布于:2004-07-14 16:48
to AllenZh
请大侠帮小弟一把。 我的开发环境是vc6+sp6 + win2k pro + drivestudio |
|
10楼#
发布于:2004-07-14 20:42
回家再调试的时候蓝屏,上面显示
PAGE_FAULT_IN_NONPAGED_AREA ddk上的解释:The PAGE_FAULT_IN_NONPAGED_AREA bug check has value 0x00000050. This signals that invalid system memory has been referenced Possible Cause: Faulty Hardware Possible Cause: Buggy System Service Possible Cause: Antivirus Software Possible Cause: Corrupted NTFS Volume |
|
11楼#
发布于:2004-07-14 22:38
to AllenZh 我就是测试你的代码的 |
|
|
12楼#
发布于:2004-07-15 00:01
在drive中测试才行啊。
|
|
13楼#
发布于:2004-07-15 00:12
对了忘记告诉你我是通过App来测试你的函数的,没有在driver中测试 能不能把你测试的代码中的结构定义部分,给我参考一下,可能是我的结构定义有问题导致访问时失败。 |
|
14楼#
发布于:2004-07-15 08:38
谢谢大家的关心和帮助,我已经解决了这个问题。
通过很多人的帮助和提供的源代码,我发现大家的方法是一样的。 后来,我发现结构定义有点问题,我的定义在上面已经贴出,是一个PE结构错了,导致错位了。改过以后,就可以通过,并调用成功了。 但是引发了另一个问题,就是,他关机实再是太粗鲁,如果有很多程序和窗口打开,他会直接关机。 能不能有什么方法,让其他程序关闭以后再关机? |
|