能力值:
(RANK:10 )
|
-
-
2 楼
。。。。。。。。。。。。。。。。。。。。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
静态解析elf找plt表项里对应的函数即可
|
能力值:
(RANK:10 )
|
-
-
4 楼
谢谢,大大
|
能力值:
( LV9,RANK:180 )
|
-
-
6 楼
gettpid在c库里面,用你的代码解析libc.so应该就可以获取到.
|
能力值:
(RANK:10 )
|
-
-
7 楼
- - 还是 谢谢你
|
能力值:
( LV12,RANK:345 )
|
-
-
8 楼
哎,真不想喷你,看你写的那么兴起,动不动就要写什么加壳器,连系统函数地址都不知道怎么找,先去学学什么叫加载器吧,另外不要动不动就提vmp,代码加解密跟vmp是一个概念吗,不说了
|
能力值:
(RANK:10 )
|
-
-
10 楼
不能直接 BL 跳转 静态偏移地址,否则程序启动地址肯定不对,动态地址应该是 Lib模块基地址 + 静态偏移地址 肯定不对。
|
能力值:
(RANK:10 )
|
-
-
11 楼
大大息怒。。。。我新上手的,比较陌生,慧根低,无法实现Vmp,但是Vmp的代码标记 我模仿了,可以让用户通过我给的内联汇编 标记任何一段代码的始末。。。。从而实现加密解密做准备。
|
能力值:
(RANK:10 )
|
-
-
12 楼
大大终于出现了。。。。我是带着项目 提问题,学习效果好,目标明确。。。。不盲目学习。。。希望大大指点迷津。。。
|
能力值:
(RANK:10 )
|
-
-
14 楼
本人觉得挺大的,这个就是 静态用 arm汇编 DIY 安卓Elf文件,包括游戏的So文件。
做病毒感染 , 做游戏外挂补丁, 做后门补丁 做加壳, 都是必备的啊
这个技术不会还 怎么DIY ELF,还怎么 在安卓移动市场里面驰骋沙场。。。。。得这个技术得安卓移动安全的天下,我可以直接这样说。。。。
因为 目前我们面对的都是 不开源的SO 文件。。。。。。加壳的话不能像韩国人一样说,要求把SO源码给他们,然后他们给你加壳吧。。。。SO源码是一个科技公司的核心知识产品,怎么能随便开源给安全公司去加壳呢? 所以必须静态的给成品SO加壳。。。。
|
能力值:
(RANK:10 )
|
-
-
16 楼
有本事来拖。。。。我后期DIY 会把功能做强
|
能力值:
(RANK:10 )
|
-
-
18 楼
为了获取模块So基础地址,我用汇编实现了,不用系统函数getpid,但是修改代码段的内存属性,必须用mprotect吗?快成功了。。。。就缺 修改内存属性了。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
svc,再说论坛上也有写shellcode的精华文章,年轻真好!
|
能力值:
(RANK:10 )
|
-
-
20 楼
我也不年轻了,希望大家支持我!
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
你是卡在获取外部so的函数地址了吗?这样的话可以解析maps文件找到so的基址,然后根据函数名找到目的进程函数地址。可以参考下下面的代码:
void* get_remote_address(pid_t pid, void *local_addr) {
char buf[256];
void* local_start = 0;
void* local_end = 0;
void* remote_start = 0;
void* remote_end = 0;
if(find_module_info_by_address(-1, local_addr, buf, &local_start, &local_end) < 0) {
LOGI("[-] find_module_info_by_address FAIL");
return NULL;
}
LOGI("[+] the local module is %s", buf);
if(find_module_info_by_name(pid, buf, &remote_start, &remote_end) < 0) {
LOGI("[-] find_module_info_by_name FAIL");
return NULL;
}
return (void *)( (uint32_t)local_addr + (uint32_t)remote_start - (uint32_t)local_start );
}
int find_module_info_by_address(pid_t pid, void* addr, char *module, void** start, void** end) {
char statline[1024];
FILE *fp;
char *address, *proms, *ptr, *p;
if ( pid < 0 ) {
/* self process */
snprintf( statline, sizeof(statline), "/proc/self/maps");
} else {
snprintf( statline, sizeof(statline), "/proc/%d/maps", pid );
}
fp = fopen( statline, "r" );
if ( fp != NULL ) {
while ( fgets( statline, sizeof(statline), fp ) ) {
ptr = statline;
address = nexttok(&ptr); // skip address
proms = nexttok(&ptr); // skip proms
nexttok(&ptr); // skip offset
nexttok(&ptr); // skip dev
nexttok(&ptr); // skip inode
while(*ptr != '\0') {
if(*ptr == ' ')
ptr++;
else
break;
}
p = ptr;
while(*p != '\0') {
if(*p == '\n')
*p = '\0';
p++;
}
// 4016a000-4016b000
if(strlen(address) == 17) {
address[8] = '\0';
*start = (void*)strtoul(address, NULL, 16);
*end = (void*)strtoul(address+9, NULL, 16);
// printf("[%p-%p] %s | %p\n", *start, *end, ptr, addr);
if(addr > *start && addr < *end) {
strcpy(module, ptr);
fclose( fp ) ;
return 0;
}
}
}
fclose( fp ) ;
}
return -1;
}
int find_module_info_by_name(pid_t pid, const char *module, void** start, void** end) {
char statline[1024];
FILE *fp;
char *address, *proms, *ptr, *p;
if ( pid < 0 ) {
/* self process */
snprintf( statline, sizeof(statline), "/proc/self/maps");
} else {
snprintf( statline, sizeof(statline), "/proc/%d/maps", pid );
}
fp = fopen( statline, "r" );
if ( fp != NULL ) {
while ( fgets( statline, sizeof(statline), fp ) ) {
ptr = statline;
address = nexttok(&ptr); // skip address
proms = nexttok(&ptr); // skip proms
nexttok(&ptr); // skip offset
nexttok(&ptr); // skip dev
nexttok(&ptr); // skip inode
while(*ptr != '\0') {
if(*ptr == ' ')
ptr++;
else
break;
}
p = ptr;
while(*p != '\0') {
if(*p == '\n')
*p = '\0';
p++;
}
// 4016a000-4016b000
if(strlen(address) == 17) {
address[8] = '\0';
*start = (void*)strtoul(address, NULL, 16);
*end = (void*)strtoul(address+9, NULL, 16);
// printf("[%p-%p] %s | %p\n", *start, *end, ptr, addr);
if(strncmp(module, ptr, strlen(module)) == 0) {
fclose( fp ) ;
return 0;
}
}
}
fclose( fp ) ;
}
return -1;
}
|
能力值:
(RANK:10 )
|
-
-
22 楼
[QUOTE=Zkeleven;1424953]你是卡在获取外部so的函数地址了吗?这样的话可以解析maps文件找到so的基址,然后根据函数名找到目的进程函数地址。可以参考下下面的代码:
void* get_remote_address(pid_t pid, void *local_addr) {
char buf[256];
void* l...[/QUOTE]
感谢下解答,我现在是要实现 mprotect这个函数。。。。。
类似下面通过函数序号调用。。。
asm volatile(
"mov $0x18,%%eax\n\t"
"int $0x80\n\t"
"mov %%eax,%0\n\t"
:"=m"(uid)
);
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
前面提过了,svc,libc.so有你想要的
|
能力值:
(RANK:10 )
|
-
-
24 楼
谢谢大大 大大威武 我这就去研究。。。
|
能力值:
(RANK:10 )
|
-
-
25 楼
ThomasKing 大大 有一篇文章提到 无源码加密SO ,可惜用了3方SO。。。我今天要实现的 纯汇编静态插入客户的SO实现加密。希望大大指点迷津。。。
|