TAG:naked call|naked function|VC|空函数
今天继续调试代码,发现一个奇怪的问题:寄存器里的值在call后会立刻改变,让人百思不得其解,于是只好使用反汇编,发现VC++居然在不知不觉中给一个void型且未使用任何变量的函数添加了一些指令:
0122B2D5 8B F4 mov esi,esp
0122B2D7 68 A0 10 2B 01 push offset pTYPE (12B10A0h)
0122B2DC 6A 40 push 40h
0122B2DE 6A 10 push 10h
0122B2E0 8B 45 F8 mov eax,dword ptr [pintcache]
0122B2E3 50 push eax
0122B2E4 FF 15 10 92 2C 01 call dword ptr [__imp__VirtualProtect@16 (12C9210h)]
0122B2EA 3B F4 cmp esi,esp
0122B2EC E8 D2 D1 FF FF call @ILT+5310(__RTC_CheckEsp) (12284C3h
__asm{...}
难怪,寄存器已经被动过了,当然不对了。
好在MS设计的编译器不是太傻,留了后路,可以使用naked function(naked call)调用
首先得在程序开头加上一句:
#define Naked __declspec( naked )
之后,修改函数定义,在之前加上__declspec( naked )
如
void vmload(){...}
__declspec( naked )void vmload(){...}
注意,必须在函数定义处使用__declspec( naked ),不能再声明处。
好了,这下函数开头处就是空白的。
不过要注意,加上__declspec( naked )后得自己进行一些工作,处理堆栈。
另外return;也不能使用,得自己加上ret。
ENDL
200字以内,仅用于支线交流,主线讨论请采用回复功能。