考前2个星期都一直在搞这个,然后考试周考的死去活来,全部忘光了。最近瞅了一下,发现远远没我想象的那么简单,双进程保护如果用的好的话,SMC+调试进程与被调试进程处理不同异常,的确能在很大程度上限制动态调试。 《加密与解密》上写的很简单,只是大体讲了一下思路,差不多步骤如下
1.加载或者附加一个正在运行的进程(可以用createprocess创建或者用debugactiveprocess附加)
2.获取被调试程序的信息(waitfordebugevent等待调试事件发生)
3.接受被调试进程发来的调试事件并处理然后我们在程序的开始,就可以做一些手脚,然后让调试进程,和被调试进程处理不同的事件,然后程序会沿着不同的逻辑进行,逆向起来就很头疼了。
下面我贴上以为看雪大牛之前发过的源码,然后自行填上了注释。
#define _WIN32_WINNT 0x0500
#include "windows.h"
int DebugMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow);
void DecryptCode(HANDLE hProcess,DWORD begin,DWORD end);
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
if(IsDebuggerPresent()) //区分调试进程与被调试进程,以执行不同代码,被调试的进程则调用DeBugMain
{
return DebugMain(hInstance,hPrevInstance,lpCmdLine,nCmdShow);
}
__try
{
__asm int 3 //断点异常想让调试进程处理
}
__except(1)
{
__asm pop eax; //如果调试器不处理断点异常,这里会被执行
__asm pop esp;//这两句汇编是破坏了堆栈
}
int div=0;
__try
{
__asm int 3 //断点异常交给被调试进程处理
}
__except(1)
{
div++;
}
div=1/div; //如果调试进程的异常处理模块未被执行,那么这里产生除0异常而使程序退出
__asm int