作者:FloatingGuy 转载请注明出处:https://floatingguy.github.io/


测试,给 ELF 可执行文件的 特定section 加密。。。

目前需要对 某个工具做加密处理,但是没有发现公开的可以对 elf 可执行文件加壳的本地工具。于是参照网上 的文章修改了一个自己的加固工具,非常的菜-入门级的。

参考文章:
SO加固系列之理解ELF格式
SO加固系列之加壳原理及Python实现
SO加固系列之运行时解密

第一版 ELF 可执行文件加密

修改的地方

不能再用 head 中的 e_entry 和 e_shoff 保存加密段的长度和偏移信息了。因为 可执行文件的加载时会跳到这个入口地址去执行。

尝试了 head 中的几个字段发现都不能被修改。于是最快的办法就是 手动测试 偏移地址和 size ,然后在解密代码中 硬编码 偏移量和 size(这个方法很愚蠢)。

具体对 文章代码做的修改:
1.手动 修改 源码,中 【1】mAddr, 【2】size, 【3】name / maps 中的 app name/
修改 mAddr 和 size 是需要借助010 工具,对比 patch 前后的二进制文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
exp.c 文件。
static const char name[] = "被加壳 app 的名字"; //patch1
void new_init() {
//printf("[+] decrypt\n");
// getchar();
Elf32_Ehdr *elfhdr;
Elf32_Shdr *shdr;
unsigned int size, base, offset;
int n, i;
//从maps中读取elf文件在内存中的起始地址
base = GetLibAddr();
//printf("%x\n", base);
elfhdr = (Elf32_Ehdr *) base;
//获取要被解密的section的内存地址
offset = elfhdr->e_shoff + base;
// lk patch
unsigned int mAddr = 0x23b4; //patch2
offset = mAddr + base;
//section大小
size = elfhdr->e_entry;
// lk patch
size = 0x3d4; //patch3
...
}

每次修改代码都要重修 上面的几个地方

  1. 手动 修改 加固脚本 中 【1】文件名, 【2】自定义段名
    1
    2
    3
    4
    5
    6
    7
    so-encrypt.py 文件
    if __name__ == "__main__":
    df = SO("libs/armeabi-v7a/xxx") #patch1
    df.EncrySection("strings") #patch2
    df.Close()

###Todo List

内容 完成情况
1. 优化代码,提高自动化
2. 添加反调试代码