首页
社区
课程
招聘
[原创]四.Android ELF系列:实现一些小功能(模块操作,dump so)
发表于: 2019-2-24 16:14 8233

[原创]四.Android ELF系列:实现一些小功能(模块操作,dump so)

2019-2-24 16:14
8233

我们都知道soinfo信息都会有指向下一个soinfo的信息.通过这个单向链表我们就可以定位所有的so文件.

那么要定位所有的so文件,首先要找到链表的第一个.

其实非常简单就是somain.

获取somain也非常简单,调用dlopen时name传入null即可.

代码如下:

#define LOGD(...) android_log_print(ANDROID_LOG_DEBUG, TAG, VA_ARGS__)

#define SOINFO_NAME_LEN 128

typedef void (*linker_function_t)();

struct link_map_t {
uintptr_t l_addr;
char l_name;
uintptr_t l_ld;
link_map_t
l_next;
link_map_t* l_prev;
};

struct soinfo {
public:
char name[SOINFO_NAME_LEN];
const Elf32_Phdr* phdr;
size_t phnum;
Elf32_Addr entry;
Elf32_Addr base;
unsigned size;

#if defined(ANDROID_ARM_LINKER)
// ARM EABI section used for stack unwinding.
unsigned* ARM_exidx;
size_t ARM_exidx_count;

#elif defined(ANDROID_MIPS_LINKER)
unsigned mips_symtabno;
unsigned mips_local_gotno;
unsigned mips_gotsym;

#endif

private:
void CallArray(const char array_name, linker_function_t functions, size_t count, bool reverse);
void CallFunction(const char* function_name, linker_function_t function);
};

soinfo getsolist()
{
return (soinfo
)dlopen(0,0);
}

//两行代码遍历所有的模块,而且信息更加的细致

void printAllModule()
{
soinfo somain = (soinfo )dlopen(0,0);
while(somain){LOGD("%s",somain->name);somain = somain->next;};
}

static soinfo find_loaded_library(const char name)
{
soinfo si;
const char
bname;

}

soinfo find_containing_library(const void p) {
Elf32_Addr address = reinterpret_cast<Elf32_Addr>(p);
for (soinfo si = (soinfo )dlopen(0,0); si != NULL; si = si->next) {
if (address >= si->base && address - si->base < si->size) {
return si;
}
}
return NULL;
}

unsigned elfhash(const char _name) {
const unsigned char
name = (const unsigned char*) _name;
unsigned h = 0, g;

}

static Elf32_Sym soinfo_elf_lookup(soinfo si, unsigned hash, const char name) {
Elf32_Sym
symtab = si->symtab;
const char* strtab = si->strtab;

}

void my_dlsym(soinfo si,const char name)
{
Elf32_Sym
s = soinfo_elf_lookup(si,elfhash(name),name);
if(sym)
{
return (void *)(s->st_value + si->load_bias);
}
else
{
return nullptr;
}
}

bool dumpso(soinfo so,const char savepath)
{
const Elf32_Phdr phdr;
char
Filemem = (char *)malloc(so->size);
Elf32_Addr loadbias = so->load_bias;
size_t fileSize = 0;
if(!Filemem)
return false;
for(int i=0;i<so->phnum;i++)
{
phdr = &(so->phdr[i]);
if(phdr->p_type != PT_LOAD)
{
continue;
}

}
```

 
 
 

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 4
支持
分享
打赏 + 1.00雪花
打赏次数 1 雪花 + 1.00
 
赞赏  junkboy   +1.00 2019/02/25 感谢分享~
最新回复 (5)
雪    币: 26588
活跃值: (63242)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
2
感谢分享!期待后续!
2019-2-24 17:26
0
雪    币: 6573
活跃值: (3873)
能力值: (RANK:200 )
在线值:
发帖
回帖
粉丝
3
赞!
2019-2-24 21:14
0
雪    币: 163
活跃值: (509)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
elf so结构分析加这种详细代码的文章还是比较少的,感谢作者的分析,期待后续!
2019-2-25 09:20
0
雪    币: 2141
活跃值: (7221)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
5
好啊,写成一个系列了。
2019-2-25 10:24
0
雪    币: 11
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
非常好,期待后面的自制shell。
2019-3-3 09:28
0
游客
登录 | 注册 方可回帖
返回
//