-
-
[原创]开源llvm字符串加密pass
-
发表于:
2019-10-26 21:10
15909
-
最近在研究llvm,实现了个字符串加密pass,有兴趣的大佬可以试试.
相对于当前开源实现,我方案有如下改进
在未初始化数据段(bss)解密数据.ollvm yag00的实现是解密到栈上,Armariris,Hikari都是在数据段原地还原.如对字符串数组的处理
static const char * const const_string_array[] = {"aaa", "bbb", "ccc"};
我处理后
static char dec_aaa[4], dec_bbb[4], dec_ccc[4]; // 解密后的"aaa", "bbb", "ccc"
static char *dec_const_string_array[3]; // 解密后的const_string_array
static void __global_variable_initializer_const_string_array(char *dec_const_string_array[])
{
// ...
// 解密"aaa", "bbb", "ccc"到dec_aaa, dec_bbb, dec_ccc
// 开始初始化dec_const_string_array
dec_const_string_array[0] = dec_aaa;
dec_const_string_array[1] = dec_bbb;
dec_const_string_array[2] = dec_ccc;
}
对结构体数组处理类似.
类似ollvm中yag00的实现,在使用时才解密.Armariris在库构造函数里面还原,Hikari则是在函数入口.如
static void print_string(int idx)
{
if (idx >= 0 && idx < 3) {
puts(const_string_array[i]);
} else {
puts("index out of range");
}
}
我处理后
static void print_string(int idx)
{
if (idx >= 0 && idx < 3) { __global_variable_initializer_const_string_array(dec_const_string_array); //重建const_string_array
puts(dec_const_string_array[i]); //使用解密后的dec_const_string_array
} else {
// 该分支会解密"index out of range";由于没有使用const_string_array数组,不会解密const_string_array.
puts("index out of range");
}
}
项目地址goron
欢迎star,提issue,pr
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2019-10-27 11:09
被krash编辑
,原因: