Конвертировать Extern C в Inline ASM - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть проект C ++, который вызывает функцию extern, расположенную в файле .asm (MASM).Можно ли как-нибудь встроить код MASM в файл C ++ вместо необходимости использовать отдельный файл .asm?

.asm

.data

.code

ZwReadVirtualMemory proc
    mov r10, rcx
    mov eax, 3Fh
    syscall
    ret
ZwReadVirtualMemory endp

end

Вот C ++файл

#include "stdafx.h"
#include <Windows.h>
#include <iostream>

using namespace std;

extern "C" NTSTATUS ZwReadVirtualMemory(HANDLE hProcess, void* lpBaseAddress, void* lpBuffer, SIZE_T nSize, SIZE_T* lpNumberOfBytesRead = NULL);

int main() {

    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 14648);
    if (!hProcess)
        return EXIT_FAILURE;

    int intBuffer = 0;
    void* lpBaseAddress = 0;
    SIZE_T lpNumberOfBytesRead = 0;

    NTSTATUS status = ZwReadVirtualMemory(hProcess, (PVOID)0x10ad0000, &intBuffer, sizeof(int), &lpNumberOfBytesRead);

    cout << "ZwRVM returned " << dec << status << endl;
    cout << "intBuffer = " << dec << intBuffer << endl;
    cout << "lpNumberOfBytesRead = " << lpNumberOfBytesRead << endl;

    cin.get();
}

1 Ответ

0 голосов
/ 25 апреля 2018

Некоторые компиляторы C / C ++ поддерживают нестандартные встроенные блоки сборки asm или __asm__.Их можно использовать для включения частей кода на ассемблере в обычные функции или методы.

Ваш пример кода явно указывает на использование WinAPI (таким образом, Windows в качестве целевой платформы) и Visual Studio в качестве компилятора (stdafx.h являетсясамая непереносная часть).Однако обновления Visual Studio 2010 и более поздних версий перестали поддерживать встроенную сборку для 64-разрядных целей: http://msdn.microsoft.com/en-us/library/4ks26t93%28VS.100%29.aspx

Ваши параметры:

  1. Скомпилировать файл MASM в отдельный объектный файли связать его позже с остальной частью программы.

  2. Использовать Intel Compiler для Windows.Он поддерживает встроенный ассемблер и предназначен для замены компиляторов Microsoft в Windows, однако я не знаю, сколько потребуется дополнительных усилий по его переносу.

  3. Единственный бит изВаш файл ассемблера, который не доступен напрямую из C / C +, выполняет машинную инструкцию syscall.Если вы найдете встроенную функцию для этой инструкции, которая поддерживается MS VS, вы можете использовать ее вместо встроенного блока сборки.Тем не менее, я не могу найти один здесь .Признаки Intel не лучше .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...