首页
学习
活动
专区
圈层
工具
发布

如何识别IDA反汇编中动态链接库中的函数

在使用IDA静态反汇编时,如果正在逆向的文件中有动态链接库函数(比如调用了程序自定义so库中的函数),IDA只会显示一个地址,跟进去会发现是延迟绑定中关于plt的代码,无法知道具体调用了哪个函数,对于逆向起来很是麻烦...),于是通过查阅《程序员的自我修养》动态链接相关内容,找到了识别动态链接库中函数的方法。...ELF文件中存储了导入的所有函数符号信息,在IDAi的mport窗口中可以看到,不过IDA没有自动显示出来这些函数的地址,但在Linux下使用 readelf -sD 文件名| grep 小写地址 查看该文件可以看到地址动态符号的地址...ELF文件中还存储了needed的动态链接库,IDA中写在了该文件的最开始,向上拉窗口可以看到,我们只要从这些so库中找识别出的函数名即可。...使用 grep -rn “函数名” 即可找到调用的哪个库中的哪个函数。 ? 此外,还有这种形式的动态链接调用,再次挖坑做以记录碰到再研究。

3.9K70

程序时如何链接到动态库中的函数

0 GOT表与PLT表是什么0.1 GOT(全局偏移表)GOT(Global Offset Table,全局偏移表)是程序数据段中的一个特殊表格,它的作用是存储动态库中函数和变量的实际内存地址。...工作原理:1.程序运行过程中,对于每个需要动态解析的函数或变量,ld-linux.so 会计算其在内存中的绝对地址;2.将这些地址填入GOT表的对应位置中技术细节:1.在64位系统中,每个GOT表元素占用...8个字节(64位,其实就是指针的大小),正好存储一个内存地址;2.当程序需要调用动态库中的函数或访问动态库中的变量时,不是直接访问目标地址,而是通过查询GOT表,获取目标的实际内存地址,再间接跳转或访问假设程序要调用...如果未解析,调用动态链接器来查找 printf 的真实地址;3.将找到的地址填入GOT表;4.然后跳转到真实的 printf 函数后续调用:1.直接通过GOT表中已存储的地址跳转到真实函数;2.不再需要动态解析...总结本文针对程序在运行时如何连接到动态库的函数进行了简述,同时通过GDB在aarch64与x86_64上实验验证理论。

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

    【C 语言】动态库封装与设计 ( 动态库调用环境搭建 | 创建应用 | 拷贝动态库相关文件到源码路径 | 导入头文件 | 配置动态库引用 | 调用动态库中的函数 )

    五、调用动态库中的函数 一、在 Visual Studio 2019 中创建 " 控制台应用 " 程序 ---- 欢迎界面中 , 选择 " 创建新项目 " , 选择创建 " 控制台应用 " 项目类型..., 配置 项目名称 与 位置 , 项目创建完成后 , 初始程序是 C++ 程序 , 这里修改为 C 语言程序 ; 二、拷贝 xxx.lib、xxx.dll、xxx.h 到源码路径 ---- 将 动态库的...描述文件 xxx.lib , 动态库文件 xxx.dll , 动态库头文件 xxx.h , 拷贝到 项目的源码路径中 , 注意就是主函数源码所在的目录 ; 三、导入 xxx.h 头文件 ---- 在...出现在 源文件 中 ; 将 xxx.h 头文件手动拖动到 " 头文件 " 中 ; 四、配置动态库引用 ---- 右键点击 " 解决方案 " , 在弹出的菜单中 , 选择 " 属性 " , 选择..." 配置属性 -> 链接器 -> 输入 -> 附加依赖项 " 的 " 编辑 " 选项 , 将 xxx.lib 选项 , 拷贝到此处 ; 五、调用动态库中的函数 导入头文件 , 即可调用动态库中的函数

    3.1K30

    如何在服务器中Ping特定的端口号,如telnet Ping,nc Ping,nmap Ping等工具的详细使用教程(Windows、Linux、Mac)

    猫头虎 分享:如何在服务器中Ping特定的端口号? 网络调试的实用技巧,学会这些工具,你将成为运维与开发中的“Ping”王!...在日常开发和运维中,我们经常需要检查目标主机上的某个端口是否开启,并确定网络连通性。...常规 Ping 的局限性 传统 Ping 只测试 ICMP 通信: 无法确认特定服务是否正常运行。 端口 Ping 的优势: 确认服务是否正常工作。 检测防火墙是否阻止了特定端口通信。...使用 Telnet Ping 端口 Telnet 是检查端口连通性的经典工具,虽然简单,但功能强大。...使用 nmap Ping 端口 Nmap 是一款专业的网络扫描工具,适合批量测试。

    45.1K20

    【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 一 | mmap 函数简介 )

    文章目录 一、mmap 简介 二、mmap 函数作用 一、mmap 简介 ---- mmap 函数的作用是 将 文件 映射到 内存中 , 映射的单位必须是 PAGE_SIZE ; mmap 函数引入头文件...如果不为 0 , 则由用户指定分配的地址 ; size_t length : 申请分配内存的大小 ; int prot : 内存保护标志 , 如 PROT_READ | PROT_WRITE | PROT_EXEC...用途如下 ; ① 大文件读写 : 大文件读写 时 , 可以 将文件映射到内存中 ; ② 内存分配 : 一般在用户层使用 malloc 函数即可 , 不常用 ; ③ 修改内存 : 当以 匿名/私有 的方式...; ② 逆向工具应用 : 但是逆向的场景中 , 动态库是侵入目标进程的 , 第一个侵入的动态库 , 风险很大 , 会破坏目标进程内存结构 , 因此加载的指令尽量少 , 这里直接使用系统调用 , 简洁高效安全...; 在注入进程的动态库中 , 指令越复杂 , 越容易出错 ;

    66220

    【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 systemliblibc.so 动态库中的 mmap 函数地址 )

    文章目录 一、获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 二、从 /proc/pid/maps 文件中获取 指定 进程 中的 /system/lib.../libc.so 动态库地址 三、获取 本地进程 中的 /system/lib/libc.so 动态库的 mmap 函数地址 四、获取 远程进程 中的 /system/lib/libc.so 动态库的...mmap 函数地址 一、获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 ---- 获取 远程 目标进程 中的 /system/lib/libc.so...动态库中的 mmap 函数地址流程 : ① 获取 本地进程 /system/lib/libc.so 动态库 地址 ; ② 获取 远程进程 /system/lib/libc.so 动态库 地址 ; ③ 计算..., 函数名就是函数地址 ; (void*)mmap 就是 mmap 函数对应的函数指针 ; /* 获取 目标进程中的 /system/lib/libc.so 动态库中的 mmap 函数地址 (

    1.3K20

    【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 二 | 准备参数 | 远程调用 mmap 函数 )

    远程调用 目标进程中 libc.so 动态库中的 mmap 函数 一 | mmap 函数简介 ) 中介绍了 mmap 函数 ; mmap 函数的函数原型如下 : void*..., 如 PROT_READ | PROT_WRITE | PROT_EXEC , 表示 可读 | 可写 | 可执行 ; int flags : 映射对象类型标志位标志位 , 如 MAP_ANONYMOUS...---- 由于远程调用涉及到寄存器的操作 , 因此 arm 架构 与 x86 架构的 远程调用是不同的 , 本次开发的是 x86 架构下的远程调用 ; 首先 , 将 mmap 函数执行的参数 , 写出到远程进程的内存中...EIP 寄存器 , 指定执行哪个函数 , 这个 函数地址 是在 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 /system/lib/libc.so...动态库中的 mmap 函数地址 ) 博客中获取的 mmap 函数地址 ; /* 设置 EIP 寄存器值 , 存储 CPU 下一条将要执行的指令 */ regs->eip = addr; /* 设置

    1.3K10

    TVM虚拟机

    TVM 建立在通用的UNIX系统的C语言库函数基础上, 可以运行在各种操作系统平台,如 Windows,Linux,BSDs,Mac OS等。 4....TVM 引擎可以进行源代码链接,生成独立的可执行文件。 5. TVM 引擎以共享库库的方式可以嵌入到宿主系统中,可作为应用开发的语言平台。 6....而C语言在编译的过程中须明确操作数的内存单元 大小和长度,因此使用前必须事先申明变量符号和函数符号的数据类型。 12. 集中强化符号和表达式的处理和操作。...函数是特殊的列表,可以象操作列表一样来对函数进行组合和拆分。 除了定义函数外,还可以 用宏实现在重构表达式。 15. 支持流的输入输出操作,可以包含控制字符的二进制数据访问。 16....拥有对象、符号目录,供多人协作完成的大型软件项目,既可以引用他人的目标模块,又可以避 免变量或函数重名的覆盖危险。 19. 除了使用内建函数外,还可以通过导入共享库来进行功能扩展。

    34500

    【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取注入的 libbridge.so 动态库中的 load 函数地址 并 通过 远程调用 执行该函数 )

    文章目录 一、dlsym 函数简介 二、获取 目标进程 linker 中的 dlsym 函数地址 三、远程调用 目标进程 linker 中的 dlsym 函数 获取 注入的 libbridge.so 动态库中的...的缩写 , 该函数的作用是 根据 动态链接库 句柄 和 符号 , 返回对应 符号的地址 , 这个符号可以是方法名 , 也可以是变量名 ; 包含头文件 : #include 函数原型...mmap 函数地址 ) 博客 ; 获取 远程 目标进程 中的 动态库中的 函数地址流程 : ① 获取 本地进程 动态库 地址 ; ② 获取 远程进程 动态库 地址 ; ③ 计算 本地进程 与 远程进程...动态库的代码 , 在该换行代码中 , 只是调用 dlopen 函数加载了真正的 libnative.so 动态库 , 这个动态库是进行逆向操作的主要的库 , 执行核心逻辑 ; 先远程注入 libbridge.so...动态库 , 然后远程调用 libbridge.so 中的 load 函数 , 将真正的 libnative.so 加载到目标进程中 ; 使用修改寄存器的方法 强行加载 libbridge.so 动态库

    1.3K10

    深入浅出GCC编译器

    一、GCC交叉编译工具链 GCC编译工具链包含了GCC编译器在内的一整套工具,主要包含了GCC编译器、Binutils工具集、glibc标准函数库。...① size: 列出文件每个部分的内存大小,如代码段、数据段、总大小等。...上面可以看到,nm列出的信息总共有三列:第一列是指程序运行时的符号所对应的地址,对于函数来说表示的是函数的开始地址,对于变量则表示的是变量的存储地址;第二列是指相应符号是放在内存的哪一个段;第三列则是指符号的名称...编译时编译器只对单个文件进行处理,如果该文件里面需要引用到其他文件中的符号,比如全局变量或者调用了某个库函数中的函数,那么这时候,在这个文件中该符号的地址是没法确定的,只能由链接器把所有的目标文件链接到一起才能确定最终的地址...(5)-L 包含的库路径 指定动态库和静态库的路径,后面直接加路径即可。具体使用方法将在我Linux专栏的另一篇文章《自己动手做动态库与静态库》中详细介绍。

    2.7K10

    【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 三 | 等待远程函数执行完毕 | 寄存器获取返回值 )

    文章目录 前言 一、等待远程进程 mmap 函数执行完毕 二、从寄存器中获取进程返回值 三、博客资源 前言 前置博客 : 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 |...远程调用 目标进程中 libc.so 动态库中的 mmap 函数 一 | mmap 函数简介 ) 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so...动态库中的 mmap 函数 二 | 准备参数 | 远程调用 mmap 函数 ) 本博客进行收尾 , 远程调用 mmap 函数后 , 等待函数执行 , 获取该函数执行的返回值 ; 一、等待远程进程 mmap...函数执行完毕 ---- 调用 waitpid(pid, &stat, WUNTRACED) 方法 , 阻塞等待 远程进程 的 mmap 函数执行完毕 , 直到远程进程状态位 WUNTRACED 时 ;...; 然后读取该寄存器数据中的 EAX 寄存器值 , 用于获取远程执行 dlopen 函数的返回值 , 返回的是 libbridge.so 动态库的首地址 ; /* 读取寄存器返回值 */ long ptrace_retval

    1.1K20

    Mac虚拟机CrossOver2022下载及如何使用教程

    软件简介Crossover由codewaver公司开发的类虚拟机软件,目的是使linux和Mac OS X操作系统和window系统兼容。...CrossOver不像Parallels或VMware的模拟器,而是实实在在Mac OS X系统上运行的一个软件。CrossOvers能够直接在Mac上运行Windows软件与游戏,而不需虚拟机。...它为Windows软件提供所需的资源,以达到在Mac OS X系统上运行Windows程序的目的。...CrossOver 22包含一个更新的Wine,其中包含数千个Windows应用程序兼容性的改进。...CrossOver怎么下游戏有些游戏可以如第一部分中所介绍的那样,直接下载安装包,然后通过【未列出的应用】进行安装。我们还可以在CrossOver中搜索软件名称,如果搜索到,便直接下载即可。

    3K00

    开发库的哪些注意事项

    由于静态库在编译时会被完整地拷贝到下游用户的程序中,因此静态库对于下游用户是完全可见的,这就意味着,静态库在使用时不需要明确地进行符号导出。动态库的使用则更加复杂。...为避免该问题,需要确保动态库的关键函数、类使用正确的导出宏。 当出现这种问题可以借助第三方工具确认动态库是否导出了正确的符号。...如windows平台的dumpbin.exe,linux平台的nm,mac平台的otool。...确保库的位数与目标程序一致,例如,在64位操作系统上,库与项目应均为64位;如mac上x64和arm64混编时也会出现问题。 4....符号冲突 如果项目中的多个库包含相同符号(如函数或变量名),会造成符号冲突。在编写跨平台库时,应尽量避免使用全局变量,采用命名空间可以减少符号冲突的风险。 7.

    1.3K10

    了解和分析iOS Crash

    如何判断Crash report是否已经符号化 一个crash report有可能未符号化,完全符号化,也有可能部分符号化。未符号化的crash report不会在堆栈信息中包含方法名或者函数名。...· 发生crash时app所依赖的OS的符号表信息。这些符号表包含了特定OS版本 (例如iOS9.3.3)上的framework所需调试信息。...OS 符号表的架构具有独特性——一个64位的iOS设备不会包含armv7的符号表。Xcode将要自动拷贝你连接到的特定版本的Mac的符号表。...额外的诊断信息 本章节包含终止相关的额外诊断信息,包括: · 应用的具体信息:在进程被终止前捕捉到的框架错误信息 · 内核信息:关于代码签名问题的细节 · Dyld (动态链接库)错误信息:被动态链接器提交的错误信息...第一行列出了当前的线程号,以及当前的执行队列的id。其余各行列出来每一个堆栈中堆栈片段信息,从左到右分别是: · 堆栈片段号。堆栈的展示顺序会和调用顺序一致,片段0是在程序被终止时执行的函数。

    2K30

    了解和分析iOS Crash

    如何判断Crash report是否已经符号化 一个crash report有可能未符号化,完全符号化,也有可能部分符号化。未符号化的crash report不会在堆栈信息中包含方法名或者函数名。...· 发生crash时app所依赖的OS的符号表信息。这些符号表包含了特定OS版本 (例如iOS9.3.3)上的framework所需调试信息。...OS 符号表的架构具有独特性——一个64位的iOS设备不会包含armv7的符号表。Xcode将要自动拷贝你连接到的特定版本的Mac的符号表。...额外的诊断信息 本章节包含终止相关的额外诊断信息,包括: · 应用的具体信息:在进程被终止前捕捉到的框架错误信息 · 内核信息:关于代码签名问题的细节 · Dyld (动态链接库)错误信息:被动态链接器提交的错误信息...第一行列出了当前的线程号,以及当前的执行队列的id。其余各行列出来每一个堆栈中堆栈片段信息,从左到右分别是: · 堆栈片段号。堆栈的展示顺序会和调用顺序一致,片段0是在程序被终止时执行的函数。

    2.5K20

    了解和分析iOS Crash Report

    如何判断Crash report是否已经符号化 一个crash report有可能未符号化,完全符号化,也有可能部分符号化。未符号化的crash report不会在堆栈信息中包含方法名或者函数名。...发生crash时app所依赖的OS的符号表信息。这些符号表包含了特定OS版本(例如iOS9.3.3)上的framework所需调试信息。...OS 符号表的架构具有独特性——一个64位的iOS设备不会包含armv7的符号表。Xcode将要自动拷贝你连接到的特定版本的Mac的符号表。...额外的诊断信息 本章节包含终止相关的额外诊断信息,包括: 应用的具体信息:在进程被终止前捕捉到的框架错误信息 内核信息:关于代码签名问题的细节 Dyld (动态链接库)错误信息:被动态链接器提交的错误信息...第一行列出了当前的线程号,以及当前的执行队列的id。其余各行列出来每一个堆栈中堆栈片段信息,从左到右分别是: 堆栈片段号。堆栈的展示顺序会和调用顺序一致,片段0是在程序被终止时执行的函数。

    2.5K20

    动静态库:选择与应用的全方位指南

    常见的选项 -c:创建库文件,如果库已存在,则会被覆盖。 -r:向库文件中添加.o文件,如果.o文件已在库中存在,则会被替换。 -t:列出库文件中包含的.o文件列表。...与静态库不同,静态库在程序编译时会被完全复制到可执行文件中,而共享库则在程序运行时被加载到内存中,如果多个程序使用同一个共享库,OS会让这些进程共享内存中的同一份库代码和数据,即:动态库的代码和数据在内存中只存在一份...管理:系统中可以同时存在多个已经被加载的库,OS需要管理它们,先描述(包含了加载地址等信息)、再组织。 二、动态库加载的过程 检查依赖:程序启动时,动态链接器会检查该程序依赖的所有动态库。...---- 里面的数据很多都是从可执行程序中来的 (和操作系统,编译器都有关系) 编址:在编译和链接阶段,为程序和库中的符号(变量、函数)分配地址的过程,主要有绝对编址、相对编址两种方式。...基地址在编译链接阶段是未知的,通常是由OS在程序加载时分配的虚拟地址,是在地址空间内的一个起始地址,如:0x400000。 回答前面提到的问题:地址空间、页表中的数据来自哪里?

    43110

    程序一定要从main函数开始运行吗?

    Tips: 现在的程序和库通常来讲都很大,一个目标文件可能包含成百上千个函数或变量,当需要用到某个目标文件的任意一个函数或变量时,就需要把它整个目标文件都链接进来,也就是说那些没有用到的函数也会被链接进去...,要先初始化进程执行环境,如堆分配初始化、线程子系统等,C++的全局对象构造函数也是这一时期被执行的,全局析构函数是main之后执行的。...如何指定程序入口 在ld链接过程中使用-e参数可以指定程序入口,由于一段简短的printf函数其实都依赖了好多个链接库,我们也不太方便使用链接脚本将目标文件与所有这些依赖库进行链接,所以使用下面这段内嵌汇编的程序来打印一段字符串...readelf -S 列出每个段 readelf -r 列出重定位表 readelf -d 列出动态段 关于查看目标文件符号信息: nm -a 显示所有的符号 nm -D 显示动态符号 nm -u...A:该符号的值是绝对的,在以后的链接过程中,不允许进行改变。这样的符号值,常常出现在中断向量表中,例如用符号来表示各个中断向量函数在中断向量表中的位置。

    1.7K30
    领券