看到大侠们不用引入表得到了函数地址,我也想试试,可是不想装其他的开发环境,我只熟悉VS,所以打算用vs2005来实验下汇编开发,经过几次调试,发现经过下面两步操作后,可以做到vs生成的结果和汇编环境生成的结果在逻辑上是一致的。
1、改入口点 /Entry:main ,不让我们的程序由CRT启动,而是由Kernel32.dll启动;
2、给main函数增加 __declspec(naked) ,不让编译器为我们增加额外的代码;
还没有解决的问题:win32汇编怎么搭建,可能是语法就不通过了。
下面是我写的小部分代码,测试通过,可以得到kernel32.dll的模块地址,在此非常感谢大侠们的努力让我学到了更多的新东西.
// 本程序实现了找到kernel32.dll的模块地址
int __declspec(naked) main()
{
__asm
{
// esp:kernel中调用main函数之后返回的地址
push ecx
mov ecx, [esp+4] //eax 现在是main函数返回之后的地址,这个地址一定在kernel32.dll模块之中
xor edx, edx
xor ebx, ebx
// 以ecx为最大值向上搜索kernel的基地址
Label_FindImageBase:
dec ecx
mov ebx, [ecx+60]
cmp ebx, 0f000h
ja Label_FindImageBase
inc edx
mov eax, [ecx + ebx + 52]
cmp ecx, eax
jz Label_End:
jmp Label_FindImageBase
Label_End:
// ecx现在是kernel32.dll的模块地址了
}
}