完美UPX脱壳------之投怀送抱篇(适合所有变形)
(编辑:jimmy 日期: 2024/11/16 浏览:3 次 )
一、前言:
UPX壳是一个开源的压缩壳,既然是开源基本上就没啥秘密可言了,因其压缩率高,短小精悍,深受初级加密用户喜欢。破解一款软件时,发现竟然用的是UPX壳,UPX壳本来可以用-d参数完美自解压,试了一下,报错!一看不要紧自解压信息全部清空了,虽然也可以用esp定律等方法脱壳修复,但是要完美脱壳工作量有点大。一个这么简单的壳,还要自作聪明的变形,简直是太不把广大破解工作者放在眼里,叔可忍婶不可忍!但要把删除的东西找回来,就要先知道聪明人删除了啥?
二、UPX文件结构:
找来大神的帖子(链接:https://www.52pojie.cn/thread-222719-1-1.html),了解了一下都丢了些啥,顺便看了一下大神的脚本,由于本人是X64程序,大神的脚本在x64dbg上直接用不了,修改嫁接的话部分脚本指令不支持,嫁接的难度比找失物似乎更难。
三、失物招领:
- 从upx文件结构可知,自解压需要一个0x25字节的数据结构,这个结构对于EXE文件为upx1的头部前0x25个字节,dll文件在PE头的尾部,紧接着就是upx1。
- 前9个字节为版本号,直接照抄。
- 第三个双字中,前俩字节照抄,我的样本是0D 24 (64位PE),第三个字节是压缩算法,这个要猜,查UPX手册,可能的取值是1- 0xE,第四个字节是压缩级别,对应1-0xA。测试一下三四字节,默认压缩组合是 0808或0807 ,带-rebute-ultra压缩的话是0E0A,这个也可以看一下upx1的数据前两个字节,1A03的压缩算法是0E,F77F的压缩算法是08,就这几个压缩算法,特征太明显。第四个字节似乎随便设置,不影响自解压。
- 第四个双字是解压后文件的hash,第伍个双字是解压前的hash。这俩需要upx上门送货。
- 第六个双字是解压后数据大小,第七个双字是解压前的数据大小。这俩需要跟踪计算,让其自动呈上。
- 第八个双字是压缩前文件的虚拟大小,这个保存在压缩文件内部,解压后尾部保存的原始文件的完整PE头,最后一个区段的RVA加上长度。
- 最后一个双字中,第一个字节是filter ID,我的样本X64程序是49,这个取值变化不大,第二个是cto,查手册是为了处理E8调用,增加压缩率,在快速压缩选项下,这俩字节可以全为0,也就是不数据处理,这个可以从压缩文件处理api函数前有没有sub al,0xe8,这条指令来判断。例如:[Asm] 纯文本查看 复制代码
cmp byte ptr ds:[rsi-0x2],0xFje livelicense (完美修复).7FEE6E80712sub al,0xE8cmp al,0x1ja livelicense (完美修复).7FEE6E806F6cmp rsi,rcxjae livelicense (完美修复).7FEE6E8072Dpush rsilodsd
在cmp rsi,rcx上下断点,RSI 地址中的值,就是filter属性中的cto值。 - 最后一个字节是前面36个字节的校验和,没啥用,upx会自动呈上。
现在来找前面分析的数据,先找压缩前后长度。
- 压缩文件解压完成,处理E8前的最后一步,寄存器肯定会呈现压缩前后的数据长度,这是由它的解压过程决定的。在POP RSI 上下断点,rsi – UPX1段首地址就是解压前数据大小,rdi – UPX0段首地址就是解压后数据大小。[Asm] 纯文本查看 复制代码
jmp livelicense (完美修复).7FEE6E806C1call r11adc ecx,ecxcmp rbp,0xFFFFFFFFFFFFFB00adc ecx,0x2call livelicense (完美修复).7FEE6E805EAjmp livelicense (完美修复).7FEE6E80635pop rsipop rdipop raxmov dword ptr ds:[rdi],eaxmov rdi,rsipush rsimov rdi,rsimov rsi,0x43800mov dl,0x12push rbxpush rdilea rcx,qword ptr ds:[rdi+rsi-0x3]pop rsipush rsipop rbxjmp livelicense (完美修复).7FEE6E80725cmp rsi,rcxjae livelicense (完美修复).7FEE6E8072Dpush rsipop rsilodsb cmp al,0x80jb livelicense (完美修复).7FEE6E8070Ccmp al,0x8Fja livelicense (完美修复).7FEE6E8070Ccmp byte ptr ds:[rsi-0x2],0xFje livelicense (完美修复).7FEE6E80712sub al,0xE8cmp al,0x1
2.jpg
数据结构中的压缩文件的相关参数已经都找齐了,现在来找剩下的两个hash以及最后的校验和。 - 把upx自身解压,搜索所有字符串header corrupted
3.jpg
header corrupted 4 的上面,就是计算校验和的call,upx中跟踪测试压缩文件,al中为正确的校验和。4.jpg
- header corrupted 4 上面这个header corrupted 是测试压缩文件hash的两个call。
5.jpg
- Upx先检查校验和,校验和正确再检查解压前hash,然后测试解压是否成功,成功eax返回0,再检查解压后的hash,eax中为正确的hash值,好啦,所有数据都送来了,下一步就是UPX –D 啊!
下一篇:多秣科学计算V.10:组合、排列、笛卡尔积