我的程序需要用压缩解压缩,我找了个7ZIP压缩库源代码。里面没有生成LIB的,只有生成DLL,我建了个LIB工程,生成了一个在VC下建了个工程正常使用。转到汇编平台就不行了,卡死在LzmaCompress这个函数,LzmaCompress在大约230条指令的时候调用了HeapAlloc函数,就卡死在这个函数里。
PUSH ESI ;HeapSize ESI==5824
PUSH 8 ;Flags HEAP_ZERO_MENORY
PUSH DWORD PTR DS:[533258] ;hHeap
CALL DWORD PTR DS:[411018] ;HeapAlloc
hHeap是533258地址的一个双字变量,他是0,所以进入HeapAlloc大约20个指令内就出现访问越界。
我于是跟踪VC下编译的程序进入这个函数调用,发现hHeap【533258】指向的双字不是零,是00370000,结果是可以正常使用。
我重启VC下编译的程序,在【533258】设置了内存写入断点,结果发现在main函数没有调用之前,VC初始化代码设置了【533258】,用的是HeapCreate函数返回值。
查看汇编编译的程序,一直执行到HeapAlloc出错也没有设置【533258】的值,应为汇编没有像VC编译出程序那样的初始代码,而是直接就调用了start:开始处;
我重新进入VC添加了一些代码去除了VC自动添加的初始代码:
#pragma comment(linker, "/ENTRY:EntryPoint")
void EntryPoint()
{
ExitProcess(main());
}
设置从EntryPoint启动,结果一样出现了在HeapAlloc出错。甚至连printf都出错在HeapAlloc。
以上的VC下是控制台工程,我建了个WIN32工程一样是出错。
我怀疑是不是那个LIB使用了类似NEW一样的C++操作符,所以导致必须要初始化代码,而汇编平台无法提供。但是我看他的代码都是.c结尾的,里面却调用了一些类似C++类的东西。他代码,
p = alloc->Alloc(alloc, sizeof(CLzmaEnc));里的Alloc是objidl.h的
void *( STDMETHODCALLTYPE *Alloc )(
IMalloc * This,
/* [in] */ SIZE_T cb);
以后就查不到了。
objidl.h 是用來放 COM 的核心宣告用的,以及 MIDL (Microsoft Interface Definition Language) 的宣告,這些東西和 COM Automation 有很密切的關係。
是不是跟这个有关系??求解!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课