CrackMe_Acid分析
CrackMe2
爆破难度:⭐
算法分析难度:⭐
压缩包名:004-Acid Bytes.2.zip
运行程序初步了解程序作用

是一个类似注册机的程序
利用exeinfo pe查壳

32位可执行程序,经过了upx加壳,可以使用upx.exe -d命令进行脱壳
先使用upx进行脱壳处理

破解
暴力破解
使用字符串查找的方法找到关键点

在前面的入栈处(一般为程序的入口附件)下断点进行分析
在提示成功前只有一个跳转指令,将其改为nop或相反的指令即可实现破解
算法分析
这里不进行壳的算法分析,仅进行程序本身的算法进行分析

输入的11111被放入了eax里,然后12011982赋值给了edx
进入下面调用的函数进行分析

当eax与edx相等时即返回主函数,到主函数后不相等就跳转,破解失败
所以,这里只是检验输入字符是否为12011982
手动脱壳
查找程序oep
使用平衡堆栈法找到oep

我们使用x64dbg调试加壳后的程序,观察oep处的指令,可以发现OEP的第一条指令是 pushad,其作用一般是保存寄存器环境,可以将8个通用寄存器都压入堆栈,那么我们可以单步程序(F8),执行 pushad,这样堆栈就会发生变化,而后我们可以在堆栈栈顶处,即ESP指向的内存处,设置硬件访问断点

然后在内存窗口处,右键设置4字节的硬件访问断点
之后,可以使用快捷键F9运行程序,程序会再次暂停下来,我们观察附近指令

可以发现我们暂停的指令上方就是 popad指令,一般遇到 popad指令,就离原始OEP不远了,因为执行完 popad指令意味着壳代码告一段落了
继续单步,可以发现一个比较大的jmp跳转。这个jmp其实就会跳转到原始OEP
实际上在分析时,我们是先单步到jmp跳转到的代码进行观察之后得出是否是原始OEP的结论的,这个部分需要我们对未加壳程序的OEP要有所了解

可以看到实际上已经进入到了主程序了,使用字符串搜索也能找到相关的字符串
dump内存
选择插件-scylla,打开dump窗口,此处已经自动获取了OEP,直接点击dump

保存文件后再单击Autosearch,修复IAT


修复好dump出来的程序后即可完成脱壳,执行程序发现已经能够正常运行
重新加载发现已经是正常显示了
还可以硬解,手动执行完壳程序后即会进入到主程序
总结
只是加了壳,关键在于手动脱壳过程

浙公网安备 33010602011771号