逆向程式分析:Win32程式入口函式
- Winmain() Win32程式
- Winmain()函式說明
- 參考資料
現在是無線時代,從事Windows相關開發逆向作業的人越來越少,涌入的新人更是少之又少,目前自己也是新手,記錄一下學習程序
Winmain() Win32程式
很多人可能不知道win32程式和控制臺程式有什么區別,這個我們可以通過修改專案的屬性配置來看一下:
在這個地方,我們可以把專案屬性修改為視窗程式,然后運行程式,發現會報錯

在這個地方,我們可以把專案屬性修改為視窗程式,然后運行程式,發現會報錯,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-VLeZNspy-1634994064325)(C:\Users\11073\AppData\Roaming\Typora\typora-user-images\image-20211023205336382.png)]](https://img.uj5u.com/2021/10/24/277108240843461.png)
下面我們來看一下原因:
這是控制臺的啟動函式:
static int __cdecl invoke_main()
{
return main(__argc, __argv, _get_initial_narrow_environment());
}
這是Win32程式的啟動函式
static int __cdecl invoke_main()
{
return WinMain(
reinterpret_cast<HINSTANCE>(&__ImageBase),
nullptr,
_get_narrow_winmain_command_line(),
__scrt_get_show_window_mode());
}
可以看到,在啟動函式中,倆者需要做不同的準備,其中Win32程式需要在這期間進行以下作業:
檢索指向新行程的完整命令列指標
檢索指向新行程的環境變數的指標
對C/C++運行期的全域變數進行初始化
對C運行時記憶體單元分配函式(malloc、free)和其他底層輸入輸出例程使用的記憶體堆疊進行初始化
為所有全域的和靜態C++類物件呼叫建構式
呼叫invoke_main函式切入到我們撰寫的程式入口
Winmain()函式說明
int WinMain (
_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nShowCmd
);
hInstance:指向應用程式的可執行實體,比如a.exe啟動的時候會創建一個實體句柄,這個hinstance就是指向這個a.exe的實體句柄,winmain的hinstance實際上是系統將可執行檔案的映射加載到行程的地址空間時使用的基本地址空間,例如如果a.exe被加載到0x00400000,那么hinstance的值就是0x00400000,
hpreinstance:由于啟動函式,一般都是NULL
lpcmdline:命令列,一般希望被修改,也可以使用GetCommandLine獲取當前行程的命令列
參考資料
《加密與解密》
C語言中的main函式為什么被稱作程式入口
windows編程 行程(一):行程簡介
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/333585.html
標籤:其他
