【问题标题】:Problem with call windows API inline assembly调用 windows API 内联程序集的问题
【发布时间】:2011-09-01 08:02:50
【问题描述】:

我想反调试,写一个类似下面代码的函数调用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可以调用。请帮帮我!

【问题讨论】:

  • 编译器给出的确切错误是什么?
  • 为什么是汇编程序?有什么理由不添加对kernel32.lib 的引用而直接调用IsDebuggerPresent
  • 由于他包含了Windows.h,所以根本没有必要添加任何进一步的参考。

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


【解决方案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;
}

这将编译得很好。它可能在抱怨,因为你错过了一个入口点。您在项目选项中提供的子系统规定需要什么 main,无论是 WinMain(用于 Windows 子系统)还是 main(用于控制台子系统)。

我也建议使用:

#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 中都期望返回,所以你也可以返回,否则你所做的就是检查返回是否为真,然后返回真。如果为假,则返回假。刚回来。您所做的唯一一件事就是有效地将 BOOL 转换为 bool。不过,这让我觉得你为什么要使用内联 ASM。

【讨论】:

  • 不,我只是给出我的函数。我有主函数(当然)。但我不能调用 IsDebuggerPresent API。所以,当我尝试你的代码时,它不能 retn 因为编译器不能调用IsDebuggerPresent。
  • 他的错误是:“antidebug.exe 中 0x00d581e0 处的未处理异常:0xC0000005:访问冲突”。当我在 VS2010 上反汇编调试时,在“调用 IsDebuggerPresent”行,编译器无法调用..
  • 未处理异常是运行时错误,与编译器无关...
  • 哦。我不知道为什么 VC++ 会这样做。我在调试内联汇编代码之前遇到了这个问题。也许是一个错误?
  • 在测试了两个代码之后:我在这两种情况下都没有处理,看起来在调用函数之前没有正确设置。调用 C API 效果很好......(我告诉过你,内联汇编器是维护的噩梦)
【解决方案2】:

有什么理由不直接从 C 调用 API?

#include <windows.h>
#pragma comment(lib, "kernel32.lib")

bool checkdbg() {
    return IsDebuggerPresent();
}

【讨论】:

  • 谢谢,但我想内联 ASM,而不是像这样使用来自 C 的调用 API。 Mike Kwan 的方式无法成功运行,因为编译器没有调用 IsDebuggerPresent.所以,它无法返回(在 eax 寄存器上)
  • 所以你的问题是在编译时。有人问你:编译器给你的确切错误信息是什么?编译的结果是什么?错误消息对于理解编译器失败的原因至关重要......
  • (另外,请注意内联汇编器不会添加任何东西,除了一些维护噩梦)
  • 此错误是:“antidebug.exe 中 0x00d581e0 处的未处理异常:0xC0000005:访问冲突”。当我在 VS2010 上反汇编调试时,在“调用 IsDebuggerPresent”行,编译器无法调用..
【解决方案3】:

不要使用

call balabala

使用

call dword ptr [balabala]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多