首页
社区
课程
招聘
[原创]简单粗暴的so加解密实现
2014-8-26 21:42 162967

[原创]简单粗暴的so加解密实现

2014-8-26 21:42
162967
收藏
点赞14
打赏
分享
最新回复 (116)
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jieniruyan 2016-2-18 11:09
76
0
求教.text整体加密怎么实现的?main()函数前loader的流程是:
loader
  |  
preinitarray   main()
  |
_start
  |
__libc_start_main
  |
__libc_csu_init
  |            
_init       initarray
  |
__gmon_start__  frame_dummy  _do_global_ctors_arx
  |
  constructor

像__libc_start_main,frame_dummy都是在.text段里的,上面的解密代码是放到constructor里面,所以lz的这种方式肯定不行。

想过把解密放到.preinit_array里面,但so不能用。

/tmp/cc4FLmj3.s:51: Warning: setting incorrect section attributes for .preinit_array
/usr/bin/ld: /tmp/ccUg8wkx.o: .preinit_array section is not allowed in DSO

求教
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jieniruyan 2016-2-22 09:23
77
0
单个函数加密代码调了半天。结果发现DT_GNU_HASH跟DT_HASH结构完全不一样,这代码在PC的linux上跑不了,都不用DT_HASH了
雪    币: 44
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
寻找allblue 2016-2-22 11:48
78
0
谢谢写的很清楚,多谢啦
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
大王叫我挖坟 3 2016-4-15 19:50
79
0
非常给力的一篇文章,写一下,关于函数加密,怎么找到函数的过程
首先遍历progame,发现有7个段,遍历类型当为phdr.p_type ==  PT_DYNAMIC时候,就转到偏移处0x2e80,大小为0x100

从0x2e80处读sizeof(Elf32_Dyn)=8个字节
循环0x100/8=20次
分别找到
dyn.d_tag == DT_SYMTAB
dyn.d_un.d_ptr为dyn_symtab地址0x114
dyn.d_tag == DT_STRSZ为dynstr段的大小
dyn.d_tag == DT_HASH为
dyn.d_un.d_ptr为hash段地址 ,0xb7c

从hash得到funcindex,然后用dyn_symtab + funIndex * sizeof(Elf32_Sym)找到我们要加密的函数名的(Elf32_Sym结构,其中(Elf32_Sym)+st_name
typedef struct elf32_sym{
  Elf32_Word    st_name;
  Elf32_Addr    st_value;
  Elf32_Word    st_size;
  unsigned char    st_info;
  unsigned char    st_other;
  Elf32_Half    st_shndx;
} Elf32_Sym;

funIndex是用funHash % nbucket*4+hash段的首地址=29*4+hash段的首地址=29*4+0xb7c=0xBF0处存放的4个字节=75
nbucket为hash段的第一个四字节处

dyn_symtab存放首地址///[ 1] .dynsym           DYNSYM          00000114 000114 0004c0
dyn_symtab + funIndex * sizeof(Elf32_Sym)=0x114+75*16=0x5c4处存放着字符串 Java_com_example_shelldemo2_MainActivity_getString ,然后对他st_info进行取反操作
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
大王叫我挖坟 3 2016-4-15 19:54
80
0
谢谢写的非常好,里面包含怎么从一个so文件里面找到我们要的函数,作者你太给力了,下面省略一万个赞
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
大王叫我挖坟 3 2016-4-15 20:01
81
0
相当的给力晚上不知道吃什么好,激动中
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
大王叫我挖坟 3 2016-4-15 20:05
82
0
没有啊,我这里等于3
9332 / 4096 + (9332 % 4096 == 0 ? 0 : 1)=3
你要不要多打几个日志看看
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
大王叫我挖坟 3 2016-4-15 20:06
83
0
提的问相当的给力,回答也相当的有道理!!
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
大王叫我挖坟 3 2016-4-15 20:10
84
0
估计是手机没有root吧,这里是把base开始的第三个页的权限改成可读可写可执行,方便后面对content取反
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
大王叫我挖坟 3 2016-4-15 20:14
85
0
大神啊,怎么对整个text加密呢,是不是把text加密了,但是除了init_array不加密,把解密的函数卸载init_array里面呢,还是说在System.loadLibrary("demo");执行之前对demo.so执行解密呢,大大有空看到就麻烦教一下我拉-
雪    币: 34
活跃值: (45)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
步平凡 2016-4-16 00:27
86
0
好文章,支持~~!
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
大王叫我挖坟 3 2016-4-25 14:28
87
0
syscall(0xf0002, addr, end);
雪    币: 93
活跃值: (136)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gugubupt 2016-5-12 18:30
88
0
楼主的第二种基于函数的加密方法我在尝试的时候总是报错。
A/libc: Fatal signal 11 (SIGSEGV) at 0x7196f000 (code=2), thread 28996
这种说是数组越界或者野指针的问题,我照着楼主的方法写的啊。
出现问题的代码是解密部分。有人有一样的问题吗?
for(i=0;i< info.st_size - 1; i++){
        char *addr = (char*)(base + info.st_value -1 + i);
        *addr = ~(*addr);
    }
雪    币: 6503
活跃值: (8345)
能力值: ( LV17,RANK:787 )
在线值:
发帖
回帖
粉丝
无名侠 12 2016-7-1 14:25
89
0
e_phoff = sizeof(e_ehsize); 是否有误??
应该是 e_phoff = e_ehsize
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
青山化桥 2016-10-13 19:23
90
0
学习到啦,谢谢楼主
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
张李政 2016-11-4 13:02
91
0
Program header位于ELF header后面,Section Header位于ELF文件的尾部。那可以推出:e_phoff = sizeof(e_ehsize);
有个问题 不是除了EH 其他位置的顺序都不是固定的吗?
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
亡灵wl 2017-2-19 13:05
92
0



xiaogangha

有没有人遇到过。。程序报错
02-04 08:40:32.481: A/libc(948): Fatal signal 4 (SIGILL) at 0x4a2c13de (code=1), threa ...
怎么解决的,我也是报这个
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ifnt 2017-3-10 11:46
93
0
大神你好 我用下载的demo在google pixel android7.1.1上报错 java.lang.UnsatisfiedLinkError: dlopen failed: "/data/app/com.thomas.crackmeso-1/lib/arm/libverify.so" has invalid shdr offset/size: 12632/2160
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
聖blue 2017-3-19 02:58
94
0
支持!!!!!!
雪    币: 2
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
方振箱包 2017-3-24 09:39
95
0
路过
雪    币: 154
活跃值: (570)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
倔强石头 1 2017-4-19 11:05
96
0
Colbert仔 整个ELF文件大小 = e_shoff + e_shnum * sizeof(e_shentsize) + 1 应该为 整个ELF文件大小 = e_shoff + e_shnum * size ...

整个ELF文件大小  =  e_shoff  +  e_shnum  *  sizeof(e_shentsize)  +  1
应该为
整个ELF文件大小  =  e_shoff  +  e_shnum  *e_shentsize  ,地址从0开始
雪    币: 3
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
fengwuhui 2017-7-13 16:12
97
0
ThomasKing 额。 不知道,求教。
你好,我在调试你这个crackME的时候,最后在Java_com_thomas_crackmeso_MainActivity_verify下断点的时候,运行起来,总是有段错误,你是有加反调试吗?
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
刘毅liuyi 2017-9-29 15:27
98
0
用这里描述的方法,加密自己从apk里面加压出来的lib\armeabi\libnative-lib.so的函数checkSignature,发现找不到函数。
请各大神赐教!非常感谢!
这里有问题的描述,有分送哦:http://ask.csdn.net/questions/660217
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
聖blue 2017-9-29 19:59
99
0
不错!!!!!!!!
雪    币: 237
活跃值: (68)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wulameng 2018-3-16 17:11
100
0
Colbert仔 整个ELF文件大小 = e_shoff + e_shnum * sizeof(e_shentsize) + 1 应该为 整个ELF文件大小 = e_shoff + e_shnum * size ...
我自己试了一下怎么是e_shoff  +  e_shnum  *  sizeof(e_shentsize) 
游客
登录 | 注册 方可回帖
返回