我想反调试并编写一个函数,如下面的代码调用API调试“IsDebuggerPresent”来检查:
#include "windows.h"
bool checkdbg(){
int i = 1;
__asm{
call IsDebuggerPresent //gọi api debug
test eax, eax
jne L1
mov i,0
L1 :
}
if(i == 0) return false;
else return true;
}
但是编译时,VS2010找不到IsDebuggerPresent
来打电话。请帮帮我!
答案 0 :(得分:1)
#include "Windows.h"
bool checkdbg() {
__asm {
call IsDebuggerPresent //gọi api debug
test eax, eax
jne L1
mov i,0
L1 :
}
if(i == 0) return false;
else return true;
}
int CALLBACK WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) {
checkdbg();
return ERROR_SUCCESS;
}
这将编译得很好。这可能是抱怨,因为你错过了一个切入点。您在项目选项中提供的子系统要求使用主要内容,无论是WinMain(对于Windows子系统)还是主要(对于控制台子系统)。
我也建议使用:
#include <Windows.h>
相反:
#include "Windows.h"
有关说明,请参阅here。你也应该这样做:
#include <Windows.h>
BOOL checkdbg() {
int i = 1;
__asm{
call IsDebuggerPresent
ret
}
}
int main() {
checkdbg();
return ERROR_SUCCESS;
}
无论如何都要在eax中返回,所以你也可以返回,否则你所做的只是检查返回是否为真,然后返回true。如果是假,则返回false。回来吧。你做的唯一一件事就是从BOOL到bool。打败了我为什么你为此使用内联ASM。
答案 1 :(得分:0)
没有直接从C调用API的原因?
#include <windows.h>
#pragma comment(lib, "kernel32.lib")
bool checkdbg() {
return IsDebuggerPresent();
}
答案 2 :(得分:0)
不要使用
call balabala
使用
call dword ptr [balabala]