双进程保护及实现

本文探讨了双进程保护在防止动态调试中的应用,详细解释了《加密与解密》中提到的步骤,包括创建调试进程、处理调试事件。通过CreateProcess函数与调试循环,分析了如何利用DEBUG_PROCESS和DEBUG_ONLY_THIS_PROCESS标志实现保护。文中提到了关键函数如WaitForDebugEvent和ContinueDebugEvent在调试过程中的作用,以及如何通过异常处理控制程序分支,增加了逆向工程的复杂性。建议通过实际调试来理解双进程保护的工作原理。
摘要由CSDN通过智能技术生成

考前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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值