调用Windows API内联汇编的问题

时间:2011-09-01 08:02:50

标签: c++ winapi assembly call inline-assembly

我想反调试并编写一个函数,如下面的代码调用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来打电话。请帮帮我!

3 个答案:

答案 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]