首页
论坛
课程
招聘
[原创]如何制作vc静态链接库的IDA SIG文件?
2008-4-17 17:52 45720

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

2008-4-17 17:52
45720
很多天前,有人提出这个问题。当时没有想到用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后的手工编辑必不可少(至少在我看来如此)。

[2022冬季班]《安卓高级研修班(网课)》月薪三万班招生中~

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (27)
雪    币: 243
活跃值: 活跃值 (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
amour 活跃值 2008-4-17 21:31
2
0
运气好,上来就看见好东西了,收藏+学习
雪    币: 209
活跃值: 活跃值 (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
百家拳 活跃值 2008-4-17 22:10
3
0
好,谢谢了

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

非常感谢楼主提供的/extract选项。
上传的附件:
雪    币: 213
活跃值: 活跃值 (26)
能力值: ( LV13,RANK:380 )
在线值:
发帖
回帖
粉丝
tnttools 活跃值 9 2008-4-18 00:25
4
0
[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可能可以实现,不知谁有兴趣写出来。
雪    币: 1836
活跃值: 活跃值 (153)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
Bughoho 活跃值 8 2008-4-18 03:58
5
0
好 贴 必 顶
雪    币: 201
活跃值: 活跃值 (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
BeQuick 活跃值 2008-4-19 18:58
6
0
十分感谢tnttools  我一直都没有自己做vc静态库的.sig文件(惭愧一下)

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

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

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

我做了一个vc2008的文件
上传的附件:
雪    币: 124
活跃值: 活跃值 (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ouyangtian 活跃值 2010-3-10 09:03
21
0
找了好久啊,感动!! 
雪    币: 207
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xtxxp 活跃值 2010-6-10 09:30
22
0
看不懂啊!!学习一下。
雪    币: 211
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
antno 活跃值 2011-3-20 16:47
23
0
对批处理不太熟写了个js脚本,修改一下就可以使用了
lib2sig.rar
上传的附件:
雪    币: 80
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
五月雪Snow 活跃值 2011-4-25 11:34
24
0
谢谢楼主了!好好学习一下!
雪    币: 33
活跃值: 活跃值 (56)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gaozhihan 活跃值 2011-11-11 13:36
25
0
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
-------------------------------------
游客
登录 | 注册 方可回帖
返回