首页
社区
课程
招聘
[原创]如何制作vc静态链接库的IDA SIG文件?
发表于: 2008-4-17 17:52 47632

[原创]如何制作vc静态链接库的IDA SIG文件?

2008-4-17 17:52
47632

很多天前,有人提出这个问题。当时没有想到用lib.exe,以为自己要重新发明一个轮子ar2.exe,才可能解析出MS LIB文件中的OBJ文件。今天又看见有人发贴,再次dig一下,不过如此...

下面是在命令行上制作的过程,环境是WinXP+NTFS+VS2003,在我的机子上运行无误。破折号之间的引用都是命令行。

附件是制作好的SIG文件,可以准确地解析出printf()函数,当然还有其它很多很多库函数。

Step 1:
将libc.lib, libcd.lib, libcmt.lib, libcmtd.lib从原文件夹下复制过来。
For:
避免在命令行上输入过长的路径

Step 2:
-----------------
set path = %path%;C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin
set path = %path%;C:\Program Files\IDA\addons\Flair.v5.20\bin
-----------------
设置要调用的程序的路径,在你的机子上不一定如此

Step 3:
-----------------------------
for %i in (*.lib) do md %i.fdr
-----------------------------
For: 新建存放对象文件的文件夹

Step 4:
-----------------------------
cd v:\libc.lib.fdr
for /F "skip=3"  %i in ('link.exe -lib /list ..\libc.lib') do link.exe -lib /extract:%i ..\libc.lib

cd v:\libcd.lib.fdr
for /F "skip=3"  %i in ('link.exe -lib /list ..\libcd.lib') do link.exe -lib /extract:%i ..\libcd.lib

cd v:\libcmt.lib.fdr
for /F "skip=3"  %i in ('link.exe -lib /list ..\libcmt.lib') do link.exe -lib /extract:%i ..\libcmt.lib

cd v:\libcmtd.lib.fdr
for /F "skip=3"  %i in ('link.exe -lib /list ..\libcmtd.lib') do link.exe -lib /extract:%i ..\libcmtd.lib

-----------------------------
For: 依次提取libc.lib, libcd.lib, libcmt.lib, libcmtd.lib中的所有对象文件。

Step 5:
--------------------------
for %i in (.\libc.lib.fdr\*.obj) do pcf.exe -g0 %i
for %i in (.\libcd.lib.fdr\*.obj) do pcf.exe -g0 %i
for %i in (.\libcmt.lib.fdr\*.obj) do pcf.exe -g0 %i
for %i in (.\libcmtd.lib.fdr\*.obj) do pcf.exe -g0 %i
-------------------------
pcf.exe -g0 .\libc.lib.fdr\*.obj
pcf.exe -g0 .\libcd.lib.fdr\*.obj
pcf.exe -g0 .\libcmt.lib.fdr\*.obj
pcf.exe -g0 .\libcmtd.lib.fdr\*.obj
-------------------------
For: 由.obj文件生成.pat文件。为了避免pcf.exe在执行的过程中处理非COFF文件时中断、出现提示信息“is not ar/coff file\npress enter to exit”,加上参数"-g0"。

Step 6:
-------------------------
sigmake -n"VC7 Static Lib (ST/MT & Rel/Dbg) By TnTTools" libc.lib.fdr\*.pat+libcd.lib.fdr\*.pat+libcmt.lib.fdr\*.pat+libcmtd.lib.fdr\*.pat vc7libc
See the documentation to learn how to resolve collisitions.
: modules/leaves: 9021136/3610, COLLISIONS: 2690
-------------------------
sigmake -n"VC7 Static Lib (ST/MT & Rel/Dbg) By TnTTools" libc.lib.fdr\*.pat+libcd.lib.fdr\*.pat+libcmt.lib.fdr\*.pat+libcmtd.lib.fdr\*.pat vc7libc
--------------------------
For: 转化成SIG文件vc7libc.sig,在这里我把四个静态库文件放在一起,当然你可以分开放。通过第一次运行sigmake,知道有冲突存在。手工编辑.EXE文件后再次运行sigmake,生成vc7libc.sig。见附件。

[举例]

使用前
.text:00402A03                 push    offset aUsage   ; " Usage: \n"
.text:00402A08                 call    sub_403772
.text:00402A0D                 add     esp, 4
.text:00402A10                 push    offset aHashH   ; "   hash -h\n"
.text:00402A15                 call    sub_403772
.text:00402A1A                 add     esp, 4
使用后
.text:00402A03                 push    offset aUsage   ; " Usage: \n"
.text:00402A08                 call    _printf
.text:00402A0D                 add     esp, 4
.text:00402A10                 push    offset aHashH   ; "   hash -h\n"
.text:00402A15                 call    _printf
.text:00402A1A                 add     esp, 4

TnTTools
The Art Of Reverse Engineering
Enjoy it.

注意,我在这里讨论的仅是一种很特别的情况:VC静态库文件libc.lib, libcmt.lib。原因起源于论坛上网友的一个疑问。如果直接调用pcf.exe处理这两个文件会遇到问题。
没有必要编写什么程序来包裹它,一是它根本不是万能的SIG制作流程,在实际中,各种情况都有可能遇到;二是我们需要了解CONSOLE下STDOUT的各种输出信息(大部分人不感兴趣);三是自动处理EXC后的手工编辑必不可少(至少在我看来如此)。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (27)
雪    币: 250
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
运气好,上来就看见好东西了,收藏+学习
2008-4-17 21:31
0
雪    币: 211
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
好,谢谢了

整理了一下,做了个bat文件,使用格式为 lib2sig.bat [your lib flie name]
但是还是一些人工干预,不知各位有何良策?

非常感谢楼主提供的/extract选项。
上传的附件:
2008-4-17 22:10
0
雪    币: 297
活跃值: (27)
能力值: ( LV13,RANK:380 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=百家拳;442531]好,谢谢了

整理了一下,做了个bat文件,使用格式为 lib2sig.bat [your lib flie name]
但是还是一些人工干预,不知各位有何良策?

非常感谢楼主提供的/extract选项。[/QUOTE]

大家都是地球人,真的是想法一样。我原本也想写脚本,名字和你的一模一样,思路和你的基本一样。为什么没有写出来,因为for命令不支持%1的解析,下面这句解析有问题。
for /F "skip=3"  %%i in ('link.exe -lib /list %1') do link.exe -lib /extract:%%i %1

暂时没有想到好办法,或许WSH、JS可能可以实现,不知谁有兴趣写出来。
2008-4-18 00:25
0
雪    币: 1946
活跃值: (248)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
5
好 贴 必 顶
2008-4-18 03:58
0
雪    币: 208
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
十分感谢tnttools  我一直都没有自己做vc静态库的.sig文件(惭愧一下)

不过你的我还没试 现在在忙其他的事

最后对你赞一个
2008-4-19 18:58
0
雪    币: 277
活跃值: (106)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
7
找了一下批处理命令,重新整理了一个,里面有使用说明哈。
另外该了一下pcf程序里面的跳转,把里面要求输入回车的地方跳过了
上传的附件:
2008-4-19 19:08
0
雪    币: 200
活跃值: (163)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
shs
8
看不懂啊!!学习一下。
2008-4-20 08:15
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
好贴啊,先保存,再收藏。
我觉得这个应该加精啊,虽然都是基本的命令行,但lz搞得这么清晰的,应该加精
2008-4-20 12:26
0
雪    币: 213
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
好好学习一下,很不错
2008-4-23 20:20
0
雪    币: 223
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rst
11
做sig文件,没必要将lib文件解开吧?
楼主你是不是弄错了
2008-4-24 14:47
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
... 学习学习
2008-4-24 17:27
0
雪    币: 254
活跃值: (15)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
mark一下,支持tnttools。
2008-4-25 21:32
0
雪    币: 390
活跃值: (15)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
14
赞赞赞赞赞赞
2008-6-25 21:48
0
雪    币: 215
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
很好,支持一个
2008-6-25 23:28
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
支持
2008-7-10 14:23
0
雪    币: 563
活跃值: (95)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
顶 学习!!!!!!
2008-7-10 15:12
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
www
18
十分感谢tnttools  我一直都没有自己做vc静态库的.sig文件(惭愧一下)

不过你的我还没试 现在在忙其他的事
2008-7-27 11:23
0
雪    币: 69
活跃值: (342)
能力值: ( LV9,RANK:550 )
在线值:
发帖
回帖
粉丝
19
留个座位,宽带下载
2008-7-29 11:21
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
大家都能做了?我在最后一步还是出错了,不知道什么叫“手工编辑.EXE文件后再次运行sigmake”

我做了一个vc2008的文件
上传的附件:
2008-8-21 20:13
0
雪    币: 130
活跃值: (66)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
找了好久啊,感动!! 
2010-3-10 09:03
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
看不懂啊!!学习一下。
2010-6-10 09:30
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
对批处理不太熟写了个js脚本,修改一下就可以使用了
lib2sig.rar
上传的附件:
2011-3-20 16:47
0
雪    币: 80
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
谢谢楼主了!好好学习一下!
2011-4-25 11:34
0
雪    币: 33
活跃值: (56)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
lib2sig
命令行 lib2sig my.lib
生成my.sig
根目录下
放LINK.EXE pcf.exe sigmake.exe dumpsig.exe
大家也可以自己根据需要定义环境变量注释掉那几句复制这几个文件到子目录下
-------------------------------------
@echo off
md %1_objs
copy sigmake.exe %1_objs\sigmake.exe
copy pcf.exe %1_objs\pcf.exe
copy %1 %1_objs\%1
copy LINK.EXE %1_objs\LINK.EXE
copy dumpsig.exe %1_objs\dumpsig.exe
cd %1_objs
for /F %%i in ('link -lib /list %1') do link -lib /extract:%%i %1
for %%i in (*.obj) do pcf %%i
setlocal
set fn=%~n1
sigmake -n"%1" *.pat %fn%.sig
endlocal
if exist %1.exc for %%i in (%1.exc) do find /v ";" %%i > %1_tmp.exc
if exist %1.exc for %%i in (%1.exc) do > %1_tmp.exc more +2 "%%i"
copy %1_tmp.exc %1.exc
del %1_tmp.exc
setlocal
set fn=%~n1
sigmake -n"%1" *.pat %fn%.sig
copy %fn%.sig ..\%fn%.sig
endlocal
cd ..
del %1_objs /s /q
rd %1_objs
-------------------------------------
2011-11-11 13:36
0
游客
登录 | 注册 方可回帖
返回
//