看雪论坛
发新帖

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

Loopher 2017-2-23 14:33 579

之前在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;  

}    


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


最新回复 (9)
5
QEver 2017-2-23 16:28
2
EXM~Qever是我么?啥代码?我很少发代码吧~~#无辜脸
Loopher 2017-2-23 17:27
4
QEver EXM~Qever是我么?啥代码?我很少发代码吧~~#无辜脸
好吧,代码时从你的附件中拿的,我找了往年的apk    crackme的帖子,就看到你发的,不过,大牛来了,给我指点下吧,感激
5
QEver 2017-2-23 18:34
5
Loopher 好吧,代码时从你的附件中拿的,我找了往年的apk crackme的帖子,就看到你发的,不过,大牛来了,给我指点下吧,感激
虽然代码看着确实眼熟,但是我早就忘了这是什么鬼了,你至少也要告诉我代码在哪里吧。
从已知的情况来看,可能是因为导出符号的问题。用readelf查看一下libqever.so的导出函数里面有没有"entry"
Loopher 2017-2-24 15:45
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 ,我用的是模拟器,我觉得还是没找到什么原因去解释,还希望大牛看到,能指点下,谢谢
5
QEver 2017-2-24 20:15
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看看失败原因。代码自己动手补吧~

Loopher 2017-2-25 09:16
8
QEver 很久没看到这么工整的代码了,还是自己写的~[em_28]。看log是dlopen的时候失败了,注意一下libs的内容,也就是libqever.so文件路径,默认的是"/data/lo ...
好的,感谢指导
He凌zZzZ 2017-3-4 00:24
9
QEver 很久没看到这么工整的代码了,还是自己写的~[em_28]。看log是dlopen的时候失败了,注意一下libs的内容,也就是libqever.so文件路径,默认的是"/data/lo ...
大牛。请问有没有实用的虚拟定位软件?能对GPS.基站这些进行真实性的虚拟定位的?
无边 2017-3-4 01:27
10
He凌zZzZ 大牛。请问有没有实用的虚拟定位软件?能对GPS.基站这些进行真实性的虚拟定位的?
自己写一个,只要明白原理,也不难。
hakfly 2017-3-18 14:44
11
你的so 是arm的还是 x86的?
返回



©2000-2017 看雪学院 | Based on Xiuno BBS | 知道创宇带宽支持 | 微信公众号:ikanxue
Time: 0.010, SQL: 8 / 京ICP备10040895号-17