Проблема с вызовом Windows API встроенной сборки - PullRequest
0 голосов
/ 01 сентября 2011

Я хочу выполнить анти-отладку и написать функцию, подобную следующему коду, чтобы вызвать отладку 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 ]

1 голос
/ 01 сентября 2011
#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) или main (для подсистемы консоли).

Также я бы посоветовал использовать:

#include <Windows.h>

В отличие от:

#include "Windows.h"

См. здесь для объяснения. Также вы должны просто сделать это:

#include <Windows.h>

BOOL checkdbg() {
    int i = 1;
    __asm{
        call IsDebuggerPresent
        ret
    }
}

int main() {
  checkdbg();
  return ERROR_SUCCESS;
}

В любом случае ожидается возврат в eax, так что вы также можете вернуться, в противном случае все, что вы делаете, проверяет, является ли возвращение истинным, а затем возвращает истинное. Если это false, верните false. Просто вернись. Единственное, что вы сделали, так это эффективно бросили из BOOL в bool. Хотя, в любом случае, лучше, чем вы используете встроенный ASM для этого.

0 голосов
/ 03 сентября 2017

не использовать

call balabala

использование

call dword ptr [balabala]
0 голосов
/ 01 сентября 2011

есть ли причина не вызывать API напрямую из C?

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

bool checkdbg() {
    return IsDebuggerPresent();
}
...