能力值:
( LV2,RANK:10 )
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
求教
能力值:
( LV2,RANK:10 )
77 楼
单个函数加密代码调了半天。结果发现DT_GNU_HASH跟DT_HASH结构完全不一样,这代码在PC的linux上跑不了,都不用DT_HASH了
能力值:
( LV2,RANK:10 )
78 楼
谢谢写的很清楚,多谢啦
能力值:
( LV8,RANK:130 )
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进行取反操作
能力值:
( LV8,RANK:130 )
80 楼
谢谢写的非常好,里面包含怎么从一个so文件里面找到我们要的函数,作者你太给力了,下面省略一万个赞
能力值:
( LV8,RANK:130 )
81 楼
相当的给力晚上不知道吃什么好,激动中
能力值:
( LV8,RANK:130 )
82 楼
没有啊,我这里等于3
9332 / 4096 + (9332 % 4096 == 0 ? 0 : 1)=3
你要不要多打几个日志看看
能力值:
( LV8,RANK:130 )
83 楼
提的问相当的给力,回答也相当的有道理!!
能力值:
( LV8,RANK:130 )
84 楼
估计是手机没有root吧,这里是把base开始的第三个页的权限改成可读可写可执行,方便后面对content取反
能力值:
( LV8,RANK:130 )
85 楼
大神啊,怎么对整个text加密呢,是不是把text加密了,但是除了init_array不加密,把解密的函数卸载init_array里面呢,还是说在System.loadLibrary("demo");执行之前对demo.so执行解密呢,大大有空看到就麻烦教一下我拉-
能力值:
( LV3,RANK:20 )
86 楼
好文章,支持~~!
能力值:
( LV8,RANK:130 )
87 楼
syscall(0xf0002, addr, end);
能力值:
( LV2,RANK:10 )
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);
}
能力值:
( LV17,RANK:797 )
89 楼
e_phoff = sizeof(e_ehsize); 是否有误??
应该是 e_phoff = e_ehsize
能力值:
( LV2,RANK:10 )
90 楼
学习到啦,谢谢楼主
能力值:
( LV2,RANK:10 )
91 楼
Program header位于ELF header后面,Section Header位于ELF文件的尾部。那可以推出:e_phoff = sizeof(e_ehsize);
有个问题 不是除了EH 其他位置的顺序都不是固定的吗?
能力值:
( LV2,RANK:10 )
92 楼
xiaogangha 有没有人遇到过。。程序报错 02-04 08:40:32.481: A/libc(948): Fatal signal 4 (SIGILL) at 0x4a2c13de (code=1), threa ... 怎么解决的,我也是报这个
能力值:
( LV2,RANK:10 )
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
能力值:
( LV2,RANK:10 )
94 楼
支持!!!!!!
能力值:
(RANK:10 )
95 楼
路过
能力值:
( LV5,RANK:70 )
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开始
能力值:
(RANK:10 )
97 楼
ThomasKing
额。 不知道,求教。
你好,我在调试你这个crackME的时候,最后在Java_com_thomas_crackmeso_MainActivity_verify下断点的时候,运行起来,总是有段错误,你是有加反调试吗?
能力值:
( LV2,RANK:10 )
98 楼
用这里描述的方法,加密自己从apk里面加压出来的lib\armeabi\libnative-lib.so的函数checkSignature,发现找不到函数。 请各大神赐教!非常感谢! 这里有问题的描述,有分送哦:http://ask.csdn.net/questions/660217
能力值:
( LV2,RANK:10 )
99 楼
不错!!!!!!!!
能力值:
( LV2,RANK:10 )
100 楼
Colbert仔
整个ELF文件大小 = e_shoff + e_shnum * sizeof(e_shentsize) + 1
应该为
整个ELF文件大小 = e_shoff + e_shnum * size ...
我自己试了一下怎么是e_shoff + e_shnum * sizeof(e_shentsize)