IDA签名的制作与应用
如何生成一个.obj文件
整个编译过程分为预编译、编译和汇编,最终生成可执行文件,其中在windows下生成 .obj文件,在linux
下生成 .o文件,学名叫做二进制可重定位文件
Linux
(1)预编译:
gcc -E *.c -o *.i
预编译要干的事情:如删除注释、替换宏、递归展开头文件、处理以#开头的预编译指令等,在预编译阶段不做任何 有效信息的类型检查。
(2)编译:
gcc -S *.i -o *.s
词法分析、语法分析和语义分析、代码的优化、编译、汇总所有的所有的符号
(3)汇编:
gcc [-m64] [-O2] -c *.s -o *.o
将汇编指令转换为特定平台下的机器语言、构建*.o文件组成格式。
整个编译过程分为预编译、编译和汇编,最终生成可执行文件,其中在windows下生成 .obj文件,在linux
下生成 .o文件,学名叫做二进制可重定位文件
windows
cl -c [/O2] *.c
会生成和源文件同名的obj文件,cl是vs自带的编译器
注意由于sig文件的原理是记住这个函数的部分字节,所以当平台(x86和x64)和是否优化(debug和release)的不同都会影响sig文件,如果是x86平台和release的二进制文件,那么就要用 x86的cl和/O2编译选项来生成obj文件
将obj打包成lib文件
lib -out:*.lib *.obj
lib 在vs的本地工具命令提示符中
将obj和lib制作成pat文件
pcf *.obj
pcf *.lib
将pat文件制作成 sig
文件
sigmake *.pat <signame>.sig
可能会出现以下错误
See the documentation to learn how to resolve collisitions.
: modules/leaves: 41362018/5, COLLISIONS: 4
这是由函数冲突了,并且生成了后缀为exc
的文件
;--------- (delete these lines to allow sigmake to read this file)
;add '+' at the start of a line to select a module
;add '-' if you are not sure about the selection
;do nothing if you want to exclude all modules
这些代码的目的是告诉你如何解决冲突,以成功生成签名。你需要做的头件大事是删除4行以分号开头的代码,否则,sigmake
将无法在随后的执行过程中解析排斥文件。下一步是告诉sigmake
你希望如何解决冲突。
- 为最大限度地减少冲突,请删除排斥文件开头的4个注释行。
- 最多只能给冲突函数组中的一个函数附加
+/-
。 - 如果一个冲突函数组仅包含一个函数,不要在该函数前附加
+/-
,让它保持原状即可。 sigmake
连续运行失败会将数据(包括注释行)附加到现有的任何排斥文件后。在再次运行sigmake
之前,你必须删除这些额外的数据,并更正原始数据(如果这些数据是正确的,sigmake
将不会再次运行失败)。
更改排斥文件后,你必须保存这个文件,并使用你最初使用的命令行参数
pcf.exe 和 sigmake.exe 都是IDA自带的
为sig文件添加描述
sigmake -n"<描述>" *.pat <signame>.sig
加载sig文件
将生成的sig文件放入ida
目录的sig\pc目录下即可加载
应用符号
点击左上角菜单 View -> open SubViews-> Signatures,打开符号窗口
右键 然后选择 apply new signature,然后选择你要加载的符号