我在通过视频学习的过程中,视频讲到了关于程序异常中断的内容。我对这部分内容产生了一些思考,如果可以通过引发中断(int 3),来调用我自己设置的异常处理函数的话,我是不是可以做到一个简单的反调试?然后我进行了尝试
我的思路是:程序主动引发异常---->异常处理函数将异常部分nop掉--->程序正常运行
下面是代码
[C++] 纯文本查看 复制代码 #include <iostream>
#include <Windows.h>
HMODULE baseAddress = 0;
LONG CALLBACK VectoredHandler(PEXCEPTION_POINTERS pExceptionInfo)
{
std::cout << "Eip:" << pExceptionInfo->ContextRecord->Eip << std::endl; //输出当前的Eip
uintptr_t offset = 0x125EA;
uintptr_t targetAddress = reinterpret_cast<uintptr_t>(baseAddress) + offset;
//offset的偏移值是我经过几次调试确定的准确位置,这里没有问题,targetAddress是进行计算的。最开始是直接用baseAddress += 0x125EA结果计算一直有错误,就改成这样了。
byte replacementByte = 0x90; // NOP,替换的指令
std::cout << "(LPVOID)targetAddress:" << (LPVOID)targetAddress <<std::endl; //检验目标地址类型转换结果是否有问题
std::cout << " (LPCVOID)replacementByte: "<< (LPCVOID)replacementByte <<std::endl; //检验要替换的指令类型转换是否有问题
BOOL success = WriteProcessMemory(GetCurrentProcess(), (LPVOID)targetAddress,(LPCVOID)replacementByte,1,NULL); //将指令写入
if (!success) //检查是否写入成功
std::cout << "success为0,写入失败"<< std::endl;
return EXCEPTION_EXECUTE_HANDLER;
}
int main(int argc, char const *argv[])
{
baseAddress = GetModuleHandle(NULL); //获取程序基址
AddVectoredContinueHandler(NULL, VectoredHandler); //添加异常处理
_asm { //异常代码
int 3;
}
std::cout << "Hello world!" << std::endl; //如果异常解决后会执行的代码
system("pause");
return 0;
}
按照设想当程序运行到int 3的时候引发异常,然后调用我写好的处理函数,将int3 替换成nop随后回到异常位置向下运行,经过了nop执行Hello world
但是实际的情况比较头疼,直接运行引发系统提示中断,然后我取消调试就是如下结果(win10系统下直接运行):
直接运行存在问题,那么我去用dbg运行看看是否修改(win10系统dbg调试运行)
尽管函数的返回值告诉我已经替换成功但依旧没有替换。
想要问一下这是什么情况 ?
|