2012-01-11 21 views
3

我固定了別人的代碼,發現該人調用LoadLibrary幾次,按如下:調用LoadLibrary通話,回到指針不能保存

LoadLibrary("C:\\Windows\\SysWOW64\\msjint40"); 
LoadLibrary("C:\\Windows\\SysWOW64\\msjtes40"); 
LoadLibrary("C:\\Windows\\SysWOW64\\expsrv"); 

這樣做有什麼意義呢?返回指針沒有保存!然後,該程序會調用其他一些使用MSJTES40函數的DLL,但不會在加載庫的位置上下文。

評論說 - "else preload to optimize",但程序的其餘部分如何知道DLL的位置?

感謝您的任何信息。

回答

4

LoadLibrary將指定的模塊放入地址空間。庫不能加載兩次,因此這樣做會導致預加載(加載的模塊可能有其他依賴),因此可以將其視爲優化。對庫的第二次調用(它們使用返回值)應該更快完成。

documentation

如果指定的模塊是不是已經加載的調用進程一個DLL時,系統調用與DLL_PROCESS_ATTACH值DLL的DllMain函數。

另請參閱文檔。

不要根據搜索DLL的LoadLibrary調用來對操作系統版本進行假設。如果應用程序運行在DLL合法不存在但DLL的惡意版本位於搜索路徑中的環境中,則可能會加載DLL的惡意版本

假設硬編碼DLL位置打開你的程序到各種惡作劇!

+0

還有一個問題(我查看了文檔,但找不到答案)。以前的地址有System32而不是SysWOW64,所以不應該找到DLL(因爲我有64位操作系統)。但LoadLibrary使用System32返回的指針不是null,所以它找到了它們。任何解釋? – jn1kk 2012-01-11 16:48:30

+0

@SkyNorth:開始一個新的問題。 – 2012-01-11 18:12:29