有autohotkey自带的upx壳
upx
还有自校验。。

这题给的文件是修改过的,所以无法通过自校验
corrupt

考虑到有自校验,所以就没有先脱壳。
直接带壳调试,用堆栈平衡很快找到OEP=00442B4F
oep

然后可以看到第一个关键跳转:
check1
448265必须跳
跟进4508C7,是在计算校验值,并判断。
check_cmp1
ebp-0x10其实是文件的最后四个字节
checksu
所以文件的最后四个字节是计算出的校验值异或0xAAAAAAAA之后得到的值

程序接下来直接利用文件倒数第八到倒数第五个字节作为附加数据开始地址,读取附加数据开头,然后开始判断是否为附加数据,即判断开头是否是以下16个字节
A3 48 4B BE 98 6C 4A A9 99 4C 53 0A 86 D6 48 7D
check2
所以文件的倒数第八到倒数第五个字节是附加数据开始地址
用16进制编辑器可以找到真正的附加数据开头
offest1
然后只需要修正文件的最后8个字节即可,注意修改附加数据地址也会改变校验值,所以应该先修改附加数据地址,再修改校验值。
最后的修改如下
patch
然后程序就能正常运行了
result
百度一下即可找到答案jonsnow

参考文章

简析AutoIt程序脱壳后的自校验处理_看雪
(这篇文章里讲的是autoit的自校验,比autohotkey的稍微复杂一些(多了一次校验),但是基本方法是一样的,当时看这个文章得到不少思路)