看雪论坛
发新帖
6

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

ThomasKing 2014-8-26 21:42 100040
本主题帖已收到 0 次赞赏,累计¥0.00
最新回复 (96)
xiaogangha 2015-2-27 14:39
51
在调式的时候遇到一个问题,
在shelladdress2.c中加密后在写入文件时,偏移不对,导致运行出错
//lseek(fd, info.st_value, SEEK_SET);  应该是 info.st_value-1
lseek(fd, info.st_value-1, SEEK_SET);
        if(write(fd, content, info.st_size) != info.st_size)
        {
                puts("Write modified content to .so failed");
                goto _error;
        }
6
ThomasKing 2015-2-27 22:28
52
嗯,这里处理得不是很好。 如果编译的指令为Thumb,那么st_value = addr + 1;如果为ARM,则st_value = addr。较好一点应该对指令进行判断分类处理。
Colbert仔 2015-3-3 14:17
53
TK大神你好!有个问题,Android elf壳可以不可以通过修改程序入口点来实现呢?入口地址指向解壳程序,在解壳程序的结尾跳转到init_array
6
ThomasKing 2015-3-3 19:14
54
小菜一枚,大哥不要折煞小弟了。
应该不行吧,现在的APP加固是通过SO文件来实现。 但SO文件是动态链接库,是没有入口点的吧。 加载时入口是linker。如果是一个普通可执行程序而不是APP的话,应该可以通过修改入口点来实现,就和PC平台的加壳相同了吧(个人想法,木有实践)
Colbert仔 2015-3-4 10:49
55
多谢TK大神指导!的确这个思路不行,哈哈。
1
飞火 2015-3-9 10:29
56
好文章,学习下~~
1
leonnewton 2015-3-14 14:50
57
哪位能解释下ehdr.e_entry = (length << 16) + nsize的含义么,小菜表示不懂。
shallots 2015-3-17 09:37
58
这么好的贴,学习了。
1
leonnewton 2015-3-24 21:23
59
我在源码里看到修改权限时mprotect((void *) base, 4096 * nsize, PROT_READ | PROT_EXEC | PROT_WRITE) != 0, base = getLibAddr();,但起始的地址为什么不是 text_addr = ehdr->e_shoff + base;。base不是整个so的地址?应该是text_addr 段的起始地址才对?请大神指导下。。。。。
sonnzy 2015-5-25 11:52
60
楼主写的太好了,非常感谢,但有一点不明:
为什么要通过hash表查找函数名,elf中的符号表数据大小不是固定0x10的吗,而且连续,直接遍历查找函数名就可以
Oxygenant 2015-5-27 16:02
61
支持支持,谢谢分享。。。
yuqiyi 2015-7-30 12:41
62
必须强烈支持.学到不少东西.
cainaifa 2015-7-31 13:17
63
请教下大家,shelldemo2.zip 里的shellAdder2.c我用GCC编译一直报elf.h文件未找到,这要怎么解决。
huazhou 2015-8-11 11:55
64
楼主你好,文中的“也有一些对抗dump的方法,这里就不展开了”,请问能讲讲大概思路吗。因为如果在Jni_onload之前下断的话so就已经加载进内存了,还如何对抗dump呢。请教~
CrackLife 2015-8-13 10:59
65
谢谢分享~
yaojunhap 2015-8-31 17:47
66
有渗透测试APP的工作,愿意业余时间接吗。主要是要解开.so库的逻辑。年薪30万是否有意愿加盟。
7
AJISky 2015-9-18 11:46
67
在吗?我遇到cacheflush在android 2.3刷新失败的问题,想求助下你
cszdhhz 2015-9-18 18:05
68
cacheflush(起始地址, 终止地址, 0)

MOV             R0, 起始地址
MOV             R1, 终止地址
MOV             R2, #0
MOV             R7, #0xF0002
SVC             0
7
AJISky 2015-9-18 23:30
69
你说的这个cacheflush已经做了,还是有崩溃,不过方法已经找到了,重新读取下刷新内存区就ok
DarthL 2015-10-21 19:09
70
密码已破 哇卡卡卡
MushiUta 2015-11-24 15:16
71
小菜一枚。同样是Run ShellDemo2的代码时运行到这里出错,求教各位大神是什么原因。
1
koflfy 2015-12-21 12:04
72
mark
lsniagaraI 2016-1-29 13:31
73
mark
jieniruyan 2016-2-16 15:18
74
试了下,e_type和e_machine不能改
jieniruyan 2016-2-17 15:34
75
打印一下出错信息应该是这个吧:Cannot allocate memory
下面贴子是解决方案。
http://blog.csdn.net/smileteo/article/details/39961025

不过我出错的原因是,64位机器上面跑的。。。代码里要改成Elf64_Shdr这些64位用的结构
jieniruyan 2016-2-18 11:09
76
求教.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

求教
jieniruyan 2016-2-22 09:23
77
单个函数加密代码调了半天。结果发现DT_GNU_HASH跟DT_HASH结构完全不一样,这代码在PC的linux上跑不了,都不用DT_HASH了
寻找allblue 2016-2-22 11:48
78
谢谢写的很清楚,多谢啦
2
大王叫我挖坟 2016-4-15 19:50
79
非常给力的一篇文章,写一下,关于函数加密,怎么找到函数的过程
首先遍历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进行取反操作
2
大王叫我挖坟 2016-4-15 19:54
80
谢谢写的非常好,里面包含怎么从一个so文件里面找到我们要的函数,作者你太给力了,下面省略一万个赞
2
大王叫我挖坟 2016-4-15 20:01
81
相当的给力晚上不知道吃什么好,激动中
2
大王叫我挖坟 2016-4-15 20:05
82
没有啊,我这里等于3
9332 / 4096 + (9332 % 4096 == 0 ? 0 : 1)=3
你要不要多打几个日志看看
2
大王叫我挖坟 2016-4-15 20:06
83
提的问相当的给力,回答也相当的有道理!!
2
大王叫我挖坟 2016-4-15 20:10
84
估计是手机没有root吧,这里是把base开始的第三个页的权限改成可读可写可执行,方便后面对content取反
2
大王叫我挖坟 2016-4-15 20:14
85
大神啊,怎么对整个text加密呢,是不是把text加密了,但是除了init_array不加密,把解密的函数卸载init_array里面呢,还是说在System.loadLibrary("demo");执行之前对demo.so执行解密呢,大大有空看到就麻烦教一下我拉-
步平凡 2016-4-16 00:27
86
好文章,支持~~!
2
大王叫我挖坟 2016-4-25 14:28
87
syscall(0xf0002, addr, end);
gugubupt 2016-5-12 18:30
88
楼主的第二种基于函数的加密方法我在尝试的时候总是报错。
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);
    }
7
无名侠 2016-7-1 14:25
89
e_phoff = sizeof(e_ehsize); 是否有误??
应该是 e_phoff = e_ehsize
青山化桥 2016-10-13 19:23
90
学习到啦,谢谢楼主
张李政 2016-11-4 13:02
91
Program header位于ELF header后面,Section Header位于ELF文件的尾部。那可以推出:e_phoff = sizeof(e_ehsize);
有个问题 不是除了EH 其他位置的顺序都不是固定的吗?
亡灵wl 2017-2-19 13:05
92
xiaogangha 有没有人遇到过。。程序报错 02-04 08:40:32.481: A/libc(948): Fatal signal 4 (SIGILL) at 0x4a2c13de (code=1), threa ...
怎么解决的,我也是报这个
ifnt 2017-3-10 11:46
93
大神你好 我用下载的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
聖blue 2017-3-19 02:58
94
支持!!!!!!
方振箱包 2017-3-24 09:39
95
路过
1
倔强石头 2017-4-19 11:05
96
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开始
fengwuhui 2017-7-13 16:12
97
ThomasKing 额。 不知道,求教。
你好,我在调试你这个crackME的时候,最后在Java_com_thomas_crackmeso_MainActivity_verify下断点的时候,运行起来,总是有段错误,你是有加反调试吗?
返回



©2000-2017 看雪学院 | Based on Xiuno BBS | 域名 加速乐 保护 | SSL证书 又拍云 提供 | 微信公众号:ikanxue
Time: 0.018, SQL: 15 / 京ICP备10040895号-17