吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 15765|回复: 97
收起左侧

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

    [复制链接]
cndml 发表于 2022-8-9 16:22
本帖最后由 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,这条指令来判断。例如:
    [Asm] 纯文本查看 复制代码
    cmp byte ptr ds:[rsi-0x2],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段首地址就是解压后数据大小。
    [Asm] 纯文本查看 复制代码
    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:[rdi],eax
    mov rdi,rsi
    push rsi
    mov rdi,rsi
    mov rsi,0x43800
    mov dl,0x12
    push rbx
    push rdi
    lea rcx,qword ptr ds:[rdi+rsi-0x3]
    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:[rsi-0x2],0xF
    je livelicense (完美修复).7FEE6E80712
    sub al,0xE8
    cmp 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 啊!

免费评分

参与人数 48威望 +2 吾爱币 +150 热心值 +44 收起 理由
ms12020 + 1 + 1 用心讨论,共获提升!
yp17792351859 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
wasdzjh + 1 + 1 具体操作用法?能否出教程?
see1 + 1 谢谢@Thanks!
雁字回时月man楼 + 2 + 1 用心讨论,共获提升!
TW180 + 1 + 1 我很赞同!
jnjac + 1 + 1 我很赞同!
溜玩音乐 + 2 + 1 谢谢@Thanks!
SFY110 + 1 + 1 谢谢@Thanks!
dummersoul + 1 + 1 谢谢@Thanks!
孺子韫 + 1 + 1 用心讨论,共获提升!
pelephone + 1 + 1 我很赞同!
半边天 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
努力加载中 + 1 + 1 谢谢@Thanks!
海天一色001 + 1 + 1 谢谢@Thanks!
z1987 + 1 + 1 用心讨论,共获提升!
wdraemv + 1 + 1 谢谢@Thanks!
32154678925 + 1 + 1 我很赞同!
Flamiec + 1 我很赞同!
抱歉、 + 1 用心讨论,共获提升!
huawei518 + 1 + 1 用心讨论,共获提升!
warehouse + 1 + 1 用心讨论,共获提升!
limlibgiag + 1 + 1 谢谢@Thanks!
Stoneone + 1 + 1 用心讨论,共获提升!
envilogic + 1 谢谢@Thanks!
eer123 + 1 + 1 用心讨论,共获提升!
学习使我快乐1 + 1 + 1 谢谢@Thanks!
hellozhanghe + 1 + 1 热心回复!
wangshisuifeng1 + 1 + 1 热心回复!
chengdragon + 1 用心讨论,共获提升!
weidechan + 1 用心讨论,共获提升!
victos + 1 + 1 谢谢@Thanks!
b1ackie + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
bullshit + 1 + 1 谢谢@Thanks!
爱飞的猫 + 3 + 1 用心讨论,共获提升!
wapj152321 + 1 + 1 谢谢@Thanks!
coder9527 + 1 + 1 热心回复!
hszt + 1 + 1 非常好
笙若 + 1 + 1 谢谢@Thanks!
yanyongliang + 1 + 1 谢谢@Thanks!
OmegaMolecule + 1 我很赞同!
杨辣子 + 1 + 1 用心讨论,共获提升!
某些人 + 1 + 1 谢谢@Thanks!
Li1y + 2 + 1 谢谢@Thanks!
yAYa + 3 + 1 用心讨论,共获提升!
Hmily + 2 + 100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Tonyha7 + 1 用心讨论,共获提升!
smakasa + 1 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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
大神! 献上一朵花
dunniu 发表于 2022-8-9 17:38
不会脱,能脱掉自定义的壳么??

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
jamescookers988 + 1 + 1 热心回复!

查看全部评分

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
时隔师傅上次发文已经过了很久了。

免费评分

参与人数 1热心值 +1 收起 理由
jamescookers988 + 1 热心回复!

查看全部评分

rubysn0ws 发表于 2022-8-9 18:38
学习了,谢谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-22 19:19

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表