??xml version="1.0" encoding="utf-8" standalone="yes"?>
作者:
AGanNo2
Email:AGanNo2@163.com
1.VC
?/span>
IDE
在编译链接做了些什?/span>
用惯?span lang="EN-US" style="FONT-FAMILY: Verdana">VC?span lang="EN-US" style="FONT-FAMILY: Verdana">IDE下习惯性的点击“compile?/span>?span lang="EN-US" style="FONT-FAMILY: Verdana">“build?/span>的可能不知道在你按下q些按钮?span lang="EN-US" style="FONT-FAMILY: Verdana">IDE在背后到底做了写什么,对于熟悉命o行下q行~译链接的h?span lang="EN-US" style="FONT-FAMILY: Verdana">cl.exe?span lang="EN-US" style="FONT-FAMILY: Verdana">link.exe?span lang="EN-US" style="FONT-FAMILY: Verdana">rc.exeq些~译链接的工具不是陌生的Q在q里我ƈ不想讨论q些工具怎样q行~译的以及那些名目繁多的选项参数Q而是?span lang="EN-US" style="FONT-FAMILY: Verdana">?/span>亚微?span lang="EN-US" style="FONT-FAMILY: Verdana">?img height="19" src="http://m.shnenglu.com/Emoticons/regular_smile.gif" width="19" border="0" />上揭开在你点击那些按钮之后Q?span lang="EN-US" style="FONT-FAMILY: Verdana">IDE在背后干的事情,肯定有初学者像我一h了解Q当焉?span lang="EN-US" style="FONT-FAMILY: Verdana">unix/linux下的E序员以及会?span lang="EN-US" style="FONT-FAMILY: Verdana">makefile来组l编译链接进E的Profession的程序员׃用看下去了?/p>
2.vcspawn
的选项和参?/span>
vcspawnQ突然说到这个可能很多不大熟Q其实在你点击那些按钮的时候,q不是由IDE自己直接去调?span lang="EN-US" style="FONT-FAMILY: Verdana">cl.exe?span lang="EN-US" style="FONT-FAMILY: Verdana">link.exe?span lang="EN-US" style="FONT-FAMILY: Verdana">rc.exeq些工具的,而是通过vcspawn.exeq个工具q行中{的,单说IDE把参C递给vcspawnQ然后由vcspawn来徏立进E去执行q些~译链接的命令,然后把编译链接过E中的信息输出到IDE的最下面的输出窗口的Q在q里vcspawn的输重定向到那个H口?span lang="EN-US" style="FONT-FAMILY: Verdana">(一般通过道)Q而由vcspawn新徏的进E由于承了父进E的输出Q因此也会把重定向到IDE的输出窗口?/p>
下面是个典型?span lang="EN-US" style="FONT-FAMILY: Verdana">IDE?span lang="EN-US" style="FONT-FAMILY: Verdana">vcspawn传递的参数Q?span lang="EN-US" style="FONT-FAMILY: Verdana">(M$对这些参数好像一Ҏ都没有Q这些是通过调式手段截获?img height="19" src="http://m.shnenglu.com/Emoticons/regular_smile.gif" width="19" border="0" />)
VCSPAWN.EXE
-e 1380 -m ~vcecho!Compiling resources...\n
可以看到q里只有两个选项
-e
?/span>
-m,
当然q会有其他的Q后文再?/span>
其中-e 1380中的参数1380?span lang="EN-US" style="FONT-FAMILY: Verdana">IDE的进E句柄或者管道句柄?span lang="EN-US" style="FONT-FAMILY: Verdana">-m后面带的参数比较长,也是有规律的Q据观察Q他们以'\0xa'作ؓ分割W,~vcecho!也是一个关键字Q它表示后面的在\n之前的字W串被输出?/span>IDE的输出窗口里Q这h们在~译的过E中也就看到?/span>Compiling resources...?/span>Compiling...?/span>Linking...q些表示~译q程的信息,cM~vcecho!的词q有~vctime!?/span>~vcsleep!Q我想不用多解释明白它们是什么意思了?/span> 下面看由'\0xa'分割得到的其它三句:
rc.exe /l 0x804 "/foRelease/SSDowner.res" /d "NDEBUG" "D:\Microsoft Visual Studio\MyProjects\test\test.rc"
cl.exe @C:\DOCUME~1\STILLW~1\LOCALS~1\Temp\RSP5.tmp
link.exe @C:\DOCUME~1\STILLW~1\LOCALS~1\Temp\RSP6.tmp
vcspawn
把q些做ؓ命o行分别徏立新的进E。在q里Q很明显只有
rc.exe
l出了比较详l的链接参数Q也难怪因Z般资源文件只有一个就够了Q而源文g和目标文件会有多个,于是
cl.exe
?/span>
link.exe
的参C只有它们的时文Ӟq些临时文g
RSP5.tmp
?/span>
RSP6.tmp
Q名U随机)的内容大致如下:
(
?/span>
IDE
清理删除它们之前拯q来?/span>
RSP5.tmp
/nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Fp"Release/test.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c
RSP6.tmp
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /incremental:no /pdb:"Release/test.pdb" /machine:I386 /out:"Release/test.exe"
".\Release\test.res"
分别是编译器(cl.exe)和链接器(linke.exe)的参敎ͼ熟悉命o行编译链接的对这些应该很熟悉?/p>
vcspawn除了-e?span lang="EN-US" style="FONT-FAMILY: Verdana">-mq连个参数外Q还?span lang="EN-US" style="FONT-FAMILY: Verdana">-t -p(一般放在一?span lang="EN-US" style="FONT-FAMILY: Verdana">)Q甚臛_你点?span lang="EN-US" style="FONT-FAMILY: Verdana">“execute?执行)的时候,也ƈ不是?span lang="EN-US" style="FONT-FAMILY: Verdana">IDEȝ接执行连接后的可执行文gQ而还是由vcspawn作ؓ中{Q?span lang="EN-US" style="FONT-FAMILY: Verdana">vcspawn启动可执行文件的参数如下:(q个bill也不告诉?span lang="EN-US" style="FONT-FAMILY: Verdana">)
vcspawn.exe -t -p 'D:\Microsoft Visual Studio\MyProjects\test\Release\test.exe"
q个可以解释ؓ什么在
IDE
下点?/span>
“execute?/span>
L行编译后的程序后都会?/span>
"Press any key to continue"
q句Q而且在按了一个键后才l束Q这些在我们的程序中q没有这些,q些都是位于
vcspawn.exe
中的Q这也是初学者直接点M个自己写?/span>
console
E序后看到屏q一闪而过的原?/span>
(
当然q所有的E序都这?/span>
3.
逆向写兼容的
vcspawn
在通过阅读vcspawn的反汇编代码了解其大致流E后Q就开始了俺的逆向重构的过E,用的?span lang="EN-US" style="FONT-FAMILY: Verdana">CQ由于严格按?span lang="EN-US" style="FONT-FAMILY: Verdana">vcspawn的反汇编代码的逻辑来写的,所以花了我q一天的旉Q力求做到逻辑上的一?span lang="EN-US" style="FONT-FAMILY: Verdana">(甚至是汇~代码别上的,吹牛?span lang="EN-US" style="FONT-FAMILY: Verdana">
vcspawn大都调用的都?span lang="EN-US" style="FONT-FAMILY: Verdana">msvcrtq个库的东西Q而且是多U程动态链接的(/MD),~译q接后体U只?span lang="EN-US" style="FONT-FAMILY: Verdana">7.5k,可谓y?/p>
4.
q个有什么用Q?/span>
是啊Q有什么用呢,在我自己写的
vcspawn
中我实现了输出那些编译链接的l节Q就差没把时文件拷q来?/span>
(
q个不难
)
Q其它的可以在其中加入自p执行的命令或者输Z些更详细的信息。不q说q来好像q是无大用处Q不q我自q自的弄明白了
IDE
到底q了些啥Q顺便练了下逆向工程
最后抓个图留做U念
最后附上源代码及编译好的可执行文ghttp://m.shnenglu.com/Files/aganno2/vcspawn.zip
rc.exe /l 0x804 "/foRelease/SSDowner.res" /d "NDEBUG" "D:\Microsoft Visual Studio\MyProjects\test\test.rc"\n
~vcecho!Compiling...\n
cl.exe @C:\DOCUME~1\STILLW~1\LOCALS~1\Temp\RSP5.tmp\n
~vcecho!Linking...\n
link.exe @C:\DOCUME~1\STILLW~1\LOCALS~1\Temp\RSP6.tmp\n
)
Q?/span>
"D:\Microsoft Visual Studio\MyProjects\test\main.c"
".\Release\main.obj"
)
)Q由?span lang="EN-US" style="FONT-FAMILY: Verdana">VC6.0?span lang="EN-US" style="FONT-FAMILY: Verdana">vcspawn的版本是6.00的,因此自己写的兼容?span lang="EN-US" style="FONT-FAMILY: Verdana">vcspawn?span lang="EN-US" style="FONT-FAMILY: Verdana">vc6.0?span lang="EN-US" style="FONT-FAMILY: Verdana">evc4.2上工作的很好(攑֜我机?span lang="EN-US" style="FONT-FAMILY: Verdana">D:\Microsoft Visual Studio\Common\MSDev98\Binq个目录里,覆盖原版)Q不窃?img height="19" src="http://m.shnenglu.com/Emoticons/teeth_smile.gif" width="19" border="0" />Q?span lang="EN-US" style="FONT-FAMILY: Verdana">vc2003的看了一下,也无多大区别(参数有点区别)Q已无兴再做重复的事情?/p>
其中U色的部分是兼容性版本的vcspawn输出的编译链接中输出的详l信息?/p>
]]>
BUG描述Q?br /> 在VC6.0 SP6?我用的是中文?在逻辑驱动器根目录下的名ؓtemplate的目录中建立的工E用IDE提供的编译按钮默认不会编译!
举个例子Q在目录F:\template或C:\template\123目录下徏立的工程TestQTest中只有一个文件test.cppQ当点击菜单中的“编译”或“组建”按钮时Q貌似编译完成了Q见C
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=.\test.cpp
# PROP Exclude_From_Scan -1
# PROP BASE Exclude_From_Build 1
# PROP Exclude_From_Build 1
# End Source File
# End Group