我想创建自擦除代码 - 擦除他人的功能。我试图这样做 - 但有时(大多数时候)我会运行它 - 它无法正常工作,因为它应该工作。我想做这样的事情:
int func(int a)
{
return a+1;
}
int main()
{
func(5);
erase(func);
...
//execute other things
...
}
我已经创建了函数来执行此操作,但它有点错误 - 它在找到 ret 操作码之前一直在处理所有内容,我知道 func 开始地址是 (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 或垃圾填充它的主体 - 我想“擦除”功能,它只会在程序启动时使用一次,我以后不需要它,我只是不想让任何人转储我的应用程序并反转它等。