关于link的一些东西, 摆脱default lib

来源:互联网 发布:现货源码 编辑:程序博客网 时间:2024/06/05 04:49

感觉写一些恶意程序会有点用

 

用cl 编译一个东西,啥头文件都不引用,随便用个反汇编器打开,一看,一大堆代码,而你仅仅写了一个main函数.

 

why ?

答案是编译的时候自动连接到default lib 了,会启动crt 代码,完成一些初始化工作

,具体可见源代码

这里说明一下,exe文件进内存后执行的第一条指令由pe文件的EntryPoint 来指明.

 

咋摆脱default lib 呢

 

link 链接器上做文章, cl m.c  /link /nodefaultlib

 

D:/asm/1>cl m.c /link  /NODEFAULTLIB
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

m.c
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:m.exe
/NODEFAULTLIB
m.obj
LINK : error LNK2001: unresolved external symbol _mainCRTStartup
m.exe : fatal error LNK1120: 1 unresolved externals

这样以后,会报错,无法链接到_mainCRTStartup

我们可以指定一个入口点, /entry


D:/asm/1>cl m.c /link  /NODEFAULTLIB /entry:main
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

m.c
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:m.exe
/NODEFAULTLIB
/entry:main
m.obj

 

 

一个例子,


D:/asm/1>cl m.c /link  /NODEFAULTLIB /entry:main kernel32.lib
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

m.c
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:m.exe
/NODEFAULTLIB
/entry:main
kernel32.lib
m.obj

 

编译以后看导入表,没有多余的函数,很简洁.

 

不过不用default lib的代价是c语言库函数是没法用了,像printf这种,但是,windows下完全可以用api来替代! 比如上面用lstrlen来代替了strlen ,链接的是写上kernel32.lib ,api 文档上注明了每个api 引用的库,下面是msdn 的截图

 

Function Information

Minimum DLL Versionkernel32.dllHeaderDeclared in Winbase.h, include Windows.hImport libraryKernel32.libMinimum operating systemsWindows 95, Windows NT 3.1UnicodeImplemented as ANSI and Unicode versions.