我把多年的shellcode开发经验浓缩在了这个专题课👩🏻💻里,主要面向对网络安全技术感兴趣的小伙伴。这是视频版内容对应的文字版材料,内容里面的每一个环境我都亲自测试实操过的记录,有需要的小伙伴可以参考🫡。
我的个人主页:https://imbyter.com
一、文件名顺序规律
多文件项目编译时,函数生成顺序仅与项目中.cpp文件有关,与.h文件无关。
在新建项目中,所有首次创建的cpp文件,在“解决方案资源管理器”中的显示排序,是以文件名首字母,先由0-9,再由a-z从上到下顺序显示。类似如下:
对于上面这个项目,编译后,函数对应关系与PE文件在内存中映射如下:
每个cpp中函数的位置又遵循单文件函数生成位置规律。
但如果对已经创建的cpp文件重命名,当关闭VS项目后,再重新打开项目,就会发现显示的规律仍然符合先0-9,再a-z,但编译的顺序,却不受重命名影响,还是与最初重命名前编译的顺序一致。
二、文件编译日志
上面所说cpp文件显示顺序与编译顺序的对应,仅仅是表象,真正编译顺序的体现,是在我们编译项目时,输出窗口的显示日志。如上项目的编译过日志如下:
对于新建的项目,首次创建的cpp文件的名字,各文件中函数编译后的顺序完全符合0-9,a-z的顺序。并且,不管如何重命名cpp文件,这个顺序均保持不变。
我们可以从此处的输出日志来查看所有文件最后的编译顺序。
三、*.vcxproj编译顺序规定
上面“输出日志”的显示结果,其实是由每个项目中项目名.vcxproj这个文件所规定的,如上项目,在test.vcxproj这个文件中有如下定义:
<ItemGroup><ClCompile Include="0.cpp" /><ClCompile Include="1.cpp" /><ClCompile Include="8.cpp" /><ClCompile Include="9.cpp" /><ClCompile Include="a.cpp" /><ClCompile Include="b.cpp" /><ClCompile Include="y.cpp" /><ClCompile Include="z.cpp" />
</ItemGroup>
<ItemGroup>标签下每个<ClCompile>
的顺序,就代表了对每个cpp的编译顺序。
如果我们将z.cpp修改到最上面:
<ItemGroup><ClCompile Include="z.cpp" /><ClCompile Include="0.cpp" /><ClCompile Include="1.cpp" /><ClCompile Include="8.cpp" /><ClCompile Include="9.cpp" /><ClCompile Include="a.cpp" /><ClCompile Include="b.cpp" /><ClCompile Include="y.cpp" />
</ItemGroup>
保存文件后,回到项目会有如下提示,点击“全部重新加载(A)”:
重新编译项目,此时会发现z.cpp是最先编译的:
结论:
- 多文件函数生成位置,与.h无关,仅与cpp文件有关;
- 对首次创建的cpp文件,文件编译顺序与cpp文件名有关,遵循先0-9,再a-z;
- 可以通过底部的“输出”窗口查看真实的的cpp编译顺序;
- 每个项目项目名.vcxproj中
<ItemGroup>标签下<ClCompile>
的顺序,决定每个cpp编译顺序。
如果有任何问题,可以在我们的知识社群中提问和沟通交流:
一个人走得再快,不如一群人走得更远!🤜🤛