Я хочу создать самоудаляющийся код - функцию для стирания других. Я пытался это сделать, но иногда (в большинстве случаев) я запускаю его - он не работает так, как должен работать. Я хочу сделать что-то вроде этого:
int func(int a)
{
return a+1;
}
int main()
{
func(5);
erase(func);
...
//execute other things
...
}
Я уже создал функцию для этого, но она немного глючная - она ничего не пропускает, пока не найдет код операции ret, я знаю, что адрес начала функции (DWORD) func, но как мне найти адрес конца функции? Я видел пример в Интернете с чем-то вроде:
void func()
_asm __volatile__ beg
{
...
...
...
_asm __volatile__ end
}
но у меня это не работает - я использую VS 2013. Вот мой код:
void destruct(BYTE *pAddress, DWORD dwLen)
{
DWORD dwOldProtect, dwBkup;
VirtualProtect(pAddress, dwLen, PAGE_EXECUTE_READWRITE, &dwOldProtect);
for(DWORD x = 0x0; x < dwLen; x++)
*(pAddress + x) = 0x90;
VirtualProtect(pAddress, dwLen, dwOldProtect, &dwBkup);
}
как dwLen я передаю длину, рассчитанную в другой функции - от начала до следующего оператора ret. Под функцией удаления я подразумеваю заполнение его тела NOP или мусором - я хочу "стереть" функцию, которая будет использоваться при запуске программы только один раз, она мне не нужна позже, я просто не хочу, чтобы кто-то сбрасывал мое приложение и отменить его и т. д.
erase
и скопировать весь код прямо перед тем, как он сможет что-либо удалить. - person tux3   schedule 11.04.2015main()
. - person Galik   schedule 11.04.2015