快速恢复Safengine Protector的Shadow DLL

本文介绍如何在C++中快速恢复Safengine Protector的Shadow DLL,主要通过HOOK NtCreateFile, NtReadFile, NtClose来确定并恢复被保护程序的API调用。内容包括Shadow DLL的工作原理和利用PE结构恢复特定API的方法。" 139217608,2391601,电子式互感器种类详解,"['电力系统', '传感器技术', '电力测量', '电力设备', '互感器技术']
摘要由CSDN通过智能技术生成

本文以Safengine Protector v2.3.x.0为例, 提供了一种C++代码快速恢复Safengine的Shadow DLL的方法, 没啥技术含量, 仅希望能给各位一点参考.


Shadow DLL是一种加密壳常见的反Hook/反下断方案, 工作原理简言之就是自行加载系统DLL, 并重定向受保护程序的API调用到相应处理过的Shadow DLL, 由此绕开了对原有系统DLL的调用, 阻止对系统DLL的下断和拦截. 详细请参阅半斤八两前辈的文章【原创】Kill Safengine Shadow Dll(附源码)

那如何恢复呢?上面那篇文章已经讲得非常清楚了, 本文只是补充了一点, 即快速恢复.

有时候我们只对特定的API感兴趣, 那么我们大可通过PE结构直接确定该API在物理文件中的位置(File Offset), HOOK NtReadFile拦截壳对系统DLL文件的读取, 接着在特定位置使用0xFF25 jmp到系统DLL, 完成恢复.

拦截部分, 我的做法是HOOK NtCreateFile, NtReadFile, NtClose以确定壳正在加载那个DLL, 这种方法感觉最为简单高效, 无须额外的API调用(仅仅HOOK NtReadFile你无法直接判断打开的是什么文件), 然后可能你还要记录读取的位置, 因为SE壳会分多次, 而不是一次性读入, 如果特定位置恰好在分块位置, 你就需要特殊处理.

下面附上由Export Name确定对应File Offset的方法, 可算是本文的核心代码:

static DWORD KiGetFileOffset(LPVOID lpBaseOfImage, LPCSTR lpTargetFuncName)
{
	auto lpNtHeader    = Rtl
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值