提取及反汇编函数
- 格式:doc
- 大小:82.00 KB
- 文档页数:4
Linux内核调试⽅法总结之反汇编Linux反汇编调试⽅法Linux内核模块或者应⽤程序经常因为各种各样的原因⽽崩溃,⼀般情况下都会打印函数调⽤栈信息,那么,这种情况下,我们怎么去定位问题呢?本⽂档介绍了⼀种反汇编的⽅法辅助定位此类问题。
代码⽰例如下:#include <signal.h>#include <stdio.h>#include <stdlib.h>#include <execinfo.h>#include <fcntl.h>#include <string.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#define PRINT_DEBUG#define MAX_BACKTRACE_LEVEL 10#define BACKTRACE_LOG_NAME "backtrace.log"static void show_reason(int sig, siginfo_t *info, void *secret){void *array[MAX_BACKTRACE_LEVEL];size_t size;#ifdef PRINT_DEBUGchar **strings;size_t i;size = backtrace(array, MAX_BACKTRACE_LEVEL);strings = backtrace_symbols(array, size);printf("Obtain %zd stack frames.\n", size);for(i = 0; i < size; i++)printf("%s\n", strings[i]);free(strings);#elseint fd = open(BACKSTRACE_LOG_NAME, O_CREAT | O_WRONLY);size = backtrace(array, MAX_BACKTRACE_LEVEL);backtrace_symbols_fd(array, size, fd);close(fd);#endifexit(0);}void die() {char *str1;char *str2;char *str3;char *str4 = NULL;strcpy(str4, "ab");}void let_it_die() {die();}int main(int argc, char **argv){struct sigaction act;act.sa_sigaction = show_reason;sigemptyset(&act.sa_mask);act.sa_flags = SA_RESTART | SA_SIGINFO;sigaction(SIGSEGV, &act, NULL);sigaction(SIGUSR1, &act, NULL);sigaction(SIGFPE, &act, NULL);sigaction(SIGILL, &act, NULL);sigaction(SIGBUS, &act, NULL);sigaction(SIGABRT, &act, NULL);sigaction(SIGSYS, &act, NULL);let_it_die();return 0;}在该⽰例中,我们通过⾃定义的信号处理函数,在程序异常时通过调⽤backtrace()和backtrace_symbols()函数获取并打印函数调⽤栈信息。
为什么要反汇编?反汇编文件的生成和解读为什么要反(汇编)反汇编顾名思义就是汇编的逆过程,将二进制文件反汇编成汇编代码。
(arm)-(linux)-objdump是交叉编译工具链里的一个工具,专门用来反汇编的,将二进制代码反汇编成汇编代码来查看。
为什么要反汇编1.逆向破解。
将可执行程序反汇编得到汇编代码,再根据汇编代码推理出整个程序的逻辑。
这个不是一般人能做的,能看懂大量汇编语言写的程序都很困难了,更别说反推别人的代码逻辑。
2.调试程序时可以帮助我们理解并(检测)生成的可执行程序是否正常,尤其是在理解链接脚本和链接地址等概念时。
3.(C语言)的源代码编译链接生成的可执行文件再反汇编,可以帮助我们理解C语言和汇编语言的对应关系,有助于深入理解C 语言。
反汇编文件的生成和解读反汇编文件的生成:上面是一个简单的Makefile,功能是把源文件.S和.c先编译成.o 文件,再把.o文件链接成.elf的可执行文件。
arm-linux-objdump -D (led).elf > led_elf.dis是将led.elf反汇编成ed_elf.dis。
源文件:star.s是一个汇编文件star.s是一个学习S5PV210开发板时点亮LED的汇编程序,由开始、点亮、延时和死循环组成,在这里并不关注具体实现的功能,重点是和反汇编生成的文件进行对照。
得到的反汇编文件:led_elf.dis解析:1.第一行:led.elf: file f(or)mat elf32-littlearm。
表明此汇编程序是由led.elf生成,程序是32的小端模式。
2.00000000 :前面的00000000是标号的地址,是标号,对应start.s的_start标号。
其实标号就相当于C语言中的函数名,在C语言中也可以用函数名代表函数的首地址,在这里可以得到印证。
反汇编的标号就是由汇编文件得来的,这样可以方便我们找到反汇编文件和汇编文件对应的部分。
反汇编入门经典教程反汇编是一种通过逆向工程将机器码转换为可读的汇编代码的过程。
它是了解程序内部工作原理、检测和修复软件漏洞、进行逆向工程等任务的重要工具。
以下是一个反汇编入门经典教程。
第一步:安装反汇编工具要进行反汇编,您需要一个适当的反汇编工具。
一些常用的反汇编工具包括IDA Pro、OllyDbg和Ghidra。
选择其中一个工具,并按照其官方指南安装和配置。
第二步:了解基础知识在开始反汇编之前,您需要掌握一些基础知识。
首先了解汇编语言的基本概念,如寄存器、指令、内存等。
还应该了解不同的汇编指令以及它们的功能和用法。
您可以通过阅读相关的教程和文档来学习这些知识。
第三步:打开目标程序使用反汇编工具打开您要分析的目标程序。
您可以选择一个已编译的可执行文件或者一个在内存中运行的进程。
请确保您具有对该文件或进程的合法访问权限。
第四步:分析代码一旦您打开了目标程序,您将看到程序的汇编代码。
您可以使用工具提供的各种功能来分析代码。
以下是一些基本的分析技巧:1.寻找入口点:在大型程序中,找到程序的入口点是一个重要的第一步。
入口点通常是程序启动时执行的第一条指令。
2.跟踪程序流程:使用调试器功能可以帮助您了解程序的执行流程。
您可以设置断点,在执行到断点时暂停程序并检查寄存器和内存的值。
3.理解函数调用:函数调用是程序执行流程的重要部分。
您可以查看函数调用的汇编指令,并分析参数传递、返回值和栈操作等信息。
4.检查条件和跳转:程序中的条件和跳转指令对于控制程序流程起着重要作用。
您可以跟踪这些指令,以了解程序在不同情况下的执行路径。
第五步:理解代码功能一旦您分析了程序的汇编代码,您将能够了解程序的功能和工作原理。
您可以通过查看函数、变量和各种数据结构的命名来获得有关代码的更多上下文信息。
理解代码的功能将有助于您进行进一步的分析和调试。
第六步:修改代码在一些情况下,您可能希望修改程序的汇编代码。
例如,您可能希望修复一个软件漏洞或者修改程序的行为。
提取及反汇编函数提取及反汇编函数Hcper @ 2012年12⽉8⽇星期六在调试过程中有时候会遇到⼀些函数,它在汇编的情况下难以理解。
如果⽤IDA 的HexRay插件是可以转化难以理解的汇编码为C代码。
但是,有时候⼜没必要反汇编整个⽂件,如果⽂件⽐较⼩还好说,⼀兆以上往往要花费很多时间,⽽且⼤多数时候是做⽆⽤功的。
如果能够把要分析的函数代码拷出来为⼀个单独的⼆进制⽂件,⽤IDA在函数实际的地址上建⽴段,并建⽴函数,然后⽤HexRay插件反成C代码,这样就可以很好的分析函数了。
下⾯⽤⼀个例⼦说明,分析的是⼀个mshtml.dll⾥⾯的⼀个函数。
这个mshtml.dll⽂件很⼤,如果⽤IDA反汇编整个⽂件估计要花很多时间。
如果我们只分析其中的⼀个函数,那就没必要分析整个⽂件,我们⽤windbg附加到那个进程,把要分析的函数⼆进制码导出到单独的⽂件⾥,qd安全退出。
然后⽤IDA按以上⽅法分析即可。
要反汇编的函数调⽤结构⼤概如下:0:000> uf /c 3dea0a43mshtml!IERegisterXMLNS+0x9bf59 (3dea0a43)mshtml!IERegisterXMLNS+0x9bf70 (3dea0a5a):call to mshtml!DllGetClassObject+0x8d36b (3db2a740)mshtml!IERegisterXMLNS+0x9bf7e (3dea0a68):call to mshtml!DllGetClassObject+0x888e0 (3db25cb5)mshtml!IERegisterXMLNS+0x9bfa0 (3dea0a8a):call to mshtml!CreateHTMLPropertyPage+0x42b05 (3ddd16ef)在windbg下⽤uf反汇编看看0:000> uf 3dea0a43mshtml!IERegisterXMLNS+0x9bf59:3dea0a43 8bff mov edi,edi //这⾥是函数开头3dea0a45 55 push ebp3dea0a46 8bec mov ebp,esp3dea0a48 8b08 mov ecx,dword ptr [eax]3dea0a4a 53 push ebx3dea0a4b 8b5d08 mov ebx,dword ptr [ebp+8]3dea0a4e 57 push edi3dea0a4f 8bc1 mov eax,ecx3dea0a51 83e00f and eax,0Fh3dea0a54 8d7e18 lea edi,[esi+18h]3dea0a57 50 push eax3dea0a58 890f mov dword ptr [edi],ecx3dea0a5a e8e19cc8ff call mshtml!DllGetClassObject+0x8d36b (3db2a740)3dea0a5f 85c0 test eax,eax3dea0a61 7411 je mshtml!IERegisterXMLNS+0x9bf8a (3dea0a74)mshtml!IERegisterXMLNS+0x9bf79:3dea0a63 6a08 push 83dea0a65 57 push edi3dea0a66 8bc3 mov eax,ebx3dea0a68 e84852c8ff call mshtml!DllGetClassObject+0x888e0 (3db25cb5)3dea0a6d 895e04 mov dword ptr [esi+4],ebx3dea0a70 891e mov dword ptr [esi],ebx3dea0a72 eb2a jmp mshtml!IERegisterXMLNS+0x9bfb4 (3dea0a9e)mshtml!IERegisterXMLNS+0x9bf8a:3dea0a74 837d1001 cmp dword ptr [ebp+10h],13dea0a78 7415 je mshtml!IERegisterXMLNS+0x9bfa5 (3dea0a8f)mshtml!IERegisterXMLNS+0x9bf90:3dea0a7a 8bc1 mov eax,ecx3dea0a7c c1f804 sar eax,43dea0a7f 99 cdq3dea0a80 6a64 push 64h3dea0a82 59 pop ecx3dea0a83 f7f9 idiv eax,ecx3dea0a85 57 push edi3dea0a86 99 cdq3dea0a87 f77d10 idiv eax,dword ptr [ebp+10h]3dea0a8a e8600cf3ff call mshtml!CreateHTMLPropertyPage+0x42b05 (3ddd16ef) mshtml!IERegisterXMLNS+0x9bfa5:3dea0a8f 8b450c mov eax,dword ptr [ebp+0Ch]3dea0a92 c70601000000 mov dword ptr [esi],13dea0a98 8b4010 mov eax,dword ptr [eax+10h]3dea0a9b 894604 mov dword ptr [esi+4],eaxmshtml!IERegisterXMLNS+0x9bfb4:3dea0a9e 5f pop edi3dea0a9f 895e08 mov dword ptr [esi+8],ebx3dea0aa2 5b pop ebx3dea0aa3 5d pop ebp3dea0aa4 c20c00 ret 0Ch //这⾥是函数结尾,注意最后字节地址不等于⾏⾸地址!在windbg下⽤.writemem导出该段函数代码0:000> .writemem d:\temp\test.bin 3dea0a43 3dea0aa6然后⽤IDA打开test.bin设定载⼊的偏移为函数原来的地址0x3dea0a43。
提取数据的函数
提取数据是很常见的编程任务,往往需要使用特殊的函数来完成。
SQL语句提取数据的函数有SELECT、FROM、WHERE、GROUP BY和HAVING等;MySQL中还有DISTINCT、ORDER BY、LIMIT等。
Python语言中提取数据的函数有map()、filter()、zip()、sorted()等;列表推导式也是提取数据的一种方式,形式为[expression for item in iterable]。
R语言中用于提取数据的函数有subset()、aggregate()、merge()等;dplyr包中也有相应的函数用于提取数据,例如filter(),
arrange(),select(),group_by()等等。
JavaScript中用于提取数据的函数有find()、findIndex()、
filter()等;ES6新增的函数有Array.from()、Array.of()、
Array.prototype.fill()、Array.prototype.find()、
Array.prototype.findIndex()等。
C语言中用于提取数据的函数主要有strtok()、strchr()、
strstr()、fgets()、fread()等;同时还有一些比较常用的库函数,
例如atoi()、atof()等,也能够用于提取数据。
Matlab中比较常用的提取数据函数有table2array()、
struct2array()、ismember()、unique()等。
总之,根据不同的需要,不同的编程语言都可以使用各种函数来
提取数据。
反汇编入门教程(适合新手看)一、反汇编基础知识1.反汇编的目的反汇编的目的在于研究和修改程序代码。
将二进制代码转换为汇编代码后,我们可以理解程序的操作和逻辑,更容易进行代码分析和修改。
2.反汇编的工具常用的反汇编工具有IDAPro,0llyDbg等。
它们可以在不运行程序的情况下分析程序的代码,帮助我们理解程序的逻辑和结构。
3.反汇编的方法反汇编可以分为静态反汇编和动态反汇编两种方法。
静态反汇编是通过分析二进制文件进行反汇编,而动态反汇编则是基于程序运行时的反汇编。
两种方法各有优缺点,需要根据实际情况选择合适的方法。
二、反汇编的入门流程反汇编需要一定的汇编和计算机基础知识,下面是反汇编的入门流程:1.准备工作首先需要安装反汇编工具,如IDAPro软件,并准备一份需要分析的程序。
2.打开程序打开需要分析的程序,可以用IDAPro软件进行打开。
在打开程序时,选择正确的文件格式和架构,以便正确解析二进制代码。
3.分析程序打开程序后,就可以对程序进行分析。
首先是可执行文件的头部分析,这一部分包括程序入口点,文件大小等信息。
然后是代码分杉逐段分析程序,查找代码中有用的信息。
4.反汇编代码在分析程序代码后,就可以使用反汇编工具将代码转换为汇编代码并进一步分析代码逻辑和结构。
在IDAPro软件中,选择需要反汇编的代码段,然后点击反汇编按钮即可。
5.理解代码反汇编后,我们需要理解汇编代码的含义和逻辑,以便进一步分析代码和修改程序。
这需要一定的汇编和计算机基础知识。
三、反汇编常用技巧1.查找字符串和函数反汇编时,可以根据关键字查找字符串和函数。
在IDAPro软件中使用搜索功能进行查找,可以快速定位到对应的代码段。
2.重命名变量和函数反汇编时,如果代码中的变量或函数名称不具有可读性,可以使用重命名功能对它们进行重命名。
在IDAPro软件中,可以选定代码段,然后使用重命名功能进行重命名。
3.调试程序反汇编时,可以使用调试功能来检查程序的行为和操作。
linux查看.elf文件的函数Linux是一个开源操作系统,广泛应用于服务器、嵌入式设备和个人计算机等领域。
在Linux系统中,.elf是常见的二进制可执行文件格式,通常用于存储程序的机器代码。
.elf文件中包含了程序的指令、数据以及其他与程序执行有关的信息。
本文将详细介绍如何在Linux系统中查看.elf文件的函数。
首先,我们需要了解如何获取.elf文件的函数信息。
Linux系统提供了一些工具和命令,可以帮助我们实现这个目标。
以下是一些常用的方法:1. readelf命令:readelf命令是一个功能强大的工具,可以用于分析和展示.elf文件的各种信息,包括函数。
使用该命令的基本语法如下:shellreadelf -s <elf文件名>其中,`-s`选项用于显示.elf文件的符号表信息,包括函数和全局变量等。
通过运行上述命令,我们可以获取.elf文件中的所有函数信息。
2. nm命令:nm命令是另一个常用的工具,可以用于列出.elf文件中的符号信息,包括函数。
使用该命令的基本语法如下:shellnm <elf文件名>运行上述命令后,nm将会按照字母顺序列出.elf文件中的所有符号信息,包括函数的地址和名称等。
3. objdump命令:objdump命令是一个功能强大的反汇编工具,可以用于显示.elf文件中的汇编代码。
使用该命令的基本语法如下:shellobjdump -d <elf文件名>`-d`选项用于显示.elf文件的反汇编代码。
通过运行上述命令,我们可以获取.elf文件中函数的反汇编代码。
有了这些工具和命令,我们可以进一步分析和了解.elf文件中的函数。
下面是一些进一步的细节和注意事项:1. 函数名和地址:可以通过查看.elf文件中的符号表信息或者反汇编代码,获取每个函数的名称和地址。
函数名通常是字符串形式,地址是函数在内存中的偏移量或者绝对地址。
2. 函数参数和返回值:通常情况下,.elf文件中的函数信息并不包含关于函数参数和返回值的详细信息。
数据提取函数数据提取函数的作用是从给定的数据集中提取出特定的信息。
它可以帮助我们快速准确地获取所需的数据,提高工作效率。
下面将介绍几种常见的数据提取函数及其用法。
一、VLOOKUP函数VLOOKUP函数是Excel中常用的数据提取函数之一。
它用于在指定的数据范围中查找某个值,并返回与之对应的值。
VLOOKUP函数的基本语法如下:VLOOKUP(lookup_value, table_array, col_index, range_lookup)其中,lookup_value是要查找的值;table_array是要进行查找的数据范围;col_index是要返回的值所在列的索引;range_lookup是一个逻辑值,表示是否要进行模糊匹配。
二、INDEX和MATCH函数INDEX和MATCH函数结合起来使用,也可以实现数据的提取。
INDEX函数用于返回给定范围中的某个单元格的值,而MATCH函数则用于在指定的数据范围中查找某个值所在的位置。
两者结合使用可以实现更灵活的数据提取。
其基本语法如下:INDEX(array, row_num, [column_num])MATCH(lookup_value, lookup_array, [match_type])其中,array是要返回的数据范围;row_num和column_num是要返回的值所在单元格的行号和列号;lookup_value是要查找的值;lookup_array是要进行查找的数据范围;match_type是一个可选参数,表示查找的方式。
三、FILTER函数FILTER函数是Google Sheets中的一个非常强大的数据提取函数。
它可以根据指定的条件从数据集中筛选出符合条件的数据,并返回一个新的数据集。
其基本语法如下:FILTER(range, condition1, [condition2, ...])其中,range是要筛选的数据范围;condition1、condition2等是要满足的条件。
从其他表格中提取数据的函数在Excel中,可以使用多种函数来从其他表格中提取数据。
以下是一些建议的函数以及其基本用法的参考内容:1. VLOOKUP函数:VLOOKUP函数用于按照指定的条件在一个表格中进行垂直查找,并返回与该条件匹配的对应单元格的数值。
其基本语法如下:VLOOKUP(lookup_value, table_array, col_index_num,[range_lookup])其中,- lookup_value是要查找的值。
- table_array是要进行查找的表格范围。
- col_index_num是要返回的结果所在的列数。
- range_lookup是一个可选的参数,用于指定是否进行近似匹配。
例如,可以使用以下函数从表格B中提取表格A中对应的数据:=VLOOKUP(A2, Sheet1!B2:C10, 2, False)2. INDEX函数:INDEX函数用于根据给定的行和列数,返回表格中对应位置的数值。
其基本语法如下:INDEX(array, row_num, [column_num])- array是要进行查找的表格范围。
- row_num是要返回的结果所在的行数。
- column_num是要返回的结果所在的列数。
例如,可以使用以下函数从表格B中提取第2行第3列的数据:=INDEX(Sheet1!B2:C10, 2, 3)3. OFFSET函数:OFFSET函数用于从表格的指定位置偏移,并返回一个新的范围。
其基本语法如下:OFFSET(reference, rows, cols, [height], [width])其中,- reference是要进行偏移的参考位置。
- rows和cols是偏移的行数和列数。
- height和width是要返回的范围的高度和宽度。
例如,可以使用以下函数从表格B中提取表格A中对应范围的数据:=OFFSET(Sheet1!B2:C10, 0, 0, 9, 2)4. MATCH函数:MATCH函数用于在一列或一行中查找指定的值,并返回其在表格中的相对位置。
矿产资源开发利用方案编写内容要求及审查大纲
矿产资源开发利用方案编写内容要求及《矿产资源开发利用方案》审查大纲一、概述
㈠矿区位置、隶属关系和企业性质。
如为改扩建矿山, 应说明矿山现状、
特点及存在的主要问题。
㈡编制依据
(1简述项目前期工作进展情况及与有关方面对项目的意向性协议情况。
(2 列出开发利用方案编制所依据的主要基础性资料的名称。
如经储量管理部门认定的矿区地质勘探报告、选矿试验报告、加工利用试验报告、工程地质初评资料、矿区水文资料和供水资料等。
对改、扩建矿山应有生产实际资料, 如矿山总平面现状图、矿床开拓系统图、采场现状图和主要采选设备清单等。
二、矿产品需求现状和预测
㈠该矿产在国内需求情况和市场供应情况
1、矿产品现状及加工利用趋向。
2、国内近、远期的需求量及主要销向预测。
㈡产品价格分析
1、国内矿产品价格现状。
2、矿产品价格稳定性及变化趋势。
三、矿产资源概况
㈠矿区总体概况
1、矿区总体规划情况。
2、矿区矿产资源概况。
3、该设计与矿区总体开发的关系。
㈡该设计项目的资源概况
1、矿床地质及构造特征。
2、矿床开采技术条件及水文地质条件。