站在巨人的肩膀上
通過CreateRemoteThread,我們能實現(xiàn)把dll或者代碼注入到目標(biāo)進(jìn)程中模聋,從而實現(xiàn)一些特殊功能亡蓉。
網(wǎng)上關(guān)于遠(yuǎn)程線程注入的文章汗牛充棟,這里就不再重復(fù)勞動了朦肘。
其中這篇文章《遠(yuǎn)程線程注入引出的問題》把實現(xiàn)遠(yuǎn)程線程注入中會遇到的問題都一一羅列出來了,更給力的是双饥,不單單是注入dll的方式媒抠,還把更高階的注入代碼來執(zhí)行的方法也詳細(xì)列了出來,非常值得一讀咏花。
進(jìn)一步的補(bǔ)充
這里在補(bǔ)充一些趴生,上面的文章中所沒提到,但是在真正的實踐中遇到的情況昏翰。
首先就是CreateRemoteThread這個API的問題苍匆,無論執(zhí)行調(diào)用該API的進(jìn)程是否有管理員權(quán)限,這個API在2000棚菊、XP 浸踩、XP SP1這幾個版本上都可以正常運作,但是在XP SP2及以上的系統(tǒng)统求,由于安全改進(jìn)检碗,再執(zhí)行這個API据块,會得到ERROR_NOT_ENOUGH_MEMORY的錯誤。
怎么解決這個問題呢折剃? 這篇文章《Injecting Code Into Privileged Win32 Processes》的作者進(jìn)行了深入探索另假,并給出了解決方案,解答如下:
- 在2000怕犁、XP边篮、XP SP1上使用CreateRemoteThread
- 在XP SP2、SP3上使用從nt.dll導(dǎo)出的RtlCreateUserThread因苹,這是個Undocumented API
- 在Vista以上使用從nt.dll導(dǎo)出的NtCreateThreadEx苟耻,這也是個Undocumented API,還有32位和64位版本的區(qū)別扶檐,且這個API是從Vista才開始引入的
按上面的方案是能解決問題凶杖,但是有沒有更好的解決方案呢,畢竟上面的方案要根據(jù)系統(tǒng)版本作不同的處理款筑,還得調(diào)用Undocumented API智蝠。
好了,終極解決方案就是使用服務(wù)奈梳,運行在system權(quán)限下的service杈湾,可以在當(dāng)前的所有windows版本中正常的調(diào)用CreateRemoteThread來進(jìn)行工作!
遺憾
用service的方案看似完美攘须,但是還是有它的局限性漆撞,這就是從Win 8開始,微軟引入了保護(hù)進(jìn)程的概念于宙,關(guān)鍵的系統(tǒng)進(jìn)程(csrss浮驳、servies、lsass等等)全部輸入保護(hù)進(jìn)程捞魁,不允許注入至会。