cndml 发表于 2022-8-9 16:22

完美UPX脱壳------之投怀送抱篇(适合所有变形)

本帖最后由 cndml 于 2022-10-30 14:54 编辑

一、前言:
      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,这条指令来判断。例如:cmp byte ptr ds:,0xF
je livelicense (完美修复).7FEE6E80712
sub al,0xE8
cmp al,0x1
ja livelicense (完美修复).7FEE6E806F6
cmp rsi,rcx
jae livelicense (完美修复).7FEE6E8072D
push rsi
lodsd

在cmp rsi,rcx上下断点,RSI 地址中的值,就是filter属性中的cto值。
[*]最后一个字节是前面36个字节的校验和,没啥用,upx会自动呈上。
四、投怀送报:

      现在来找前面分析的数据,先找压缩前后长度。
[*]压缩文件解压完成,处理E8前的最后一步,寄存器肯定会呈现压缩前后的数据长度,这是由它的解压过程决定的。在POP RSI 上下断点,rsi – UPX1段首地址就是解压前数据大小,rdi – UPX0段首地址就是解压后数据大小。jmp livelicense (完美修复).7FEE6E806C1
call r11
adc ecx,ecx
cmp rbp,0xFFFFFFFFFFFFFB00
adc ecx,0x2
call livelicense (完美修复).7FEE6E805EA
jmp livelicense (完美修复).7FEE6E80635
pop rsi
pop rdi
pop rax
mov dword ptr ds:,eax
mov rdi,rsi
push rsi
mov rdi,rsi
mov rsi,0x43800
mov dl,0x12
push rbx
push rdi
lea rcx,qword ptr ds:
pop rsi
push rsi
pop rbx
jmp livelicense (完美修复).7FEE6E80725
cmp rsi,rcx
jae livelicense (完美修复).7FEE6E8072D
push rsi
pop rsi
lodsb
cmp al,0x80
jb livelicense (完美修复).7FEE6E8070C
cmp al,0x8F
ja livelicense (完美修复).7FEE6E8070C
cmp byte ptr ds:,0xF
je livelicense (完美修复).7FEE6E80712
sub al,0xE8
cmp al,0x1
数据结构中的压缩文件的相关参数已经都找齐了,现在来找剩下的两个hash以及最后的校验和。
[*]把upx自身解压,搜索所有字符串header corrupted
header corrupted 4 的上面,就是计算校验和的call,upx中跟踪测试压缩文件,al中为正确的校验和。

[*]header corrupted 4 上面这个header corrupted 是测试压缩文件hash的两个call。

[*]Upx先检查校验和,校验和正确再检查解压前hash,然后测试解压是否成功,成功eax返回0,再检查解压后的hash,eax中为正确的hash值,好啦,所有数据都送来了,下一步就是UPX –D 啊!

xtang 发表于 2022-8-19 17:14

我有给UPX加壳的文件,用提供的upx unpacker v0.3 by SKYLLY123 脱壳,出现重定位问题,执行脱壳后的文件有oXC0000005错误信息。不知道如何来解决这个问题?

Genes 发表于 2022-8-29 16:10

xtang 发表于 2022-8-19 03:57
怎么修复???

这个得根据你使用upx -d 时,提示的错误,进行判断。比如elf 压缩的文件,upx标记那块和文件末端那个数据,有相同的,其实主要的还是文件最后的数据块,如果全部删了,补是能补出来的,不过暂时还没这个能力。

sbham 发表于 2022-8-9 17:11

膜拜,不明觉厉

fub8 发表于 2022-8-9 17:34

大神! 献上一朵花{:1_919:}

dunniu 发表于 2022-8-9 17:38

不会脱,能脱掉自定义的壳么??

ZhuanZhuYuIT 发表于 2022-8-9 17:54

感谢分享

hszt 发表于 2022-8-9 17:57

感谢分享

Tonyha7 发表于 2022-8-9 18:09

很巧的思路!

Hmily 发表于 2022-8-9 18:25

最后有个图好像没插入到正文,话说可以把x64脚本也写一份了。

yAYa 发表于 2022-8-9 18:26

时隔师傅上次发文已经过了很久了。

rubysn0ws 发表于 2022-8-9 18:38

学习了,谢谢分享
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 完美UPX脱壳------之投怀送抱篇(适合所有变形)