这个主要是有一个UPX壳。可以选择用官方工具对其进行脱壳,也可以对其进行手动脱壳,但是正常的导入表是通过操作系统对字符串来处理然后得到该字符串的函数名称对应的函数地址变成地址给exe使用,但是这里由于我们是把exedump出来了,所以就是把操作系统变成的函数地址给弄了出来,而不是函数名称字符串。所以还需要手动修复。
咱直接工具脱壳,然后OD解析算法。
-
脱壳后,直接用OD查看因为我们允许程序发现会有“You are a bad cracker!”这种字符串,所以我们可以直接对字符串进行查看,就发现了这个提示成功的字符串,我们直接跳转到该处分析。注意最下面有个“12011982”,这个起始就是序列号。
-
我们跳转到successful字符串处找到函数开始处,设置断点,然后开始允许尝试动态调试。
-
这时候他会弹出窗口,我们在窗口中输入123456789然后check。程序就直接跳转到我们设置的断点处了,之后就开始单步执行。在这里我们可以看到有个local.1的地址被存入了edx中,edx中又显示的是一个堆栈的地址,看堆栈发现该处全零。这就有可能表示这就是一个用来存储变量的地址。
-
继续运行,当执行完第一个函数的时候,之前local.1在堆栈中的地址已经存储了数据:123456789
这刚好就是我们输入的序列号。
-
之后就是一个函数和一个跳转,然后就是显示成功的字符串。所以整个流程就是将我们输入的字符串存入堆栈,然后与本身的字符串比较,通过比较结果进行跳转。我们只需要修改jnz就可以完成爆破。运行,
壳:壳是一个dll文件,在执行时会先执行壳,执行完之后再开始执行加壳程序。这代表我们在面对加壳程序时遇到的oep其实并不是真正的oep,找到真正程序的oep就是脱壳的关键。
upx壳:upx是一种压缩壳,简单介绍其机制就是将代码进行压缩,然后在运行时进行实时解压。
脱壳:找到真正的oep之后把真正的程序导出。导出可能会导致一些问题,还需要进行手工修复,根据PE提示进行修改。