元始天尊 发表于 2016-5-6 13:09:15

如何遍历linux程序的so模块

借助linker.h中定义的soinfo结构


        soinfo* si = (soinfo*)dlopen("libdl.so",3);
        while(si)
        {
                printf("ptr=%08x name=%s entry=%08x base=%08x size=%08x\n",si,si->name,si->entry,si->base,si->size);
                int i;
                for(i=0;i<si->preinit_array_count;i++)
                {
                        printf("preinit_array:%08x\n",si->preinit_array);
                }
                for(i=0;i<si->init_array_count;i++)
                {
                        printf("init_array:%08x\n",si->init_array);
                }
                for(i=0;i<si->fini_array_count;i++)
                {
                        printf("fini_array:%08x\n",si->fini_array);
                }
                printf("init_func:%08x,fini_func:%08x\n",si->init_func,si->fini_func);
                si = si->next;
        }

ptr=b6fdc0a8 name=libdl.so entry=00000000 base=00000000 size=00000000
init_func:00000000,fini_func:00000000
ptr=b6fc8004 name=./test entry=b6fde704 base=b6fde000 size=00005000
preinit_array:ffffffff
preinit_array:00000000
init_array:ffffffff
init_array:00000000
init_array:ffffffff
init_array:00000000
fini_array:ffffffff
fini_array:00000000
init_func:b6f56140,fini_func:00000000
ptr=b6fc8128 name=libNimsWrap.so entry=00000000 base=b6fc3000 size=00004000
init_array:b6fc3881
fini_array:b6fc3824
init_func:00000000,fini_func:00000000
ptr=b6fc824c name=libc.so entry=00000000 base=b6f68000 size=0005b000
init_array:b6f76471
init_array:b6f7abc9
init_array:b6f7abdd
init_array:b6f7b585
init_array:b6f7b6bd
init_array:b6f8d675
fini_array:b6f771b9
init_func:00000000,fini_func:00000000
ptr=b6fc8370 name=libcutils.so entry=00000000 base=b6f5d000 size=0000b000
fini_array:b6f6038c
init_func:00000000,fini_func:00000000
ptr=b6fc8494 name=libAndroidBootstrap0.so entry=00000000 base=b6f55000 size=00008000
init_array:b6f56ac4
init_array:00000000
fini_array:b6f585f4
fini_array:00000000
init_func:00000000,fini_func:00000000
ptr=b6fc85b8 name=libstdc++.so entry=00000000 base=b6f52000 size=00003000
fini_array:b6f52828
init_func:00000000,fini_func:00000000
ptr=b6fc86dc name=libm.so entry=00000000 base=b6f37000 size=0001b000
fini_array:b6f39940
init_func:00000000,fini_func:00000000
ptr=b6fc8800 name=liblog.so entry=00000000 base=b6f12000 size=00005000
fini_array:b6f12f50
init_func:00000000,fini_func:00000000
ptr=b6fc8924 name=libAndroidLoader.so entry=00000000 base=b6f0d000 size=00005000
init_array:00000000
fini_array:b6f0e16c
fini_array:00000000
init_func:00000000,fini_func:00000000
ptr=b6fc8a48 name=libsubstrate.so entry=00000000 base=b6f07000 size=00006000
init_array:00000000
fini_array:b6f09244
fini_array:00000000
init_func:00000000,fini_func:00000000
soinfo是个链表结构,从打印的信息来看,是从高地址到低地址排序的,因此要打开一个未加载的so,自然排在高地址位置,因此往后遍历即可

元始天尊 发表于 2016-5-6 14:05:17

本帖最后由 元始天尊 于 2016-5-6 19:45 编辑


懂得自己知道有什么用!

substrate apk创建的链接:
libsubstrate-dvm.so -> /data/data/com.saurik.substrate/lib/libsubstrate-dvm.so
libsubstrate.so -> /data/data/com.saurik.substrate/lib/libsubstrate.so
liblog!.so -> /system/lib/liblog.so
liblog.so -> /data/data/com.saurik.substrate/lib/libAndroidBootstrap0.so

规则文件:/data/data/com.saurik.substrate/permitted.list
libAndroidBootstrap0:伪装为liblog.so,根据规则加载libAndroidLoader
export:
        android log函数
import:
dlopen:
        /data/data/com.saurik.substrate/lib/libAndroidLoader.so -> MSLoadExtensions
               
libAndroidLoader:
export:
        MSLoadExtensions
import:
        MSGetImageByName
dlopen:
        *.cy.so
        libAndroidCydia.cy.so
        libDalvikLoader.cy.so
       
libAndroidCydia.cy:根据规则做java层hook
export:
import:
        MSJavaHookMethod
        MSJavaBlessClassLoader
        MSJavaHookClassLoad
dlopen:

libDalvikLoader.cy:
export:
import:
        MSJavaHookClassLoad
        MSDecodeIndirectReference
        MSJavaHookMethod
        MSGetImageByName
        MSFindSymbol
        MSHookFunction
        MSCloseFunction
        MSJavaHookBridge
        MSJavaBlessClassLoader
dlopen:

libsubstrate:
export:
        MSFindSymbol
        MSGetImageByName
        MSCloseFunction
        MSDebug
        MSHookFunction

libsubstrate-dvm:        获取libdvm中c层对于java层的操作
export:
        MSDecodeIndirectReference
        MSJavaHookClassLoad
        MSJavaHookBridge
        MSJavaHookMethod
        MSJavaCreateObjectKey
        MSJavaReleaseObjectKey
        MSJavaGetObjectKey
        MSJavaSetObjectKey
        MSJavaBlessClassLoader
import:
        MSCloseFunction
        MSGetImageByName
        MSFindSymbol
        MSHookFunction
        MSDebug
页: [1]
查看完整版本: 如何遍历linux程序的so模块