wwwllg
驱动牛犊
驱动牛犊
  • 注册日期2004-07-04
  • 最后登录2016-03-22
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1469回复:14

查找ntdll.dll成功后,为什么Native API不成功?请高手相助。

楼主#
更多 发布于:2004-07-13 15:08
//在访问下面其中一句时,机器重启。
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]
wwwllg
驱动牛犊
驱动牛犊
  • 注册日期2004-07-04
  • 最后登录2016-03-22
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-07-15 08:38
谢谢大家的关心和帮助,我已经解决了这个问题。

通过很多人的帮助和提供的源代码,我发现大家的方法是一样的。

后来,我发现结构定义有点问题,我的定义在上面已经贴出,是一个PE结构错了,导致错位了。改过以后,就可以通过,并调用成功了。

但是引发了另一个问题,就是,他关机实再是太粗鲁,如果有很多程序和窗口打开,他会直接关机。

能不能有什么方法,让其他程序关闭以后再关机?

wwwllg
驱动牛犊
驱动牛犊
  • 注册日期2004-07-04
  • 最后登录2016-03-22
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-07-15 00:12
对了忘记告诉你我是通过App来测试你的函数的,没有在driver中测试


能不能把你测试的代码中的结构定义部分,给我参考一下,可能是我的结构定义有问题导致访问时失败。
wwwllg
驱动牛犊
驱动牛犊
  • 注册日期2004-07-04
  • 最后登录2016-03-22
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-07-15 00:01
在drive中测试才行啊。
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-07-14 22:38
to AllenZh

 请大侠帮小弟一把。

我的开发环境是vc6+sp6 + win2k pro + drivestudio
 

我就是测试你的代码的
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
wwwllg
驱动牛犊
驱动牛犊
  • 注册日期2004-07-04
  • 最后登录2016-03-22
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于: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

wwwllg
驱动牛犊
驱动牛犊
  • 注册日期2004-07-04
  • 最后登录2016-03-22
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-07-14 16:48
to AllenZh

 请大侠帮小弟一把。

我的开发环境是vc6+sp6 + win2k pro + drivestudio
wwwllg
驱动牛犊
驱动牛犊
  • 注册日期2004-07-04
  • 最后登录2016-03-22
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-07-14 09:58
我要实现关机。zwshutdownsystem,
您能把您的app代码给我参考吗?

[编辑 -  7/14/04 by  wwwllg]
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-07-14 09:52
对了忘记告诉你我是通过App来测试你的函数的,没有在driver中测试
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-07-14 09:51
我随便一个函数(ZwClose)没有问题,不知道你测试哪个函数,在什么地方出现的问题?还有你为什么在driver中call ntdll.dll中的,而不call ntoskrnl.exe中的?
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
wwwllg
驱动牛犊
驱动牛犊
  • 注册日期2004-07-04
  • 最后登录2016-03-22
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-07-14 09:06
我在论坛上把相关的关键字都查了一遍,碰到了几个相关的话题。
都没有完整的解决方案。

难道真的解决不了吗?
wwwllg
驱动牛犊
驱动牛犊
  • 注册日期2004-07-04
  • 最后登录2016-03-22
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
11楼#
发布于: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中截图
12楼#
发布于:2004-07-13 17:09
结构是自己定义的吗?看看结构是否正确,以及结构大小是否正确(结构是否按自己对齐)
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
13楼#
发布于:2004-07-13 17:05
贴出你的汇编代码,及当时各寄存器的值看看.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
wwwllg
驱动牛犊
驱动牛犊
  • 注册日期2004-07-04
  • 最后登录2016-03-22
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-07-13 16:25
我对用softice查看ord 的值,有时是一些很正常的值有时是0x04,0x09。。。,有时是很大的值。
但是即使是正常的值也会出现重启现象。

现在毫无进展,只有自己顶了。

游客

返回顶部