首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

认识 JavaAgent --获取目标进程已加载的所有类

Java RASP也是基于JavaAgent实现的。趁热记录下JavaAgent基础概念,以及简单使用JavaAgent实现一个获取目标进程已加载的类的测试。...)功能的动态库。...>... classes)//已加载类进行重新转换的方法,重新转换的类会被回调到ClassFileTransformer的列表中进行处理。...•premain方式回调到ClassFileTransformer中的类是虚拟机加载的所有类,这个是由于代理加载的顺序比较靠前决定的,在开发者逻辑看来就是:所有类首次加载并且进入程序main()方法之前...如果想要重新定义一全新类(类名在已加载类中不存在),可以考虑基于类加载器隔离的方式:创建一个新的自定义类加载器去通过新的字节码去定义一个全新的类,不过只能通过反射调用该全新类的局限性。

2.1K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Linux】ELF可执行程序和动态库加载

    ELF是一种灵活的、可扩展的文件格式,用于存储可执行程序、共享库和目标文件等二进制文件。 ELF文件采用分段(Segment)的结构,每个段都有不同的作用和属性。...此外,ELF文件格式还定义了一些特殊的节头表(Section Header Table)和程序头表(Program Header Table)来组织文件中的段和节信息。...指针,(pc指针指向当前执行的命令)这样一个程序就可以执行下去了,所以执行程序使用的地址也是虚拟地址。   ...动态库的加载   动态库的加载与可执行程序类似,但是它并不直接将虚拟地址保存到mm_struct中,而是在程序运行需要用到动态库时加载到内存中,并将自己的虚拟地址保存到一个结构体struct vm_area_struct...中,因为动态库加载可能多个也可能不加载,所有Linux使用了一种灵活的数据结构来保存动态库的虚拟地址,该结构体实际上是一个链表,链接在mm_struct中的共享区中。

    13110

    ELF文件从形成到加载轮廓

    ELF 是一种通用的二进制文件格式,在 Linux 系统中广泛用于目标文件、可执行文件、共享库以及内核转储等。...可以在运行时由多个程序共享加载,节省内存空间,但需要确保运行环境中有正确的库文件支持。 内核转储(Core Dumps) 用于存储当前进程的执行上下文,通常在进程因信号(如段错误)触发时生成。...记录每个段的起始位置、偏移量和长度,因为这些段在二进制文件中紧密排列,程序头表提供必要的描述信息以区分和加载这些段。 主要用于可执行文件和共享库,在加载时由操作系统或动态链接器使用。...包括函数、主程序、库函数等所有可执行代码。 .data: 存储已初始化的全局变量,存储数据段。...如果程序使用动态库,加载时动态链接器(如 ld-linux.so)会解析 .dynamic 和 .got.plt Section,加载共享库并绑定符号。

    7710

    ELF 64 格式详解

    ), 重定位的文件(可重定位文件)必须包含,可加载的文件可选(共享目标文件,可执行文件) 段头表(Program header table),可加载的文件必选,重定位文件可选 段和节的实际内容,包括可加载的数据...ELF节 节包含了ELF文件中除了文件头,程序段头表,节头表之外的所有内容。...结构定义如下: image.png r_offset 标识需要重定位的位置,对于可重定位文件,是从节开头到需要被重定位的存储位置的偏移量,对于可执行或共享库,是需要被重定位的存储位置的虚拟地址,单位都是字节...(s, t)(((s) << 32) + ((t) & 0xf f f f f f f f L)) r_addend 计算重定向位置时候需要额外加的常数项 程序段头表 对于可执行和共享库,为了加载方便,...可以先实际看下共享库的段表信息,readelf -l libtxffmpeg.so image.png 可以看到,段是由节组成的,这是对于加载器,权限一样的,就可以合并到一块,方便内存的管理。

    1.2K31

    CSAPP---第七章-链接

    可重定位目标文件格式 elf文件格式如下: elf头信息+节数组+节头部表(描述每个节所在位置) elf头信息如下所示: elf头以一个16个字节的序列开始,这个序列描述了生成该文件的系统的字的大小和字节顺序...: elf头剩下部分包含帮助链接器语法分析和解释目标文件的信息,其中包括: elf头大小,节头部表的偏移量,以及节头目表中条目的数量和大小。...所有引用该库的可执行目标文件共享这个 .so 文件中的代码和数据,而不是像静态库的内容那样被复制和嵌入到引用它们的可执行的文件中。...下面是一些现实世界中的例子: 分发软件。 微软 Wmdows 应用的开发者常常利用共享库来分发软件更新。他们生成一个共享库的新版本,然后用户可以下载,并用它替代当前的版本。...更进一步地说,在运行时无需停止服务器,就可以更新已存在的函数,以及添加新的函数。 Linux 系统为动态链接器提供了一个简单的接口,允许应用程序在运行时加载和链接共享库。

    92410

    ELF文件格式简介

    (5):保留段; PT_PHDR(6):保存程序头表本身的位置和大小,当前段不能在文件中出现一次以上,且仅仅当程序表头为内存映像的一部分时起作用,它必须在所有加载项目之前; [PT_LPROC(0x70000000...):所有包含当前掩码都表示预留给特定处理器的; sh_addr:如果当前节需要被装载到内存,则当前项存储当前节映射到内存的首地址,否则应该为0; sh_offset:当前节的首地址相对于文件的偏移; sh_size...:一组目标文件、库、系统共享资源和其他共享库链接在一起创建可执行文件。...当加载此可执行文件时必须使系统中其他共享资源和动态库可用,程序才能正常运行。   ...64bit的共享库,小端存储,版本为1,机器架构为x86-64,程序头表项有7项,节头表项有24项。

    2.2K31

    解锁动静态库的神秘力量2:从代码片段到高效程序的蜕变(续篇)

    2·共享⽬标⽂件(Shared Object File) :即xxx.so⽂件。 3· 内核转储(core dumps) ,存放当前进程的执⾏上下⽂,⽤于dump信号触发。....got.plt节 (全局偏移表-过程链接表):.got节保存了全局偏移表。.got节和.plt节⼀起提供了对导⼊的共享库函数的访问⼊。由动态链接器在运⾏时进⾏修改。...:因为静态链接是拷贝到可执行文件如果在加载内存:这样会占据大连内存;而动态的话直接把动库加载内存供多个程序共享。 动态小tip: 动态链接实际上将链接的整个过程推迟到了程序加载的时候。...为了提高动态库的加载效率,Linux系统会维护一个名为/etc/ld.so.cache的缓存文件。该文件包含了系统中所有已知动态库的路径和相关信息,动态链接器在加载动态库时会首先搜索这个缓存文件。...换句话说,我们的动态库不需要做任何修改,被加载到任意内存地址都能够正常运⾏,并且能够被所有进程共享,这也是为什么之前我们给编译器指定-fPIC参数的原因,PIC=相对编址+GOT。

    8510

    链接 动态链接 静态链接

    链接器通过把每个符号定义与一个存储器位置联系起来,然后修改所有对这些符号的引用,使得它们指向这个存储器位置,从而重定位这些节。 静态链接的输入文件是一系列的目标文件,输出是可执行的目标文件。....bss .symtab .debug .line .strtab 节头表 随即这些段就会被加载到存储器地址中,也就是大名鼎鼎的存储器结构,包含栈堆,内核等等的结构。...在了解之前,我们要知道静态库,刚才我们所说的都仅仅是将一系列的可重定位目标文件变成一个可执行目标文件,实际上,所有的编译系统都提供了一种机制,将所有的目标模块打包成一个单独的文件,称为静态库,他也可以作为静态链接器的输入...像一些glibc提供的函数,我们可能随时随处都会用上,如果我们每次把函数的代码复制到每个进程的文本段中,这无疑是一种浪费资源,所以出来了共享库的概念,在运行时,可以加载到任意的存储器地址,并在存储器中和一个程序链接起来...共享库也叫共享目标,以.so为结尾,像linux系统提供了dlopen这样函数去加载和链接共享库。 其实.symtab这个存放符号的地方也是值得研究的,有机会再记录。

    2.9K30

    详解共享库的动态加载

    在本文中,我将尝试解释在Linux系统中动态加载共享库的内部工作原理。 这边文章不是一个如何引导,尽管它确实展示了如何编译和调试共享库和可执行文件。为了解动态加载的内部工作方式进行了优化。...一般来说,库非常有用,因为它们可以缩短编译时间(在编译应用程序时不必编译依赖关系的所有源代码)和模块化开发过程。 静态库链接到已编译的可执行文件(或另一个库)中。编译后,新组件将包含静态库的内容。...共享库在运行时由可执行文件(或其他共享库)加载。这让它们变得更加复杂,通常大家对这个领域可能存在认知障碍,我们将在这篇文章中讨论。 示例设置 为了探索共享库的世界,我们将在本文中使用一个示例。...可以静态地执行此操作-并将random库中的所有符号直接加载到main可执行文件中。 我们告诉编译器我们要使用librandom文件。由于它是动态加载的,为什么我们在编译时需要它?...我们可以看到librandom.so我们指定的,但是我们还得到了四个我们没有想到的额外依赖项。这些依赖性似乎出现在所有已编译的共享库中。这些是什么呢?

    3.2K20

    ELF文件格式解析

    ELF Header   所有ELF文件首先都以一个64字节大小的ELF头作为开头,其包含内容可以用readelf -h xxx.so或者拖入010Editor中用模板查看,如下图所示: 其中比较重要的就是它记录了...DT_SYMBOLIC 16 ignored ignored optional 在共享object库中出现的该元素为在库中的引用改变动态连接器符号解析的算法。...并且只有程序头部表是程序的内存映像的一部分时才起作用。如果存在此类型段,则必须在所有可加载段项目的前面。...ELF加载   经过测试,ELF文件被加载时会每个LOAD段的记录将文件进行加载,具体来说,就是将ELF文件从LOAD段的p_offset位置读取p_filesz大小的数据,映射到内存中ELF基址+p_vaddr...ELF Header和Program Header给占据了他们的大小是0x40+0x1C0=0x200   此外,值得注意的是ELF加载时并没有读取所有ELF文件中的内容去加载到内存中,实际上我这个ELF

    2.6K40

    扒一扒ELF文件

    2.如果用于加载执行(可执行文件),则加载器则将把ELF文件看作是程序头表描述的段的集合,一个段可能包含多个节,节头表可选。 4....程序执行也必须依靠其提供的信息。 段头表   段头表。存放的是所有不同段将在内存中的位置。 .text section   代码段。存放已编译程序的机器代码,一般是只读的。...Elf32_Word sh_flags; //节标志:该节在虚拟空间中的访问属性 Elf32_Addr sh_addr; //虚拟地址:若可被加载,则对应虚拟地址 Elf32_Off...System V忽略所有应用程序的物理地址信息。 Elf32_Word p_filesz; //此成员给出段在文件映像中所占的字节数。可以为0。...共享库文件是一种特殊的可重定位目标。   2.ELF目标文件格式可以从编译链接角度和程序执行角度两个角度看,前者是可重定位目标格式,后者是可执行目标格式。

    78220

    深度解密Android中基于pltgot的hook实现原理

    4、装载、动态链接与重定位 4.1、装载 这个很好理解,我们在使用一个动态库内的函数时,都要先对其进行加载,在android中,我们通常是使用System.loadLibrary的方式加载我们的目标共享库...当共享库被装载的时候,动态链接器linker会将共享库装载到进程的地址空间,并且将程序中所有未决议的符号绑定到相应的动态链接库中,并进行重定位工作。...从上面的简图中,我们可以看到,当执行我们的代码段.text中的writeText函数的时候,内部会通过BLX相对寻址的方式进入.plt节,计算程序计数器 PC 的当前值跳转进入.got节。...具体可以看看:LoliProfiler的实现。 8、思考与小结 Q:比如我要hook我当前应用中的malloc函数,是否只对某个共享库进行hook即可?...其实hook操作本身的技术原理并不复杂,但是要针对android平台下的共享库进行hook操作,仅仅只了解hook操作是不够的,可以看到上面大部分的内容其实是在跟ELF文件周旋,要结合它的加载、动态链接

    3.6K20

    从程序员角度看ELF

    (这里针对ELF可执行文件,对于共享库的.init段,还是由interpreter来调用的!!!...这里特定的解释器是动态链接器,即ld.so,它自己也是ELF   共享库的格式。...链接器然后通过指向程序符号表和链接器自己的符号表的若干指针来初始化一个符号   表链。从概念上讲,程序文件和所有加载到进程中的库会共享一个符号表。...在该过程结束时,所有的库都被映射进来了,加载器拥有了一个由程序和所有映射进   来的库的符号表联合而成的逻辑上的全局符号表。   ...缓冲文件创建程序扫描包含共享库的所有目录,查找所有的共享库,提取每一   个的SONAME,对于具有相同SONAME的多个库,除版本最高的外其余的忽略。

    1K40

    Android Native Hook

    虽然 ELF 文件本身就支持三种不同的类型(重定位、执行、共享),不同的视图下格式稍微不同,不过它有一个统一的结构,这个结构如下图所示。...在我们调用了dlopen(“libname.so”)之后,系统首先会检查缓存中已加载的 ELF 文件列表。如果未加载则执行加载过程,如果已加载则计数加一,忽略该调用。...然后系统会用从 libname.so 的dynamic节区中读取其所依赖的库,按照相同的加载逻辑,把未在缓存中的库加入加载列表。...读 ELF 的程序头部表,把所有 PT_LOAD 的节区 mmap 到内存中。 从“.dynamic”中读取各信息项,计算并保存所有节区的虚拟地址,然后执行重定位操作。...这里还有一个“邪恶的”细节,由于指令执行是依赖当前运行环境的,即所有寄存器的值,而我们插入新的指令是有可能更改寄存器的状态的,所以我们要保存当前全部的寄存器状态到栈中,使用 BLX 指令跳转执行 Hook

    1.2K20

    黑客级别的文章:把动态库的内存操作玩出了新花样!

    这样的话,动态库的代码段在加载到物理内存中之后,就可以被多个不同的进程来共享了,只要把代码段的物理地址,映射到每个进程自己的虚拟地址即可。...动态链接(比如执行 dlopen)的大致步骤是: 检查已加载的 ELF 列表。(如果 libtest.so 已经加载,就不再重复加载了,仅把 libtest.so 的引用计数加一,然后直接返回。)...从 libtest.so 的 .dynamic section 中读取 libtest.so 的外部依赖的 ELF 列表,从此列表中剔除已加载的 ELF,最后得到本次需要加载的 ELF 完整列表(包括...链接器把所有被依赖的共享对象加载到内存中时,会把每个共享对象中的符号给汇总起来,得到全局符号表。 然后再检查每个共享对象中的 .rel.plt,是否需要对一些地址进行重定位。...动态库在被加载到内存中时,因为存在加载顺序的问题,所以加载地址不是固定的。 还有一种说法:对于某一个进程而言,它在被加载到内存中时,它所依赖的所有动态库的顺序是一定的。

    1.3K20

    【胖虎的逆向之路】——GOTPLT Hook详解&针对自定义so库的Hook实操

    “段 (segment)”包含一个或者多个“节(section)” 程序头只对可执行文件或共享目标 文件有意义,对于其它类型的目标文件,该信息可以忽略 在目标文件的文件头 (elf header)中,e_phentsize...~~ 不是我懒~ ---- 二、动态库装载、动态链接与重定位简单理解 1、装载 作者是Android出身,所以仅从Android角度来分析如何加载so的,我们在使用一个动态库(.so)内的函数时,都要先对其进行加载...使用~ 当so动态库被装载的时候,动态链接器linker会将动态库装载到进程的地址空间,并且将程序中所有没确定的符号绑定到相应的动态链接库中,并进行重定位的工作~ 3、重定位 共享库进行重定位的主要原因是在于导入符号原因...@plt里面~ 那么,由此可以得出当执行我们的代码段.text中的 curl_a_website 函数的时候,内部会通过BLX相对寻址的方式进入.plt节,计算程序计数器 PC 的当前值跳转进入.got...来,跑起来~ 使用命令获取: cat /proc/对应进程的pid/maps 上图已经列举出了我们的应用加载的一些so库,左边标记红色的地址就是各个so库的基址 addr = base_addr

    1.2K41

    含大量图文解析及例程 | Linux下的ELF文件、链接、加载与库(上)

    共享(shared)目标文件:通常是.so动态链接库文件或者动态链接生成的可执行文件。一种特殊类型的可重定位目标文件,可以在加载或者运行时被动态地加载进内存并链接。...但并不是所有以上三种ELF的形式都有这两张表, 如果用于编译和链接(可重定位目标文件),则编译器和链接器将把elf文件看作是节头表描述的节的集合,程序头表可选。...如果用于加载执行(可执行目标文件),则加载器则将把elf文件看作是程序头表描述的段的集合,一个段可能包含多个节,节头部表可选。 如果是共享目标文件,则两者都含有。...因为链接器在链接的时候需要节头部表来查看目标文件各个 section 的信息然后对各个目标文件进行链接;而加载器在加载可执行程序的时候需要程序头表 ,它需要根据这个表把相应的段加载到进程自己的的虚拟内存...其中各个节的含义如下: 这样我们就把一个可重定位的ELF文件中的每一个字节都搞清楚了。 静态链接 编译、链接的需求 为了节省空间和时间,不将所有的代码都写在同一个文件中是一个很基本的需求。

    3.6K52

    ELF文件及android hook原理

    、目的档、共享库和核心转储的标准文件格式。...链接视图和执行视图 ELF文件在磁盘中和被加载到内存中并不是完全一样的,ELF文件提供了两种视图来反映这两种情况:链接视图和执行视图。...因为ELF目标文件不需要被装载,所以它没有程序头表,而ELF的可执行文件和共享库文件都有。 使用readelf查看程序头表。 ?...与普通程序不同的是,动态链接模块的装载地址是从地址0x00000000开始的,这个地址是无效的,共享对象的最终装载地址在编译时时不确定的,而是在装载时,装载器根据当前地址空间的空前情况,动态分配一块足够大小的虚拟地址空间给相应的共享对象...动态加载器解析结束,可以看到got表项正确指向了libc动态库中printf的地址 ?

    3.9K81

    ELF中可以被修改又不影响执行的区域

    这里讲一些我在学习过程中的一些额外发现,如有理解不对的地方,欢迎斧正。 一. 关于ELF的链接视图和装载视图(执行视图)。在所有介绍ELF文件格式的文档中,都会出现这样一张图: ?...静态链接完成后,节区头部表在后续的加载执行中已经不会再用到了。 我们再来看看动态链接:动态链接的典型场景就是一个可执行文件加载了一个so文件,并执行了so的函数。...解释器可以是一个可执行文件,也可以是一个共享目标文件。 共享目标文件被加载到内存中时,其地址可能在各个进程中呈现不同的取值。...因为任何符合 ABI 规范的程序都要从共享目标库中导入基本的系统服务,动态链 接器会参与每个符合 ABI 规范的程序的执行。... 也就是说,动态链接时通过段去解析出对应的section的内容。...这些区域不属于任何 头部和节区,其内容未指定。 在加载视图中,数据被划分为段: 可执行文件或者共享目标文件的程序头部是一个结构数组,每个结构描述了一个段 或者系统准备程序执行所必需的其它信息。

    2.3K50
    领券