我以前做过,其实没有导入表基本可以完成任何事,就是麻烦点 步骤: 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来动态加载
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 也不太麻烦, 有了这几个就想干嘛干嘛了 ...
[quote=引用 3 楼 zhao4zhong1 的回复:] 《Windows PE权威指南》
《Windows PE权威指南》
延迟加载的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 ... 不能延迟加载,即使写了也会被编译器忽略。
写个解释器,就行了 只要调用Win32 API,那就必须有导入表才能运行。 因为 Win32 API不是静态库,而是动态库,也没有源代码。 而你的程序,任何操作几乎都要调用API。 除非你写的程序,只能做c = a+b 这样的纯粹计算,计算结果,你也不希望别人知道。
link /entry:main ... 打算干嘛...
24,860
社区成员
27,333
社区内容
加载中
试试用AI创作助手写篇文章吧