首页
社区
课程
招聘
[原创] UPX源码学习和简单修改
发表于: 2023-1-7 11:52 75076

[原创] UPX源码学习和简单修改

2023-1-7 11:52
75076

冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。

最后于 2023-1-7 16:42 被luoye_ATL编辑 ,原因: 标题格式有问题,进行修正
上传的附件:
  • demo (2.12MB,302次下载)
  • upx.bt (38.75kb,299次下载)
收藏
点赞 31
打赏
分享
最新回复 (57)
雪    币: 2575
活跃值: (577)
能力值: ( LV6,RANK:85 )
在线值:
发帖
回帖
粉丝
2
不错的帖子,二次开发,加点VM进去?
2023-1-7 15:05
0
雪    币: 81
活跃值: (4665)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢分享
2023-1-7 16:00
0
雪    币: 1373
活跃值: (1749)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
4
wyfe 不错的帖子,二次开发,加点VM进去?
VM得下下个阶段了,下一步想着想研究下解压的汇编代码
2023-1-7 17:44
0
雪    币: 2575
活跃值: (577)
能力值: ( LV6,RANK:85 )
在线值:
发帖
回帖
粉丝
5
luoye_ATL VM得下下个阶段了,下一步想着想研究下解压的汇编代码[em_41]
看看解压算法是自已实现的,还是用了第三方的压缩引擎
2023-1-7 21:20
0
雪    币: 29873
活跃值: (3572)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
wyfe 看看解压算法是自已实现的,还是用了第三方的压缩引擎

UDX使用的是开源的UCL压缩库吧,那东西对于PE的压缩率很高,主要是解压速度快。一直在使用。bbeK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3!0T1k6i4u0Z5N6h3#2W2M7W2)9J5k6h3y4G2L8g2)9J5c8X3!0H3k6h3&6K6L8%4g2J5j5$3g2Q4x3V1k6#2j5$3I4Q4x3V1j5`.

最后于 2023-1-7 21:55 被bestbird编辑 ,原因: 添加附件
上传的附件:
2023-1-7 21:53
1
雪    币: 458
活跃值: (520)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
感谢分享
2023-1-14 12:34
0
雪    币: 7024
活跃值: (5640)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感谢大佬分享
2023-1-21 17:32
0
雪    币: 2333
活跃值: (734)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
感谢分享
2023-1-29 18:35
0
雪    币: 1719
活跃值: (215957)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
10
tql
2023-1-30 09:51
0
雪    币: 211
活跃值: (1957)
能力值: ( LV9,RANK:172 )
在线值:
发帖
回帖
粉丝
11
b50K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6#2M7s2S2Q4x3V1k6#2M7s2S2Q4x3X3c8K6N6s2g2T1N6r3!0G2L8s2x3`.
upx的loader是通过这个工具生成的 (也就是你上面修改的 amd64-linux.elf-fold.h )
2023-1-30 11:20
0
雪    币: 1373
活跃值: (1749)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
12
vmtest 755K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6#2M7s2S2Q4x3V1k6#2M7s2S2Q4x3X3c8K6N6s2g2T1N6r3!0G2L8s2x3`. upx的loader是通过这个工具生成的 (也就是你上面修改的 amd64-linux.elf-fold.h )
是的,我后来就是用这个工具重新编译修改后的代码生成 amd64-linux.elf-fold.h 文件
2023-2-1 22:27
0
雪    币: 10044
活跃值: (7864)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
感謝分享!
2023-2-2 08:32
0
雪    币: 220
活跃值: (1266)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
WIN下的,也是一样的么?
2023-2-5 11:31
0
雪    币: 1373
活跃值: (1749)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
15
dayang WIN下的,也是一样的么?

WIN的加壳流程我不太清楚,得你自己阅读源码了。loader部分的话使用的是另外的文件,在目录upx-3.96/src/stub/src/可以看到

最后于 2023-2-6 14:29 被luoye_ATL编辑 ,原因:
2023-2-6 14:07
0
雪    币: 381
活跃值: (165)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
请教下修改.s的汇编文件后, 怎么编译呢
2023-2-8 11:36
0
雪    币: 381
活跃值: (165)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
vmtest 9a4K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6#2M7s2S2Q4x3V1k6#2M7s2S2Q4x3X3c8K6N6s2g2T1N6r3!0G2L8s2x3`. upx的loader是通过这个工具生成的 (也就是你上面修改的 amd64-linux.elf-fold.h )
请教下windows环境下怎么使用这个工具呢
2023-2-8 14:33
0
雪    币: 1373
活跃值: (1749)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
18

用vmtest师傅提到的工具就可以,根据说明配置好之后,编译的时候类似amd64-linux.elf-fold.h的.h文件都会重新生成的。

最后于 2023-2-9 17:01 被luoye_ATL编辑 ,原因:
2023-2-9 16:58
0
雪    币: 109
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
19
修改入口点代码的部分,修改.h文件是不行的,或者说只修改那三个部分不行。那个长度常量后面还跟着两个校验值也会变,并且代码长度也不是固定增加5字节,具体取决于编译器生成的bin文件。生成h文件的逻辑在stub/scripts/下,主要是那给bin2h的py脚本。自行编译修改的话可以用一下
2023-3-23 14:44
1
雪    币: 109
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
20
楼主好!我在根据您的文章进行代码修改和复现过程中,发现一个问题,分享出来供参考。问题出现在修改入口点代码的loader部分。文章中loader异或key的位置在汇编码中,根据注释是将upx_main函数的返回值进行异或恢复,但我这里测试这样的操作会导致segmentation fault。我根据注释找到upx_main函数查看,可以获知入口点由前面的do_xmap函数返回,跟入该函数发现它的返回值实际上是ehdr->e_entry + reloc,而我们在加壳部分处理的代码实际上是直接对ehdr->e_entry进行处理的,由于reloc的存在导致返回值异或后会产生异常。
我重新分析了upx_main的流程,ehdr是该函数的第三个参数,推测前面的loader部分只是提取ehdr不会对其进行处理,进入upx_main后可看到ehdr被赋值给xo.buf,随后被传入unpackExtent函数处理。处理的代码我没仔细跟,因为根据函数名和其注释来看,该函数确实会对ehdr进行处理,应该是包含一些入口点相关的内容的,不能硬碰,另外我们在加壳部分的代码是位于packExtent的头部(申请内存并填充后立刻进行了入口点的异或),后续的处理逻辑应该和这个函数对应上了。所以根据前后对应的逻辑,我将异或恢复的代码放在了该函数后:
// ehdr = Uncompress Ehdr and Phdrs
    unpackExtent(&xi2, &xo, f_exp, 0); // never filtered?
    ehdr->e_entry = (ehdr->e_entry ^ 0xdeafdeaf);
然后程序就正常运行不会报错了。
因此提出一个问题,原始版本的代码实际上仅能应用于reloc为0的情况下(do_xmap函数结尾的部分),当其不为0就会导致问题,而我这里就刚刚好踩了这个坑。我这里在简单的逻辑上修复了该问题(pack前加密,unpack后解密,没有经过do_xmap的处理和影响;但这是简单的逻辑层面的,深层上仍应该严格分析packExtent和unpackExtent函数的逻辑来确定相关修改有没有影响),供各位参考
2023-3-28 17:15
2
雪    币: 1
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
21
压缩数据修改,修改这4处,运行不了,会报错。
2023-4-10 08:26
2
雪    币: 10075
活跃值: (34136)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
感谢分享
2023-4-10 09:16
1
雪    币: 109
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
23
weekend~ 压缩数据修改,修改这4处,运行不了,会报错。
你这个问题我也遇到了,答案是那个p_lx_elf里有两个同名函数,分别隶属于不同的类,用于处理不同平台下的loader(一个32位的一个64位的),你改了其中一个但实际用的是另一个就会出现这个问题,得俩都改才能保证linux下的使用没有问题
2023-4-23 18:10
0
雪    币: 1
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
24
Vantler 你这个问题我也遇到了,答案是那个p_lx_elf里有两个同名函数,分别隶属于不同的类,用于处理不同平台下的loader(一个32位的一个64位的),你改了其中一个但实际用的是另一个就会出现这个问题,得 ...
好的,我一会试试,谢谢~
2023-4-24 11:18
0
雪    币: 299
活跃值: (1384)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
为何没有修改任何文件,直接使用make(安装了camke)编译src得到的upx加壳的文件运行也会出现segmentation fault错误?
2023-5-12 08:46
0
游客
登录 | 注册 方可回帖
返回