易語言hook自身保護 易語言,寫的32位DLL能注入64位進程嗎?
易語言,寫的32位DLL能注入64位進程嗎?位的進程或同為64位的進程可以假定彼此進程內的LoadLibrary函數(shù)的地址是相同的。并且CreateRemoteThread的線程過程函數(shù)和LoadLi
易語言,寫的32位DLL能注入64位進程嗎?
位的進程或同為64位的進程可以假定彼此進程內的LoadLibrary函數(shù)的地址是相同的。
并且CreateRemoteThread的線程過程函數(shù)和LoadLibrary的參數(shù)個數(shù)相同,且參數(shù)都是指針,因此通常都是直接將LoadLibrary作為CreateRemoteThread的過程函數(shù)。然后使用VirtualAllocEx在目標進程中分配內存,使用WriteProcessMemory往這塊內存中寫入DLL文件路徑,將這塊內存的地址作為線程過程函數(shù)(LoadLibrary)的參數(shù)。在64位的Windows操作系統(tǒng)上32位進程中的LoadLibrary函數(shù)地址與64位進程的函數(shù)地址不同,因此如果想對64位進程注入DLL,簡單的做法就是使用64位進程來執(zhí)行注入工作。但是如果能讓32位進程注入DLL到64位進程顯然更好。為什么好多軟件都區(qū)分32位和64位,到底有什么區(qū)別?
在回答這個問題前,有必要對中央處理器CPU的相關知識普及一下,很多人嘴上常講16位,32位,64位速度如何如何,但概念上很模糊。在此厘清一下。
1,常說的計算機是多少位的,到底指的什么?
一般講計算機是8/16/32/64位,是指的數(shù)據(jù)位,而不是地址位。大多數(shù)人理解為地址位,如32位,馬上就會說尋址空間為4GB。這是不嚴肅的。照此理論,16位機只有2^16=64K尋址空間嗎?事實上,即使最早的16位機,也有20根地址線,尋址1MB。
2,處理器CPU與數(shù)據(jù)位有什么關系?
一般處理器多少位是指通用寄存器的長度,與數(shù)據(jù)線位數(shù)相同。
再次強調,地址線則不需要與之相等。
好比 intel 64 位處理器則是 40 位地址總線,最大支持 1TB 的內存尋址。
32位宏匯編, 32位CPU有4個32位的通用寄存器EAX、EBX、ECX和EDX。所以,32和64表示CPU一次性可以讀/寫的最大位數(shù),在主頻率等外部條件一樣的情況下,理論上64位的執(zhí)行速度是32位的兩倍。
3,尋址能力決定可支持的最大內存。32位的CPU只能尋址最大4GB的內存,這是因為其地址線也正好是32位。有的廠家做成40位地址線,可支持1TB內存。
4,操作系統(tǒng)向下兼容。即64的CPU可安裝32位的操作系統(tǒng)win10 for32。當然,對CPU來說,是一種浪費,有一半的性能未發(fā)揮出來。
5,在win10 for 64系統(tǒng)上開發(fā)的app,都是64位的嗎?非也。它還與集成開發(fā)及編繹環(huán)境IDE有直接關系?,F(xiàn)在大部分app都是32位的,64位app很少。原因是軟件開發(fā)滯后。