前言 这几天我想学习一点逆向的知识,但苦于入门较难,教学视频废话太多,也不想看,就去刷ctf题,不会的就看wp,不得不说ctf真的是居家旅行,杀人灭口必备良药啊。这不,在做逆向题的时候就发现有个软件用ida打开没啥函数,查看wp才知道被加壳了,照着wp用PEID查壳,发现是upx的,人家用od演示了怎么手动去壳,但我看的云里雾里的,各种名词它也没有解释,例如oep,popad啥的,我就只能去查,而且我的od还跟他的不一样,最后我通过x64dbg去掉壳,去壳的过程使我对x64dbg的使用更加熟练,也了解了壳的原理等。于是想记录下来。 脱壳的常见概念 壳:是一种对应用程序加密压缩处理的技术 一般对可执行文件加壳的目的有三种: ① 软件加壳,保护数据、防止破解 ② 外挂加壳,保护数据、防止破解 ③ 病毒加壳,防止被查杀。 常见的壳分为压缩壳和加密壳两种,upx属于压缩壳。 脱壳: 表示通过反汇编将壳去掉的过程。 OEP: 程序最开始执行的地方。 原始OEP: 程序加了壳后,壳是先运行的,所以OEP是壳程序的入口点,而原始OEP就是程序原来的入口点。 dump内存: 将内存中的数据或代码转储(dump)到本地。 IAT: 导入地址表,windows下可执行文件中文件格式中的一个字段,描述的是导入信息函数地址,在文件中是一个RVA数组,在内存中是一个函数地址数组。 修复IAT: 在脱壳后,不管是加密壳还是压缩壳,都有一个从内存dump到本地存储并保存为文件,而IAT在文件中是一个RVA数组,在内存中是一个函数地址数组,我们就需要将从内存dump出来的IAT从函数地址数组转换成RVA数组,这样程序才能修复。 脱壳的环境 :这个单独出来说,主要原因就是不同的系统脱壳时遇到的问题可能是不一样的,因为脱壳时要修改IAT,而不同系统中同一个模块的API导出的顺序是不一样的,所以修复时一般都会出现点问题。因此,我建议脱壳的环境应该是在32位系统的虚拟机中,以下的所有操作应该在32位系统的虚拟机中操作,64位系统下可能会出现意想不到的问题。 pushad : 将所有的32位通用寄存器压入堆栈 ESP-32 。 popad : 将所有的32位通用寄存器出栈 ESP+32。 脱壳的方法 单步调试法 一步一步分析每一条汇编指令,吃透每一行汇编背后所代表的意思,将壳代码读懂,从而找到
DDOS CC WAF NGINX CDN DNS CDH Python Go JAVA