Исправление во время выполнения в C ++ / встроенная сборка

Я пытаюсь пропатчить функцию cat() вернуть true, но по какой-то причине программа вылетает, когда я даже не вызываю функцию. Является ли проблема моим методом исправления? Я думаю, что пишу по правильному адресу (адрес функции — 004012e4). Я использую блоки кода (gcc) в 32-битной системе Windows XP.

#include <iostream>
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;

int cat()
{
cout<<"false"<<endl;
return false;
}

int main()
{
DWORD beef;
int (*css)();
css=cat;
cout<<css<<endl;
system("PAUSE");
VirtualProtect(&css,49,PAGE_EXECUTE_READWRITE,&beef);
asm("mov $0x40130f,%eax");//move address of the mov $0x0,eax instruction to eax
asm("movl $0x1,(%eax)");//write at address changing B800 to B801 or return true

return 0;
}

3

Решение

Почему вы жестко кодируете адрес функции? У вас есть это в коде, вы распечатываете это. Если вы напечатаете его, а затем измените код, чтобы включить то, что вы напечатали, вы рискуете переместить функцию. Почему бы просто не генерировать оператор сборки динамически?

2

Другие решения

Я не на 100% в этом, но я уверен, что сегмент кода не сопоставлены с селектором данных. Сегмент селектора данных по умолчанию в процессоре x86 называется ds, но код находится в регистре селектора cs, Из соображений безопасности (и, возможно, из-за виртуального пространства памяти) я считаю, что код обычно не отображается в одном и том же пространстве.

Не знаком с GCC Asm, но что-то вроде этого может помочь:

asm("mov $0x40130f,%eax");
asm("push %%fs");
asm("mov %%cs,%%fs");   // Not sure you can address memory using cs:eax directly...
asm("movl $0x1,%%fs:(%eax)");
asm("pop %%fs");

Я давно не писал ассемблер, но вы, наверное, видите, к чему я клоню.

0

По вопросам рекламы [email protected]