首页
社区
课程
招聘
关于so注入不能读取到入口函数地址的问题
发表于: 2017-2-23 14:33 5462

关于so注入不能读取到入口函数地址的问题

2017-2-23 14:33
5462

之前在so注入的时候,能够得到入口函数的地址,使用的代码时Qever大牛的,后来在测试了代码的时候,出现了如下的问题:

root@android:/data/local/tmp # ll

-rwxrwxrwx root     root       506668 2016-03-18 03:01 aapt

-rwxrwxrwx root     root        13716 2016-03-18 03:01 box

-rwxrwxrwx root     root        13572 2017-02-15 05:37 inject

-rwxrwxrwx root     root        13452 2017-02-15 05:37 libqever.so

-rwxrwxrwx root     root         8708 2016-03-18 03:01 mtools

root@android:/data/local/tmp # chmod 777 inject

root@android:/data/local/tmp # ./inject

Usage:

    ./inject [lib] [entry] [target]

        lib        the lib(*.so) to be injected

                default is "/data/local/tmp/libqever.so"

        entry    the entry of lib

                default is "entry"

        target    the target process to be injected, pid or name

                default is "com.crackme"

root@android:/data/local/tmp # ./inject  com.crackme

[E]Can't find the process com.crackme

255|root@android:/data/local/tmp # ./inject  com.crackme

library path = com.crackme

以上是启动注入模块。在启动之前,我先启动了apk,之后调用了./inject 但是得到了如下的提示


130|root@android:/ # logcat  |grep "INJECT"

D/INJECT  (  940): [+] Injecting process: 922

D/INJECT  (  940): [+] get_remote_addr: local[40020000], remote[40020000]

D/INJECT  (  940): [+] Remote mmap address: 4003bf43

D/INJECT  (  940): [+] Calling mmap in target process.

D/INJECT  (  940): [+] Target process returned from mmap, return value=5230c000, pc=0

D/INJECT  (  940): [+] get_remote_addr: local[40000000], remote[40000000]

D/INJECT  (  940): [+] get_remote_addr: local[40000000], remote[40000000]

D/INJECT  (  940): [+] get_remote_addr: local[40000000], remote[40000000]

D/INJECT  (  940): [+] get_remote_addr: local[40000000], remote[40000000]

D/INJECT  (  940): [+] Get imports: dlopen: 400050ad, dlsym: 40005019, dlclose: 40004f59, dlerror: 40004f49

D/INJECT  (  940): [+] Calling dlopen in target process.

D/INJECT  (  940): [+] Target process returned from dlopen, return value=0, pc=0

D/INJECT  (  940): [+] Calling dlsym in target process.

D/INJECT  (  940): [+] Target process returned from dlsym, return value=0, pc=0

D/INJECT  (  940): hook_entry_addr = 0x0

D/INJECT  (  940): [+] Calling hook_entry in target process.

D/INJECT  (  940): [+] Target process returned from hook_entry, return value=5230c200, pc=0

D/INJECT  (  940): [+] Calling dlclose in target process.

D/INJECT  (  940): [+] Target process returned from dlclose, return value=0, pc=0


这里的hook_entry_addr =0x0,也就是说,虽然注入了,但是没拿到对应的入口函数,注入程序如下:

#define DEFAULT_LIBS "/data/local/tmp/libqever.so"

#define DEFAULT_ENTRY "entry" 这里是加载的libqever.so中的入口函数名称,

#define DEFAULT_TARGET "com.crackme"

void Usage(char * prog)

{

    printf("Usage:\n");

    printf("    %s [lib] [entry] [target]\n", prog);

    printf("        lib        the lib(*.so) to be injected\n");

    printf("                default is \"%s\"\n", DEFAULT_LIBS);

    printf("        entry    the entry of lib\n");

    printf("                default is \"%s\"\n", DEFAULT_ENTRY);

    printf("        target    the target process to be injected, pid or name\n");

    printf("                default is \"%s\"\n", DEFAULT_TARGET);

}

int main(int argc, char** argv) {

    char * libs = DEFAULT_LIBS;

    char * entry = DEFAULT_ENTRY;

    char * target = DEFAULT_TARGET;

    pid_t target_pid = 0;

    switch(argc){

        case 1:

            Usage(argv[0]);

            return 0;

        case 4:

            target_pid = atoi(argv[3]);

            if(target_pid == 0){

                target = argv[3];

            }

        case 3:

            entry = argv[2];

        case 2:

            libs = argv[1];

    }

    if(target_pid == 0){

        target_pid = find_pid_of(target);

    }

    if (-1 == target_pid) {  

        printf("[E]Can't find the process %s\n", target);  

        return -1;  

    }  

    //这里是主要注入的方法

    inject_remote_process(target_pid, libs, entry,  "I'm parameter!", strlen("I'm parameter!"));    

    return 0;  

}    


试了好几次,还是不能拿到入口函数的地址,希望得到指点一下,谢谢~



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
2
EXM~Qever是我么?啥代码?我很少发代码吧~~#无辜脸
2017-2-23 16:28
0
雪    币: 210
活跃值: (651)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
4
QEver EXM~Qever是我么?啥代码?我很少发代码吧~~#无辜脸
好吧,代码时从你的附件中拿的,我找了往年的apk    crackme的帖子,就看到你发的,不过,大牛来了,给我指点下吧,感激
2017-2-23 17:27
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
5
Loopher 好吧,代码时从你的附件中拿的,我找了往年的apk crackme的帖子,就看到你发的,不过,大牛来了,给我指点下吧,感激
虽然代码看着确实眼熟,但是我早就忘了这是什么鬼了,你至少也要告诉我代码在哪里吧。
从已知的情况来看,可能是因为导出符号的问题。用readelf查看一下libqever.so的导出函数里面有没有"entry"
2017-2-23 18:34
0
雪    币: 210
活跃值: (651)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
6
QEver 虽然代码看着确实眼熟,但是我早就忘了这是什么鬼了,你至少也要告诉我代码在哪里吧。 从已知的情况来看,可能是因为导出符号的问题。用readelf查看一下libqever.so的导出函数里面有没有&qu ...
31: 00001741 44 FUNC GLOBAL DEFAULT 8 new_entry 32: 00000000 0 FUNC GLOBAL DEFAULT UND sleep 33: 0000176d 48 FUNC GLOBAL DEFAULT 8 entry 是这个,我之前也看了,有这个符号,那个帖子的地址: http://bbs.pediy.com/showthread.php?t=194080 ,我用的是模拟器,我觉得还是没找到什么原因去解释,还希望大牛看到,能指点下,谢谢
2017-2-24 15:45
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
7
Loopher 31: 00001741 44 FUNC GLOBAL DEFAULT 8 new_entry 32: 00000000 0 FUNC GLOBAL DEFA ...

很久没看到这么工整的代码了,还是自己写的~[em_28]。
看log是dlopen的时候失败了,注意一下libs的内容,也就是libqever.so文件路径,默认的是"/data/local/tmp/libqever.so",可以通过参数修改。仔细确认一下so文件路径是否正确。必要的时候在inject.c里面的

    if (ptrace_call_wrapper(target_pid, "dlopen", dlopen_addr, parameters, 2, &regs) == -1)    
        goto exit;

这句前后加一些LOG辅助判断一下情况。

有一行

printf("library path = %s\n", library_path);

改成

DEBUG_PRINT("library path = %s\n", library_path);

也可以看到加载的so路径是否正确。


如果确认so路径没问题,就在dlopen之后调用dlerror看看失败原因。代码自己动手补吧~

2017-2-24 20:15
0
雪    币: 210
活跃值: (651)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
8
QEver 很久没看到这么工整的代码了,还是自己写的~[em_28]。看log是dlopen的时候失败了,注意一下libs的内容,也就是libqever.so文件路径,默认的是"/data/lo ...
好的,感谢指导
2017-2-25 09:16
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
QEver 很久没看到这么工整的代码了,还是自己写的~[em_28]。看log是dlopen的时候失败了,注意一下libs的内容,也就是libqever.so文件路径,默认的是"/data/lo ...
大牛。请问有没有实用的虚拟定位软件?能对GPS.基站这些进行真实性的虚拟定位的?
2017-3-4 00:24
0
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
He凌zZzZ 大牛。请问有没有实用的虚拟定位软件?能对GPS.基站这些进行真实性的虚拟定位的?
自己写一个,只要明白原理,也不难。
2017-3-4 01:27
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
你的so 是arm的还是 x86的?
2017-3-18 14:44
0
雪    币: 163
活跃值: (509)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我也遇到这个问题了  ,用的模拟器  x86的so会出现这个问题,arm的so在真机器上  执行正常 
2017-7-13 21:32
0
雪    币: 210
活跃值: (651)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
13
刘lhhh 我也遇到这个问题了 ,用的模拟器 x86的so会出现这个问题,arm的so在真机器上 执行正常
我记得不支持x86的,只支持arm的
2017-7-15 18:35
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
通遇到这样的问题,在模拟器上  好像都没找到解决的。
2017-7-21 16:35
0
游客
登录 | 注册 方可回帖
返回
//