![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ELF
bobbypapa
这个作者很懒,什么都没留下…
展开
-
进程装载时各动态库的.init段的执行顺序
我们知道:1,每个动态库都有.init段,.init段的代码会在main函数之前执行。我们可以自定义.init函数,例如,__attribute__ ((constructor)) static void __my_init_func(void){ .......}2,启动进程时,LD_PRELOAD指定的动态库,会被优先加载(位于进程地址空间的顶端处)。那么,LD_PRELOAD的动态库,其.i...原创 2018-04-10 21:49:59 · 2096 阅读 · 0 评论 -
图的应用--动态库依赖关系解析
主程序及其依赖的动态库,可以构成一张有向图,其起始顶点为主程序。主程序的装载过程,就是有向图的遍历+构造过程。根据遍历方法的不同(BFS广度遍历和DFS深度遍历),动态库的加载顺序也有可能发生变化,这影响到了动态符号的绑定结果,比如不同动态库中含有相同的动态符号。根据有向无环图的特性,还能够判断这些动态库中是否存在循环依赖,也就是liba依赖libb,libb又依赖liba的情况。我们只需要对这些...原创 2018-04-12 07:55:19 · 1137 阅读 · 0 评论 -
wine的工作原理与自动运行PE程序
一次偶然的情况,发现我电脑上的linux可以直接使用./来执行tools/vnd/BCM7584UPKFxBA/brcm_sign_enc.exe程序,但是另外一台linux电脑就不可以。使用file命令查看该文件是windowsPE格式的程序。由于我电脑上有wine,猜测它是通过wine来执行的,因此 cat /proc/PID/maps,发现确实是被wine执行的,代码段加载了很多wine相关...原创 2018-04-11 09:25:17 · 5186 阅读 · 0 评论 -
C++成员函数的拦截方法
概述利用preload方式对动态库中C语言函数调用进行拦截,有时候会达到剑走偏锋的效果。例如,在DVB+Dongle的产品中,我们就采用了这种方案,在不需要修改甚至重新编译原中间件及SDK的前提下,截获了SDK库中的部分接口调用,从而轻松抓取到OSD图层数据及解扰后的视频流。preload原理如下图,图1 注入libhack.so前后的接口调用路径如图,利用ld_preload向应用的进程空间高地...原创 2018-04-11 09:17:27 · 1846 阅读 · 0 评论 -
MIPS backtrace的实现方案
概述backtrace获取的是当前函数的纵向调用信息。一般思路是,给定当前函数的栈地址和当前运行位置(PC),通过计算得到当前函数的返回地址和上层函数(caller)的栈地址,然后以当前函数的返回地址作为caller的PC,来继续解析caller的返回地址和caller of caller的栈地址,以此类推进行纵向解析。不管什么处理器架构,其GCC工具链提供的libgcc库中,都自带一个unwin...原创 2018-04-11 08:53:52 · 2227 阅读 · 2 评论 -
链接选项 -rdynamic与动态符号表
注意,这是链接选项,而不是编译选项。在将c文件编译成.o的过程中,使用rdynamic是没有任何效果的。只有将.o链接成elf时,才有效果。这主要是对可执行程序而言的,而编译动态库时,即使没有rdynamic选项,默认也会将非静态函数放入动态符号表中(刻意隐藏的函数除外)。一个验证方法显示可执行程序文件内的动态符号(注意,仅仅是动态符号):readelf -Ds a.out默认情况下,可执行程序(...原创 2018-04-10 22:01:46 · 11611 阅读 · 0 评论 -
全局符号介入(global symbol interpose)的几种方法
1,preload2,显式链接时将介入库放在被介入库的前面,例如,我们利用tcmalloc来hack malloc等函数,那么显式链接tcmalloc时,应保证在libc前面。这样加载时会先加载libtcmalloc,再加载libc。3,编译生成动态库时使用-z interpose选项,会在动态库的符号表中存一个INTERPOSE的flag,动态链接器在加载进程时,判断该flag并优先载入其符号....原创 2018-04-10 21:59:25 · 1791 阅读 · 0 评论 -
MIPS 动态符号的延迟绑定
概述MIPS平台中动态库的装载与解析原理,网上资料并不多,而且很多讲解都是错误的,甚至MIPS宝书《see mips run》中也没有提供详细的方案。因此本人只好通过代码走读和运行验证的方法来详细了解其原理。之所以要了解mips动态符号的解析调用,是因为之前在实现mips backtrace时,对一些调整gp的指令存在疑惑,顾而深入研究一下。先上结论:MIPS动态库中的外部符号调用,是依赖.got...原创 2018-04-10 21:58:13 · 1250 阅读 · 0 评论 -
关于动态符号表及“全局符号表”
elf.h中对符号表的类型定义如下:#define DT_STRTAB 5 /* Address of string table */#define DT_SYMTAB 6 /* Address of symbol table */这里DT_SYMTAB与DT_STRTAB对应的section其实是.dynsym和.dynstr,而非.symtab和.symstr!.symtab和.dynsy...原创 2018-04-10 21:54:15 · 5623 阅读 · 1 评论 -
拿到死机backtrace堆栈后如何确认死在哪一行源码(ARM+Android平台反汇编分析举例)
目录Android上如何用debuggerd拿到死机堆栈拿到死机堆栈后如何分析分析backtrace文件反汇编分析.so文件反汇编分析.o文件相关附件Android上如何用debuggerd拿到死机堆栈关于debuggerd的原理,在这里就不赘述了。需要注意两点:1,确保要调试的进程中没有重写信号处理函数。在我们的中间件中,libqin_buslib.s...原创 2019-01-01 11:00:54 · 2670 阅读 · 1 评论