二进制分析
未读书写规则¶
规则包含两个部分,一个是依赖关系,一个是生成目标的方法。
在Makefile中,规则的顺序是很重要的,因为,Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,所以一定要让make知道你的最终目标是什么。一般来说,定义在Makefile中的目标可能会有很多,但是第一条规则中的目标将被确立为最终的目标。如果第一条规则中的目标有很多个,那么,第一个目标会成为最终的目标。make所完成的也就是这个目标。
好了,还是让我们来看一看如何书写规则。
规则举例¶
12foo.o: foo.c defs.h # foo模块 cc -c -g foo.c
看到这个例子,各位应该不是很陌生了,前面也已说过, foo.o 是我们的目标, foo.c 和 defs.h 是目标所依赖的源文件,而只有一个命令 cc -c -g foo.c (以Tab键开头)。这个规则告诉我们两件事:
文件的依赖关系, foo.o 依赖于 foo.c 和 defs.h 的文件,如果 foo.c 和 defs.h 的文件日期要比 foo.o 文件日期要新,或是 foo.o 不 ...
书写命令¶
每条规则中的命令和操作系统Shell的命令行是一致的。make会一按顺序一条一条的执行命令,每条命令的开头必须以 Tab 键开头,除非,命令是紧跟在依赖规则后面的分号后的。在命令行之间中的空格或是空行会被忽略,但是如果该空格或空行是以Tab键开头的,那么make会认为其是一个空命令。
我们在UNIX下可能会使用不同的Shell,但是make的命令默认是被 /bin/sh ——UNIX的标准Shell 解释执行的。除非你特别指定一个其它的Shell。Makefile中, # 是注释符,很像C/C++中的 // ,其后的本行字符都被注释。
显示命令¶
通常,make会把其要执行的命令行在命令执行前输出到屏幕上。当我们用 @ 字符在命令行前,那么,这个命令将不被make显示出来,最具代表性的例子是,我们用这个功能来向屏幕显示一些信息。如:
1@echo 正在编译XXX模块......
当make执行时,会输出“正在编译XXX模块……”字串,但不会输出命令,如果没有“@”,那么,make将输出:
12echo 正在编译XXX模块......正在编译XXX模块......
如果mak ...
二进制分析
未读makefile介绍¶
make命令执行时,需要一个makefile文件,以告诉make命令需要怎么样的去编译和链接程序。
首先,我们用一个示例来说明makefile的书写规则,以便给大家一个感性认识。这个示例来源于gnu 的make使用手册,在这个示例中,我们的工程有8个c文件,和3个头文件,我们要写一个makefile来告诉make命令如何编译和链接这几个文件。我们的规则是:
如果这个工程没有编译过,那么我们的所有c文件都要编译并被链接。
如果这个工程的某几个c文件被修改,那么我们只编译被修改的c文件,并链接目标程序。
如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的c文件,并链接目标程序。
只要我们的makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自动编译所需要的文件和链接目标程序。
makefile的规则¶
在讲述这个makefile之前,还是让我们先来粗略地看一看makefile的规则。
1234target ... : prerequisite ...
二进制分析
未读Makefile概述¶
什么是makefile?或许很多Windows的程序员都不知道这个东西,因为那些Windows的集成开发环境(integrated development environment,IDE)都为你做了这个工作,但我觉得要作一个好的和专业的程序员,makefile还是要懂。这就好像现在有这么多的HTML编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标签的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。
因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计其数,并且按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效 ...
二进制分析
未读写个简单的Makefile做开场白
需要说明一下,文档目录结构是用户目录HOME下有src incl bin lib。
src:源码
incl:头文件
bin:执行码
lib:静态/动态库
这是大家最常见的Linux编程目录结构,以下代码编译都是依据这个结构。
简单的Makefile代码
12345hello:hello.c gcc -I${HOME}/incl -c hello.c gcc -o hello hello.o rm -f hello.o mv hello ${HOME}/bin
没接触过Makefile的同学肯定能看出,这段代码不就是把编译、链接、删除、移动写成shell脚本执行吗?没错的,把第一行去掉,其他代码粘贴到shell脚本里同样可以编译成功,一点问题都没有。
Makefile结构说明
Makefile里主要包含了五个东西:变量定义、显式规则、隐晦规则、文件指示和注释。
1、变量的定义。在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点像C语言中的宏,当Makefile被执行时,其中的变量都会被扩展 ...
Vulnerabilities
未读关于数据集,文献[1]发现了一些问题:
深度学习模型在漏洞检测上能够成功的一个重要条件是庞大的漏洞代码数据样本的支撑,我们需要大规模数据集来可靠评估深度学习方法对漏洞检测的影响,随着可用培训数据量的增加,不同架构的相对性能会发生根本性变化。
LLMs比GNNs更能够利用大规模数据集:**更大的数据集仅轻微提高了ReVeal的表现,但显著提高了LLMs的表现。**然而,我们的实验表明,通过收集更多数据来提高性能可能已经停滞。**与普遍认为对于LLMs表现良好,模型大小是最重要因素不同,我们的结果显示,最重要的因素可能是LLM的训练方式。**在代码理解任务的预训练似乎能够带来很大的改善。我们认为开发更好的代码特定预训练任务是改善基于深度学习的漏洞检测的一个有前途的研究方向。
此外,我们**确定了一个部署基于深度学习模型的重要泛化挑战。**要部署一个模型,我们需要检测新软件项目中的漏洞,这些漏洞在训练集中没有出现。我们发现,在这种情况下,深度学习模型表现非常糟糕。然而,在实践中,我们经常希望在新项目上运行漏洞检测工具,因此在训练集中不会有该项目的任何漏洞。所有模型在未见项目上的性 ...
Vulnerabilities
未读C/C++漏洞数据集-CSDN博客
1.常用数据集
1.1.Big-Vul
论文地址:A C/C++ Code Vulnerability Dataset with Code Changes and CVE Summaries
github地址
该数据集存储为csv格式。包含了漏洞行号信息,详细参考github地址。
https://github.com/ZeoVan/MSR_20_Code_vulnerability_CSV_Dataset
1.2.Reveal
Reveal本为一个DLVD(Deep Learning Vulnerbility Detection)方法,可以参考Reveal。而作者收集了一个数据集。从Linux Debian Kernel 和Chromium的vulnerabilitiy fixed patches中构造。
论文地址:Deep Learning based Vulnerability Detection:Are We There Yet?
数据集下载地址
包含2个json,vulnerables.json和non-vulnerables.json。 ...
Linux
未读123456789101112131415161718192021222324make是用来编译的,它从Makefile中读取指令,然后编译。make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。make 的作用是开始进行源代码编译,以及一些功能的提供,这些功能由他的 Makefile 设置文件提供相关的功能。比如 make install 一般表示进行安装,make uninstall 是卸载,不加参数就是默认的进行源代码编译。最常见的几个目标:make all:编译程序、库、文档等(等同于make)make install:安装已经编译好的程序。复制文件树中到文件到指定的位置make unistall:卸载已经安装的程序。make clean:删除由make命令产生的文件make distclean:删除由./configure产生的文件make check:测试刚刚编译的软件(某些程序可能不支持)make installcheck:检查安装的库和程序(某些程序可能不支持)make dist:重新打包成packname-version.tar.g ...
Linux
未读在终端执行Linux命令时,有时需要顺序执行多行命令,每行命令的执行时间可能会很长时间,如果人为的逐条输入执行则会非常麻烦和不确定,也会很浪费时间。
这时,就需要Linux顺序执行多行命令了,命令之间需要用连接符连接,不同的连接符有不同的效果,具体如下:
分号;——没有任何逻辑关系的连接符。当多个命令用分号连接时,各命令之间的执行成功与否彼此没有任何影响,都会一条一条执行下去。
逻辑或|| ——当用此连接符连接多个命令时,前面的命令执行成功,则后面的命令不会执行。前面的命令执行失败,后面的命令才会执行。
逻辑与&& ——当用此连接符连接多个命令时,前面的命令执行成功,才会执行后面的命令,前面的命令执行失败,后面的命令不会执行,与 || 正好相反。
管道符| ——当用此连接符连接多个命令时,前面命令执行的正确输出,会交给后面的命令继续处理。若前面的命令执行失败,则会报错,若后面的命令无法处理前面命令的输出,也会报错。
linux恢复使用rm命令删除的文件
linux的文件被rm命令删除是可以通过linux自带的文件恢复工具debugfs来恢复的。
1.查看当前系统版本号及文件系统格式
image.png
2. 使用debugfs来恢复。
1)打开被删除文件所在的分区
2)用ls -d显示被删除的文件
3)执行logdump –i 命令
4)退出
image.png
3.执行dd命令
其中bs对应上面offset的值,skip对应上面block的值
image.png
4.恢复成功
作者:日常采坑君
链接:https://www.jianshu.com/p/43aa40a5609e
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。