самоизменяющийся под windows вопрос перезаписать - PullRequest
0 голосов
/ 21 апреля 2019

Я пишу код для автоматической мутации, и его первоначальное значение до перезаписи равно 1, но после перезаписи должно быть 42. Я думаю, что мне не хватает некоторых аспектов, потому что я получил 1 как при оригинальной, так и при перезаписи мутаций. мой полный код выглядит как эта основная ссылка, но исходный код был написан под * unix https://shanetully.com/2013/12/writing-a-self-mutating-x86_64-c-program/

#include <windows.h>
#include <iostream>
using namespace std;
int getpagesize();
void foo(void);
int change_page_permissions_of_address(void *addr);

int getpagesize() {
    SYSTEM_INFO si;
    GetSystemInfo(&si);
    return unsigned(si.dwPageSize);
}

void foo(void) {
    int i = 0;
    i++;
    printf("i: %d\n", i);
}

int change_page_permissions_of_address(void *addr) {
     // Get total function size
    int page_size = getpagesize();
    DWORD dwOldProtect;
    // Obtain the addresses for the functions so we can calculate size.
    uintptr_t tmp = (uintptr_t)addr-(uintptr_t)addr%page_size;
    addr = (void*)tmp;

     // We need to give ourselves access to modifify data at the given address
    if (VirtualProtect(addr, page_size, PAGE_EXECUTE_READWRITE, &dwOldProtect) == -1) {
        return -1;
    }

    return 0;
}

int main() {
    void *foo_addr = (void*)foo;
    if (change_page_permissions_of_address(foo_addr) == -1) {
        printf("Error while changing page permissions of foo(): %s\n");
        return 1;
    }

    // Call the unmodified foo()
    puts("Calling foo...");
    foo();

    // Change the immediate value in the addl instruction in foo() to 42
    unsigned char *instruction = (unsigned char*)foo_addr + 18;
    *instruction = 0x2A;

    puts("Calling foo..., but I am the self-modifying");
    foo();
    cin.get();
    return 0;
}

1 Ответ

1 голос
/ 21 апреля 2019

Проверка VirtualProtect неверна, так как возвращает FALSE, а не -1 в случае ошибки.Также я подозреваю, что вам нужно будет получить указатель на начальную страницу области страниц, к которой принадлежит foo, и неясно, откуда вы получили смещение 18.

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