/*
????? Author: void#ph4nt0m.org
*/
// 編譯器 cl.exe(Visual
C++ 6.0)
// 沒有做任何優(yōu)化情況下,編譯大小為:16K
// 編譯優(yōu)化后: 1K (用16進(jìn)制編輯器把尾部的0x00去掉:
712bytes)
#include <windows.h>
#pragma
comment(lib,"kernel32.lib")
// 作用: 指定節(jié)對(duì)齊為512字節(jié)
#pragma comment(linker,
"/align:512")
// 作用: 合并節(jié)
//
將.data節(jié)和.rdata節(jié)合并到.text節(jié)(代碼節(jié))
#pragma comment(linker,
"/merge:.data=.text")
#pragma comment(linker,
"/merge:.rdata=.text")
// 作用: 指定子系統(tǒng)為windows
(和優(yōu)化無(wú)關(guān))
// vc編譯器默認(rèn)是console,會(huì)有個(gè)黑糊糊的CMD窗口,不好看.用windows就好了
#pragma
comment(linker, "/subsystem:windows")
// 作用: 指定入口函數(shù)
//
子系統(tǒng)為windows的默認(rèn)入口點(diǎn)WinMain和console的默認(rèn)入口點(diǎn)main,都會(huì)引入一段啟動(dòng)stub代碼,指定入口函數(shù)可去掉之.
#pragma
comment(linker, "/ENTRY:main")
//int WinMain(HINSTANCE current, HINSTANCE prev,
LPSTR cmdline, int showcmd)
// 作用: 去掉函數(shù)的棧幀代碼,純屬吹毛求疵:-)
// 即函數(shù)開頭的push ebp / mov
ebp, esp和結(jié)尾的pop ebp / retn
__declspec(naked)
void
main()
{
????? // 調(diào)用wmp. 這是按套路出牌的方法.
?????
//typedef VOID (__stdcall *fnRunDllW)(HWND, HINSTANCE, LPCWSTR, DWORD);
?????
//((fnRunDllW)GetProcAddress(LoadLibrary("msdxm.ocx"),
"RunDllW"))(0,0,0,0);
??? // 不按套路出牌,不壓入RunDllW的函數(shù)參數(shù),直接調(diào)用.
?????
GetProcAddress(LoadLibrary("msdxm.ocx"), "RunDllW")();
????? // 注意此時(shí)的堆棧是不平衡的.
????? //
但是通過ExitProcess()退出自身,就不用去考慮平衡了.
????? ExitProcess(0);
}