如何让vs2010编译出的程序不带导入表

和我赛跑的人 2014-05-05 08:10:45
如何让vs2010编译出的程序不带导入表,
就一个main函数也有导入表,求指点
...全文
241 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2014-05-09
  • 打赏
  • 举报
回复
是 manCRTStartup
lm_whales 2014-05-09
  • 打赏
  • 举报
回复
引用 15 楼 my3439955 的回复:
我以前做过,其实没有导入表基本可以完成任何事,就是麻烦点 步骤: 1、自定义入口点,#pragma comment(linker, "/Entry:s") 2、实现入口点函数,如void s()。。。 3、用Release模式编译程序 4、这样就得到了一个没有导入表的程序,但是这个程序什么也做不了,而且可能还无法退出----但这确实是合法的pe程序 5、实现一点功能,第一是弹出一个MessageBox,第二是让exe程序能够退出 MessageBox... ExitProcess(0) 6、这样的话功能就有了,但是也带来了导入表 7、去掉导入表 7.1、找到kernel32.dll在内存中的位置,可以借用__readfsdword,网上有 7.2、实现一个自己的GetProcAddress函数,网上有 7.3、用自己的GetProcAddress和已知的kernel32.dll的地址加载出一些关键函数如LoadLibraryA、ExitProcess 7.4、用LoadLibraryA加载user32.dll,然后用GetProcAddress加载MessageBoxA 7.5、至此,所需要的函数都有了,可以实现了。更丰富的功能也都可以实现,无非是动态加载api函数罢了。原则:所有需要用到的api函数都用LoadLibraryA和GetProcAddress来动态加载
++ 就照这位的办法吧 API如果无法自行加载,那就需要导入表 int main(){return 0;}就这样 程序会有2个导入项kernel32 和 msvcr100 这是因为有个函数会调用 main ---似乎是 manCRTStartUp 这个函数 这个函数调用API 返回一个值(main的返回值); 给操作系统,这个值称为一个程序结束码(退出码)。 应用程序结束,使用这个程序的程序可以根据结束码,来安排后面如何处理。 这个结束码。比如,可以用于批处理程序。 事实上,MS 控制台和窗口程序,使用 int retmain =main(), int remain =WinMain(.....); exit(retmain); 这种方式, 传递这个结束码。 exit 则是调用API来传递结束码; 这个API 应该就是 ExitProcess() 吧。
  • 打赏
  • 举报
回复
我以前做过,其实没有导入表基本可以完成任何事,就是麻烦点 步骤: 1、自定义入口点,#pragma comment(linker, "/Entry:s") 2、实现入口点函数,如void s()。。。 3、用Release模式编译程序 4、这样就得到了一个没有导入表的程序,但是这个程序什么也做不了,而且可能还无法退出----但这确实是合法的pe程序 5、实现一点功能,第一是弹出一个MessageBox,第二是让exe程序能够退出 MessageBox... ExitProcess(0) 6、这样的话功能就有了,但是也带来了导入表 7、去掉导入表 7.1、找到kernel32.dll在内存中的位置,可以借用__readfsdword,网上有 7.2、实现一个自己的GetProcAddress函数,网上有 7.3、用自己的GetProcAddress和已知的kernel32.dll的地址加载出一些关键函数如LoadLibraryA、ExitProcess 7.4、用LoadLibraryA加载user32.dll,然后用GetProcAddress加载MessageBoxA 7.5、至此,所需要的函数都有了,可以实现了。更丰富的功能也都可以实现,无非是动态加载api函数罢了。原则:所有需要用到的api函数都用LoadLibraryA和GetProcAddress来动态加载
和我赛跑的人 2014-05-09
  • 打赏
  • 举报
回复
引用 12 楼 mLee79 的回复:
cl /nologo 1.c /link /entry:main 没有 导入表.. 如果要实现点啥功能, Linux 下简单, 在 WIN 下就 WIN64 运行 64位程序 r10 = addr [ NativeAPI Arguments ] rax = sysDispID syscall WIN64 运行 32位程序 eax = sysDispID ecx = 0 edx = addr [ NativeAPI Arguments ] farcall fs:0xC0 WIN32 下就: eax = sysDispID edx = addr [ NativeAPI Arguments ] syscall ======================================= 先用 NativeCall 把 open, read, close 几个函数实现了, 自己写一个 dlopen/dlsym 也不太麻烦, 有了这几个就想干嘛干嘛了 ...
啊,谢谢, 我不懂这写,太高深了
lm_whales 2014-05-08
  • 打赏
  • 举报
回复
写个解释器,就行了 只要调用Win32 API,那就必须有导入表才能运行。 因为 Win32 API不是静态库,而是动态库,也没有源代码。 而你的程序,任何操作几乎都要调用API。 除非你写的程序,只能做c = a+b 这样的纯粹计算,计算结果,你也不希望别人知道。
赵4老师 2014-05-08
  • 打赏
  • 举报
回复
引用 4 楼 u012222342 的回复:
[quote=引用 3 楼 zhao4zhong1 的回复:] 《Windows PE权威指南》
直接告诉我怎么做吧 ,没看过这本书啊[/quote] 我通常只告诉织渔网的方法和织渔网的原料在哪儿,偶尔给个现成的渔网,但从来没给过鱼。
和我赛跑的人 2014-05-08
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
《Windows PE权威指南》
直接告诉我怎么做吧 ,没看过这本书啊
mLee79 2014-05-08
  • 打赏
  • 举报
回复
ZwCreateFile/ZwWriteFile/ZwReadFile 的 syscall ID 大概这个样子: XP 下是 0x25/0x112/0xB7 WIN7 下是 0x52/0x005/0x03 其他系统下自己打开 ntdll 看下, 参数就查上面的的函数就是了..
mLee79 2014-05-08
  • 打赏
  • 举报
回复
cl /nologo 1.c /link /entry:main 没有 导入表.. 如果要实现点啥功能, Linux 下简单, 在 WIN 下就 WIN64 运行 64位程序 r10 = addr [ NativeAPI Arguments ] rax = sysDispID syscall WIN64 运行 32位程序 eax = sysDispID ecx = 0 edx = addr [ NativeAPI Arguments ] farcall fs:0xC0 WIN32 下就: eax = sysDispID edx = addr [ NativeAPI Arguments ] syscall ======================================= 先用 NativeCall 把 open, read, close 几个函数实现了, 自己写一个 dlopen/dlsym 也不太麻烦, 有了这几个就想干嘛干嘛了 ...
和我赛跑的人 2014-05-08
  • 打赏
  • 举报
回复
引用 9 楼 movsd 的回复:
延迟加载的dll没有导入表: #pragma comment(lib,"delayimp.lib") #pragma comment(linker,"/delayload:user32.dll") #pragma comment(linker,"/delayload:ole32.dll") #pragma comment(linker,"/delayload:wininet.dll") 但有的dll,比如kernel32.dll,msvcrt.dll ... 不能延迟加载,即使写了也会被编译器忽略。
kernel32.dll,msvcrt.dll 必带, 咋去掉
和我赛跑的人 2014-05-08
  • 打赏
  • 举报
回复
引用 6 楼 lm_whales 的回复:
写个解释器,就行了 只要调用Win32 API,那就必须有导入表才能运行。 因为 Win32 API不是静态库,而是动态库,也没有源代码。 而你的程序,任何操作几乎都要调用API。 除非你写的程序,只能做c = a+b 这样的纯粹计算,计算结果,你也不希望别人知道。
int main(){return 0;}就这样 程序会有2个导入项kernel32 和 msvcr100
movsd 2014-05-08
  • 打赏
  • 举报
回复
延迟加载的dll没有导入表: #pragma comment(lib,"delayimp.lib") #pragma comment(linker,"/delayload:user32.dll") #pragma comment(linker,"/delayload:ole32.dll") #pragma comment(linker,"/delayload:wininet.dll") 但有的dll,比如kernel32.dll,msvcrt.dll ... 不能延迟加载,即使写了也会被编译器忽略。
赵4老师 2014-05-08
  • 打赏
  • 举报
回复
设置链接选项不使用默认库 在程序中动态加载dll 如果连LoadLibrary都不想调用的话,在www.codeproject.com上搜,有自己写代码实现LoadLibrary功能的文章。
mLee79 2014-05-08
  • 打赏
  • 举报
回复
系统调用 可以直接 int2e/sysenter .. 只是WIN换个版本调用号就可能会改变..
和我赛跑的人 2014-05-06
  • 打赏
  • 举报
回复
引用 1 楼 mLee79 的回复:
link /entry:main ... 打算干嘛...
#pragma comment(linker,"/entry:main") 是这样吗 还有kernel32 和msvcr100d
mLee79 2014-05-06
  • 打赏
  • 举报
回复
link /entry:main ... 打算干嘛...
赵4老师 2014-05-06
  • 打赏
  • 举报
回复
《Windows PE权威指南》

24,860

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧