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

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

2023-1-7 11:52
65421
收藏
免费 29
支持
分享
最新回复 (57)
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
51
luoye_ATL 用vmtest师傅提到的工具就可以,根据说明配置好之后,编译的时候类似amd64-linux.elf-fold.h的.h文件都会重新生成的。
怎么配置的呢?能详细说一下吗?
2024-11-22 10:52
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
52
DessertTH 解决了,对于大佬们来说,这确实不是个问题,我简单写一下如何解决的,给新手小白一个参考避坑。 按照楼主说的,先对4处进行修改。然后,需要先对stub进行编译,也就是在对amd64-linux.elf- ...
能压缩别的程序吗?
2024-11-22 10:55
0
雪    币: 109
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
53
amd64-linx.elf-fold.S的编译和bin2h无关。应该说这是独立的两步。第一步先是把S文件编译,得到bin文件,这个是可执行的代码,要捆绑到加壳后的程序中,在执行时被调用,解压数据。那要怎么把它捆绑进去呢?答案是第二部,用bin2h,将这个编译得到的bin文件转换成16进制码,存到一个大数组里,然后把这个数组的定义放到h文件中,编译upx的时候直接调用这个数组就等同于调用解压代码(shellcode就是这么存的)。那几个变量就是用来标记和检查这个数组数据的。如果你想编译S文件,得用前面评论里提到的那个stub工具,编译完工具就会自动调bin2h生成新的h文件。
2025-4-8 10:06
0
雪    币: 281
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
54
Vantler 楼主好!我在根据您的文章进行代码修改和复现过程中,发现一个问题,分享出来供参考。问题出现在修改入口点代码的loader部分。文章中loader异或key的位置在汇编码中,根据注释是将upx_main函 ...
分析的太有用啦,踩到了一模一样的坑,感谢分享
2025-4-10 16:43
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
55
找到amd64-linux.elf-so_main.c 文件中的 unpackExtent 函数,在函数中找到 int const j = (*f_exp)((unsigned char *)xi->buf, h.sz_cpr,   (unsigned char *)xo->buf, &out_len);在后面增加如下代码,对so进行加壳即可用,其他的按照博主的可以,本人已经在4.3版本上复现
 unsigned char *tmp=(unsigned char*)xo->buf;
            size_t i = 0;
             for(i = 0; i < h.sz_unc; i++)
            {
               *tmp=(*tmp)^0xe9;
               tmp = tmp + 1;
             }
2025-4-29 17:20
1
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
56

我也是根据楼主的文章对UPX源代码进行修改,在upx-5.0.2复现了修改函数入口点这个方案,实现了对于ELF32文件UPX加壳操作的修改。下面是我踩过的几个坑,分享出来应该对于像我一样的新手小白会比较有用。
1、不需要修改i386-linux.elf-fold.S或i386-linux.elf-fold.h。因为upxmain()内调用了do_xmap()对entry进行了重定位。返回值其实是e_entry + reloc,也就是实际加载在内存中的地址。所以我们直接对upxmain的返回值进行异或操作的话,会报段错误。(upxmain、do_xmap的实现均在i386-linux.elf-main2.c)
2、如果需要修改汇编代码的话需要安装一个stubtool工具,否则修改后的.S文件无法编译成.h文件中的二进制数组写入外壳。stubtool的使用方法可以参考这篇文章e70K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6*7M7%4W2Q4x3X3c8S2M7X3y4Z5i4K6u0W2k6$3W2@1K9s2g2T1i4K6u0W2K9h3!0Q4x3V1j5J5x3o6t1J5i4K6u0r3x3o6N6Q4x3V1j5I4y4q4)9J5c8W2)9J5y4f1f1$3i4K6t1#2z5o6W2Q4x3U0f1^5b7W2)9J5y4f1f1#2i4K6t1#2z5p5q4Q4x3U0g2m8z5q4)9J5y4f1f1%4i4K6t1#2b7V1y4Q4x3U0f1&6y4W2)9J5y4f1f1^5i4K6t1#2b7f1k6Q4x3U0f1&6x3g2g2b7h3q4)9J5y4f1f1#2i4K6t1#2b7U0W2Q4x3U0g2n7y4W2)9J5y4f1f1@1i4K6t1#2b7V1k6Q4x3U0g2m8c8g2)9J5y4f1f1$3i4K6t1#2z5e0c8Q4x3U0g2n7z5f1I4G2j5h3c8W2M7W2)9J5c8W2)9J5x3$3#2G2M7X3f1`.

还有就是stubtool的版本也需要下对,一般在/src/stub/Make file里面166行会有要求。

3、如果也是想要实现对ELF32格式的UPX魔改,UPX源代码版本尽量选择4.0以上的,因为使用3.96版本会出现不识别哈希结构这种情况。

总的来说还是要对源代码的整个框架,以及加壳后程序的执行流程有比较深入的了解。

最后于 2025-8-18 14:27 被mb_avpguwbp编辑 ,原因:
2025-8-18 14:15
0
雪    币: 200
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
57
我目前使用的是upx-5.0.2代码,使用第二种方法混淆压缩前的数据时发现非常奇怪的问题:压缩后的程序会出现段错误,经过很长时间分析后发现是压缩后的程序运行解压后运行到call __libc_start_main函数时,该 __libc_start_main的地址映射完全错误,解压后解混淆的数据完全是对的能正常运行到程序内但是plt确定的相对地址是错误的,很奇怪,src/stub/src/amd64-linux.elf-main2.c中的函数也没其他更改过
2025-9-1 17:49
0
雪    币: 154
活跃值: (1001)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
58
waylen_yan 我目前使用的是upx-5.0.2代码,使用第二种方法混淆压缩前的数据时发现非常奇怪的问题:压缩后的程序会出现段错误,经过很长时间分析后发现是压缩后的程序运行解压后运行到call __libc_star ...

同样使用upx-5.0.2代码,按照第二种思路只修改amd64-linux.elf 架构下数据压缩代码中4处代码,运行压缩后的二进制程序报段错误,请问大佬如何解决的?

最后于 2025-11-3 19:41 被倔强石头编辑 ,原因:
2025-11-3 19:41
0
游客
登录 | 注册 方可回帖
返回