本文为在学习过程中的笔记,写的不好请见谅.
在使用IDA的过程中,由于缺少符号文件,有些库函数不能识别.
例
int main(int argc, char* argv[])
{
printf("Hello World!\n");
return 0;
}
.text:00401000 _main proc near ; CODE XREF: start+AFp
.text:00401000 push offset aHelloWorld ; "Hello World!\n"
.text:00401005 call sub_401010
.text:0040100A add esp, 4
.text:0040100D xor eax, eax
.text:0040100F retn
.text:0040100F _main endp
库函数printf并没有识别出来,而是
call sub_401010
以上述为例,制作printf.sig文件
查找printf.obj
在命令行输入 link-lib /list libc.lib
可以查看该库文件中所包含的所有obj文件,其中有一项为
build\intel\st_obj\printf.obj
提取printf.obj
在命令行输入link-lib /EXTRACT:build\intel\st_obj\printf.obj libc.lib
在当前目录下会产生一个printf.obj的文件
提取printf.obj特征码
在命令行中输入pcf printf.obj
在当前目录下会产生一个printf.pat的文件
制作sig文件
在命令行中输入sigmakeprintf.pat printf.sig
在当前目录下会产生一个printf.sig的文件
将printf.sig拷贝到IDA中的sig文件夹中,sig文件制作完成
在IDA中添加printf.sig文件后,printf即可识别
.text:00401000 _main proc near ; CODE XREF: start+AFp
.text:00401000 push offset aHelloWorld ; "Hello World!\n"
.text:00401005 call _printf
.text:0040100A add esp, 4
.text:0040100D xor eax, eax
.text:0040100F retn
.text:0040100F _main endp
批处理
由于lib里边有很多obj所以这里用批处理文本来写,从《C++反汇编与逆向分析》得到以下代码
md %1_objs
cd %1_objs
for /F %%i in ('link -lib /list %1.lib') do link -lib /extract:%%i %1.lib
for %%i in (*.obj) do pcf %%i
sigmake -n"%1.lib" *.pat %1.sig
if exist %1.exc for %%i in (%1.exc) do find /v ";" %%i > abc.exc
if exist %1.exc for %%i in (%1.exc) do > abc.exc more +2 "%%i"
copy abc.exc %1.exc
del abc.exc
sigmake -n"%1.lib" *.pat %1.sig
copy %1.sig ..\%1.sig
cd ..
del %1_objs /s /q
rd %1_objs