论坛首页 逆向工程技术区 阅读主题

学习脱壳 ASProtect 2.1x SKE 的详细笔记

327 浏览 5 回复
#1 楼主 2026-06-01 21:09:00
Qq: 2746074413 微信:vmp520888个人空间 561K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6M7r3q4U0k6g2)9J5k6h3u0A6L8r3W2T1K9h3I4A6i4K6u0W2j5$3!0E0i4K6u0r3x3K6f1@1y4U0V1#2y4U0j5$3y4o6p5@1y4U0j5H3x3b7`.`. 本文是学习学习脱壳之 ASProtect 2.1x SKE 简单加壳的 98NOTEPAD(MC++),原文链接(https://bbs.kanxue.com/thread-24450.htm)
所做的笔记,文中有对一些存在的问题进行修正,还对脱壳过程中的思路进行详细的说明。1.需要用的工具有WIn10系统,吾爱破解OD,IDA8.3,ImPortRec1.7,LordPe—WIn10修正版,都可以在吾爱破解上找到。
2.ASProtect 2.1x SKE这款壳不像UPX,Aspack等压缩壳,很容易就脱掉,其中需要做的事情有,寻址OEP,修复IAT,恢复被替换的代码(比如说程序调用MessageBoxA这个API,应该是CaLL MessageBoxA,被替换成Call XXXXXX,XXXXX是个固定的地址),修复一些BUG。
3.在开始之前需要对Od进行设置 其中第一个HidePEB,
是对抗壳反调试,不选上运行会弹出提示,ShowBar的话是为了能够使用底部的命令行。第二是,要对Od的异常处理进行设置,选项-》调试设置-》异常把所有勾都去掉
这边涉及的异常是非法访问内存,比如说eax=0,mov ebx,[eax],最下面的同时忽略一些指定的异常或范围,00000000....FFFFFFFF,表示把任何异常都忽略,连硬件断点都会失效。
4.寻找OEP,设置好刚才的就把NotePad拖入OD,会弹出一个对话框意思是这个段代码被压缩过需要分析随便点是或否都行。接着到了入口点这边位置还在代码段,这段代码是壳的代码杂乱无章的,一看就没了兴趣,别管这些,我们只要知道壳,运行n个代码后会申请一段内存,把代码放到上面跑,其中主要做了两件事解密原始程序的代码,制造内存访问错误异常,当然还有反调试,按下30多次 Shift+F9(忽略异常继续执行) 命令后程序跑起来了。这边不需要数运行多少次只要找到第二次出现这个指令就到最后一次异常了,此时原程序代码已经被解密,也是离壳执行到原程序入口最近的地方了,这时候按下快捷键ALT+M找到401000按下F2给这个代码块下断点, ,再按一次Shift+F9,程序就停在了程序入口点。
这时候代码被OD识别成了数据,我们点击右键-》分析-》从模块中删除分析
这是代码就被OD正常识别了我们可以看到4010d3处的代码被修改成了 call 02410000,(02410000这个地址每次运行都有可能不一样)而且不止一处被修改,很显然我们需要还原他。往下翻我们找到4010e2这一处并没有被替换,我们知道壳把部分的调用API函数的代码都改成了Call 02410000 ,我们接着使用这个0x4064F4地址在底部命令行按下dd 0x4064F4 (upload/attach/202409/1004848_E6TUGT7ENK8X2NR.webp)
可以看到406504 0000000 ,这个000000表示用来分割不同DLL函数地址的,利用这个我们就可以找到IAT表的开始的地址,00406508 E1022275上面这些都已经被加密了,没被加密的话应该是7开头的地址
后面还有备注函数名。我们向上翻找到4062f0,这边可以看到这个函数名advapi32.RegOpenKeyA,再往上数到第四个地址 4062e0 数值为00000000,这边就是分隔用的,下一个地址4062e4就是iat的开始了。
5.IAT还原,要还原IAT,就要看看壳对IAT表做了哪些事情,这样我们才有思路,这边我们刚开始需要做一件事情
点一下A字后面红色圆心的按钮,这样方便查看我们下了哪些硬件断点,有时候会出现一个问题,明明我们下了硬件断点但是打开查看却发现没有下,所以最好是不要关闭这个界面。接下来我们找到选项-》调试设置-》异常,把非法访问异常给勾上,这样做我们就不会老是断下,再Shift+F9忽略继续运行了,接着在命令行执行命令dd 0x4062e4,选中0x4062e4这一行IAT的起点,右键找到断点-》硬件写入-》byte,接着F9运行,看0x4062e4地址上的数值变化,运行到004062E4 的值变成8A14F25D,这时候把硬件断点删了,找到选项-》调试设置-》异常,把非法访问异常勾去掉,再Shift+F9,忽略异常运行,运行几次后出现 mov byte ptr ds:[ecx],0xB6 这个代码就可以了停了,因为在Shift+F9运行之后断下IAT表已经解密完了,就不能分析它的解密流程了。这个代码再跟一断时间就可以找到IAT解密的地方了,
接下去代码怎么跟踪,Shift+F9忽略异常运行?不完全对这段代码看起来杂乱无章后面几行还是可以给我们下断点的,
我们在pop ecx 这个指令下F2断点,因为这个指令的地址每一次运行都不一样我这边就不说地址了,接着Shift+F9运行就断在在pop ecx这个指令这边,接着找到选项-》调试设置-》异常,把非法访问异常勾去掉,现在就不需要异常打扰了咱们只要找到解密代码的函数在哪里就行了,现在就F8,单步一直走,
走到call 0xxx7818 停住继续F8你会发现IAT表部分被解密了并且注释里出现了很多函数名。我们可以确定这个函数包含了解密函数,要找到最深层的解密函数我们还需要跟进,同时这个函数
前三个和后三个都是指令 这就让我们可以很容易定位到它的位置,右键-》查找-》所有参考文本字串,找到文本字串为ASCII "85\r\n",双击点进去就可以找到call xxx7818 类似的函数,接下来F7单步步入这个函数内部,再F8单步一直走,
走到XXX795a的地方也就是函数结尾retn指令前面最后一个call下个断点,F9运行,EIP又在XXX795a断下,然后在iat数据窗口
可以看到此时已经有一个函数被还原了,注释里面也有了函数名,继续F9运行,EIP又在XXX795a断下,浏览iat数据窗口,发现没有变,重复上面的动作,发现有时候有新的API被还原有时候却没有,我们可以假设XXX795a,这个地址就是调用还原iat表的函数,而且每调用一次只还原一个API,为什么有时候调用却没有还原呢?带着这个问题我们跟进这个函数内部,F8在这个函数内部一直走如果走到函数返回,继续F9运行断下,F7步入,F8步过,
xxx7725这个地址就是对iat表的某一项把他API地址进行写入,只要执行到这边它就还原iat表,我们做个猜测,只要让他能够一直执行到这边,是不是把那些没有还原的iat表中的某些函数都给还原了,带着这个疑问我们在od上分析函数的执行流程显然很吃力,要是能够让他在ida上展示出来就好了,这个壳是零几年的到现在应该有20年了吧感觉现在用ida分析他有点像

...(已截断)

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-283321.htm
#2 2026-06-01 21:09:00
比较详细,感谢分享
#3 2026-06-01 21:09:00
感谢分享
#4 2026-06-01 21:09:00
我正好遇到这个问题,注入解密代码(大佬写的),就是在这个模块报错,解密到这个模块就会有个mov自执行,关键是自执行跳转的地方注入代码没写,”mov dword ptr ds:[edi],ecx“,edi指向该指令地址,修改指令E194(loopnz edi+94),注入的解密函数如下:#5751558BAC2440010000892D001040000FB67B393BF775040FB6733A8BFA83EF0233C9668B0F8B3D00104000890F83C704892F83C70C893D001040005D595F3BF00F8500000000E90000000090909090578B3D0000010483C704C707000000005FE900000000909090#,有没有大佬完善一下
#5 2026-06-01 21:09:00
感谢分享
#6 2026-06-01 21:09:00
谢谢,太厉害了

请登录后参与讨论

立即登录 注册账号