有autohotkey自带的upx壳
还有自校验。。
这题给的文件是修改过的,所以无法通过自校验
考虑到有自校验,所以就没有先脱壳。
直接带壳调试,用堆栈平衡很快找到OEP=00442B4F
然后可以看到第一个关键跳转:
448265必须跳
跟进4508C7,是在计算校验值,并判断。
ebp-0x10其实是文件的最后四个字节
所以文件的最后四个字节是计算出的校验值异或0xAAAAAAAA之后得到的值
程序接下来直接利用文件倒数第八到倒数第五个字节作为附加数据开始地址,读取附加数据开头,然后开始判断是否为附加数据,即判断开头是否是以下16个字节
A3 48 4B BE 98 6C 4A A9 99 4C 53 0A 86 D6 48 7D
所以文件的倒数第八到倒数第五个字节是附加数据开始地址
用16进制编辑器可以找到真正的附加数据开头
然后只需要修正文件的最后8个字节即可,注意修改附加数据地址也会改变校验值,所以应该先修改附加数据地址,再修改校验值。
最后的修改如下
然后程序就能正常运行了
百度一下即可找到答案jonsnow
参考文章
简析AutoIt程序脱壳后的自校验处理_看雪
(这篇文章里讲的是autoit的自校验,比autohotkey的稍微复杂一些(多了一次校验),但是基本方法是一样的,当时看这个文章得到不少思路)