用Masm调用ZwOpenSection时应该注意的问题
由于自己用Masm写的代码一直不能成功调用ZwOpenSection,总是返回80000002H错误,于是这几天一直在用S-ice跟踪自己的代码,从入口参数上来看,Masm编译的和VC编译的没什么区别,可是调用的结果却总是一个不成功,一个成功,于是只好跟踪到ntdll.dll的内部,看看是如何出的错,发现有两个需要注意的地方:
进入ntdll.dll后,跟踪一段时间(F8+F10),会遇到如下语句:
804C15FC: TEST
BL,03
此时D ebx,可以发现EBX是指向obj_attr结构的指针,联系上下,得出该指针地址必须作4字节的对齐
然后还有一处:
8049AEEE: TEST CL,01
此时D ecx,可以发现此时ecx是指向unicode字符串"\Device\PhysicalMemory",联系上下,得出该指针地址必须作2字节的对齐
于是在ReadBios.asm里头作如下修改:
EVEN
;EVEN伪指令,2字节对齐
szPhyMemW
db 05Ch,000h,064h,000h,065h,000h,076h,000h,069h,000h,063h,000h
db
065h,000h,05Ch,000h,070h,000h,068h,000h,079h,000h,073h,000h,069h,000h,063h,000h
db
061h,000h,06Ch,000h,06Dh,000h,065h,000h,06Dh,000h,06Fh,000h,072h,000h,079h,000h
db
23 dup (0)
ALIGN 4
;ALIGN伪指令,4字节对齐
obj_name
UNICODE_STRING < >
添加这两个伪指令后,程序运行完全正常,可以正常调用ZwOpenSection打开物理内存对象。
由于以前从来没有看到过这个tips,Google也没有搜索到,故写作此文,希望能给使用ASM的朋友一点帮助,由于MS
C++的编译器在背后帮我们完成了数据对齐的操作,所以,使用VC的朋友估计很难发现这个地方的毛病。
- 标 题:Masm中调用ZwOpenSection时应该注意的问题 (1千字)
- 作 者:夜月
- 时 间:2003-3-5
13:00:05
- 链 接:http://bbs.pediy.com