DLL劫持利用系統(tǒng)未知DLL的搜索路徑方式,使得程序加載當前目錄下的系統(tǒng)同名DLL。所以可以告訴系統(tǒng)DLL的位置,改變加載系統(tǒng)DLL的順序不是當前目錄,而是直接到系統(tǒng)目錄下查找。

創(chuàng)新互聯(lián)公司專業(yè)提供四川服務(wù)器托管服務(wù),為用戶提供五星數(shù)據(jù)中心、電信、雙線接入解決方案,用戶可自行在線購買四川服務(wù)器托管服務(wù),并享受7*24小時金牌售后服務(wù)。
這個想法可以通過修改注冊表實現(xiàn)。
在注冊表鍵值:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
是調(diào)用系統(tǒng)DLL的首要查找目錄。例如里面有RE_SZ類型的ntdll=ntdll.dll項,則系統(tǒng)載入ntdll時會直接從系統(tǒng)目錄加載。
由此,添加LPK=LPK.DLL即可防止LPK被劫持,同理可以阻止一些其他DLL被劫持,例如USP10。
在Windows NT系統(tǒng),XP默認只有少數(shù)關(guān)鍵DLL在此鍵值下,Win7下面此鍵值已經(jīng)相當齊全,在Win7系統(tǒng)下發(fā)生DLL劫持的概率要比XP小很多。
一 回顧DLL挾持的發(fā)展
2010年08月24日微軟發(fā)布安全公告2269637,提到三方軟件編程不安全存在一個DLL挾持的缺陷可以導(dǎo)致遠程攻擊
2010年08月24日流行的漏洞信息共享網(wǎng)站exploit-db馬上就爆出多個DLL挾持漏洞涉及的軟件有:Wireshark(免費嗅探器),Windows
Live email(郵箱客戶端), Microsoft MovieMaker(視頻編輯處理),F(xiàn)irefox(網(wǎng)頁瀏覽器),
uTorrent (BT下載工具),PowerPoint 2010(辦公軟件)等
2010年08月25日-26日漏洞信息共享網(wǎng)站exploit-db繼續(xù)爆出Winamp,Google
Earth,Photoshop等軟件存在DLL挾持漏洞,同時發(fā)布這個blog之前筆者的電腦中已經(jīng)發(fā)掘存在的流行軟件有,QQ影音,QQ音樂,美圖秀秀,ppstream等
二新老DLL挾持的攻擊原理分析和防御
1 動態(tài)鏈接庫文件通常加載順序如下
windows xp sp2系統(tǒng)以上會默認開啟SafeDllSearchMode,安全dll搜索模式下DLL文件的搜索順序如下所示
(1)可執(zhí)行程序加載的目錄(可理解為程序安裝目錄比如
C:\Program Files\uTorrent)(2)系統(tǒng)目錄(即 %windir%\system32 )(3)16位系統(tǒng)目錄(即
%windir%\system)(4)Windows目錄(即 %windir%)(5)運行某文件的所在目錄,比如C:\Documents and
Settings\Administrator\Desktop\test)(6)PATH環(huán)境變量中列出的目錄
2 老DLL挾持觸發(fā)的原理解析和防御(漏洞觸發(fā)在DLL搜索流程的第一層,運行程序即加載病毒)
(1)老DLL挾持的特點:
為了增加觸發(fā)的概率,通常會使用usp1.dll,ws2_32.dll,lpk.dll等應(yīng)用程序所必須的系統(tǒng)dll文件,然后利用DLL搜索第一順位是程序安裝目錄,在程序安裝目錄釋放一個同名DLL文件,搶先加載惡意病毒DLL文件,從而達到破壞的作用。這里可執(zhí)行程序相當于惡意dll的加載器
(2)老DLL挾持病毒利用回顧重現(xiàn)
2007年羅姆病毒(ws2_32.dll導(dǎo)致很多殺毒軟件無法打開),2009年春節(jié)貓癬病毒(usp10.dll導(dǎo)致很多用戶重裝系統(tǒng)都無法解決病毒問題)
通常使用老DLL挾持的病毒木馬會枚舉電腦里面的所有exe目錄,然后將惡意的usp10.dll釋放到每個exe所在的目錄。當用戶執(zhí)行一個應(yīng)用程序的時候,將會把惡意的usp10.dll文件優(yōu)先加載從而感染系統(tǒng)
根據(jù)前面介紹的DLL加載順序,運行程序的時候會優(yōu)先到程序執(zhí)行的目錄下加載必須文件,下圖顯示了utorrent.exe在安裝目錄下的找到了usp10.dll文件并把它加載到內(nèi)存中。
(3)老DLL挾持的通用免疫方案
可以通過編輯HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs來添加需要面議的DLL文件,比如:新建一個ws2_32 指向ws2_32.dll
3 新DLL挾持觸發(fā)的原理解析和防御(漏洞觸發(fā)在DLL搜索流程的第五層,運行圖片即加載病毒)
(1)新DLL挾持的特點:
應(yīng)用程序為了擴展或者兼容等目的需要加載相應(yīng)的DLL文件,但是因為某些原因?qū)е逻@個DLL文件默認不存在于當前系統(tǒng),比如plugin_dll.dll文件默認情況下不存在utorrent的安裝目錄,dwmapi.dllxp環(huán)境下不存在(Vista以上系統(tǒng)存在),ie6環(huán)境下沒有ieframe.dll(ie7以上版本存在)。正是因為程序需要的DLL文件在DLL搜索順序的(1)-(4)中都不可能存在,此時就會嘗試加載文件所在目錄下的惡意dll文件,從而達到破壞的作用。這里運行的文件(比如mp3)相當于觸發(fā)者,根據(jù)文件關(guān)聯(lián)它會啟動一個應(yīng)用程序去播放mp3文件。而因為應(yīng)用程序存在DLL挾持漏洞(比如QQ影音),此時QQ影音就會因為設(shè)計上的不足導(dǎo)致成為惡意DLL的加載器。相當于老DLL挾持,簡直達到了運行圖片/視頻文件就會執(zhí)行惡意文件的目的,當然前提是大灰客們能猜中你電腦里面的默認查看的軟件是否存在DLL挾持漏洞了,目前已經(jīng)發(fā)現(xiàn)的存在DLL挾持缺陷的主要有以下幾類
① 特定系統(tǒng)環(huán)境下的文件
典型的有dwmapi.dll文件,xp環(huán)境下不存在,vista以上版本存在,也就是說需要觸發(fā)這個漏洞的系統(tǒng)環(huán)境只能是XP系統(tǒng)
② 特定軟件版本下的文件
典型的有:ieframe.dll,IE6下不 存在,ie7以上版本有,也就是說觸發(fā)漏洞的電腦IE必須是IE6版本
③ 特定的庫文件
典型的有:mfc80chs.dll
④ 程序自己需要的dll文件,可能是為了功能擴展或者兼容
典型的有:plugin_dll.dll
⑤ 其它未知
(2)新DLL挾持利用重現(xiàn)
通常灰客們會先通過DLL挾持挖掘工具尋找存在DLL挾持漏洞的流行應(yīng)用程序,然后構(gòu)造相應(yīng)的文件上傳到網(wǎng)絡(luò)上供用戶下載(具體的傳播方式請看下一章),如果用戶的電腦存在漏洞那么運行相應(yīng)文件的時候就會執(zhí)行存在漏洞的程序,從而使得惡意dll被不知不覺加載
根據(jù)前面介紹的DLL加載順序和新DLL挾持的特點,程序在前四個流程都沒有找到需要的文件,只能勉為其難的在第五流程-當前文件目錄下加載惡意dll文件,下圖就顯示了uTorrent加載plugin_dll.dll順序(前四個流程都是
name not found)并且加載當前目錄下惡意plugin_dll.dll文件(第五流程顯示的是success )的過程
(3)新DLL挾持的免疫
目前微軟沒有提供有效的免疫方案可以使用,建議升級你常用軟件到最新版本.
三 新DLL挾持可能存在的攻擊方式
exploit-db公布了存在DLL
Hijacking的大量常用軟件,這些軟件里面有視頻音頻播放器,圖像設(shè)計瀏覽軟件,IM聊天工具,文字處理軟件,網(wǎng)頁瀏覽器,下載軟件,殺毒軟件。根據(jù)在下的一點拙見如果病毒作者想要利用這個漏洞來實現(xiàn)廣泛傳播的話主要有幾種方式。
1 BT下載大片傳播
挖掘出支持BT下載的流行軟件(比如uTorrent
)的DLL
Hijacking漏洞,然后構(gòu)造一個惡意dll文件(估計會設(shè)置隱藏屬性,這樣你解壓以后將不會看到這個文件)和BT種子文件打包成壓縮包上傳到網(wǎng)上供用戶下載,用戶一旦下載了這個壓縮包雙擊BT種子文件的時候會調(diào)用uTorrent
打開,uTorrent 運行的時候由于設(shè)計上的不河蟹根據(jù)dll加載的順序最后會將種子所在目錄的惡意dll加載
2 美女圖片分享傳播
挖掘出流行圖片瀏覽工具(比如美圖秀秀)的DLL
Hijacking漏洞,然后構(gòu)造一個惡意dll文件(估計會設(shè)置隱藏屬性,這樣你解壓以后將不會看到這個文件)和圖片文件打包成壓縮包上傳到網(wǎng)上供用戶下載,用戶一旦下載了這個壓縮包,解壓瀏覽美女靚照的時候可能會調(diào)用圖片瀏覽工具打開從而觸發(fā)漏洞加載惡意dll文件
3 軟件下載包含的網(wǎng)頁文件傳播
挖掘出流行網(wǎng)頁瀏覽工具(比如firefox)的DLL
Hijacking漏洞,然后構(gòu)造一個惡意dll文件(估計會設(shè)置隱藏屬性,這樣你解壓以后將不會看到這個文件),應(yīng)用程序和htm等網(wǎng)頁文件打包成軟件壓縮包并上傳到網(wǎng)上供用戶下載。用戶一旦下載了這個軟件壓縮包,解壓以后運行安裝必看.htm之類的網(wǎng)頁文件會調(diào)用網(wǎng)頁瀏覽工具打開從而觸發(fā)漏洞加載惡意dll文件
4 熱門視頻音頻文件傳播
挖掘出流行視頻音頻播放工具(比如QQ影音)的DLL
Hijacking漏洞,然后構(gòu)造一個惡意dll文件(估計會設(shè)置隱藏屬性,這樣你解壓以后將不會看到這個文件)和rmvb等視音頻文件打包壓縮包并上傳到網(wǎng)上供用戶下載。用戶一旦下載了這個壓縮包,解壓播放相應(yīng)視頻的時候從而觸發(fā)漏洞加載惡意dll文件
5 目前公布的部分軟件列表
Google Earth
Nullsoft Winamp 5.581
Media Player Classic 6.4.9.1
Mozilla Thunderbird
Microsoft Office PowerPoint 2007
Adobe InDesign CS4
Nvidia Driver
Adobe Illustrator CS4
Adobe Premier Pro CS4
Skype = 4.2.0.169
TechSmith Snagit 10
Safari v5.0.1
uTorrent
Microsoft Visio 2003
Adobe Photoshop CS2
avast! = 5.0.594
Adobe Dreamweaver CS5
Opera v10.61
Firefox = 3.6.8
四 DLL安全編程,避免產(chǎn)生DLL挾持問題
(1) 調(diào)用LoadLibrary, LoadLibraryEx, CreateProcess的,或者 的ShellExecute 等涉及到模塊加載的函數(shù)的時候,指定DLL加載的完整路徑,貌似應(yīng)該有API可以獲取當前程序運行的目錄的
(2)考慮使用 的DLL重定向 或 Manifests文件 ,以確保您的應(yīng)用程序使用正確的DLL。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
(3)確保DLL安全搜索模式被激活。未使用安全搜索設(shè)置的話,第二加載項就是當前目錄。
HKLM\System\CurrentControlSet\Control\Session Manager \ SafeDllSearchMode
(4)從搜索列表中取消當前目錄,可以通過調(diào)用SetDllDirectory 參數(shù)設(shè)置為一個空字符串
hook是一個英語單詞,名詞、動詞,作名詞時意思是“掛鉤,吊鉤”,作及物動詞時意思是“鉤住;引上鉤”,作不及物動詞時意思是“鉤住;彎成鉤狀”。
.hook是Windows中提供的一種用以替換DOS下“中斷”的系統(tǒng)機制。
雙語例句
1、Hang your coat up on that hook.
把你的上衣掛在那個掛鉤上。
2、Hang your coat on the hook.
把你的外套掛在那個鉤上。
3、You can tap into key moments in that lifecycle by implementing one or more of the lifecycle hook interfaces.
你可以通過實現(xiàn)一個或多個生命周期鉤子接口,切入到生命周期中的關(guān)鍵時間點。
Hook原理
每一個Hook都有一個與之相關(guān)聯(lián)的指針列表,稱之為鉤子鏈表,由系統(tǒng)來維護。這個列表的指針指向指定的,應(yīng)用程序定義的,被Hook子程調(diào)用的回調(diào)函數(shù),也就是該鉤子的各個處理子程序。當與指定的Hook類型關(guān)聯(lián)的消息發(fā)生時,系統(tǒng)就把這個消息傳遞到Hook子程。
一些Hook子程可以只監(jiān)視消息,或者修改消息,或者停止消息的前進,避免這些消息傳遞到下一個Hook子程或者目的窗口。最近安裝的鉤子放在鏈的開始,而最早安裝的鉤子放在最后,也就是后加入的先獲得控制權(quán)。
Windows 并不要求鉤子子程的卸載順序一定得和安裝順序相反。每當有一個鉤子被卸載,Windows 便釋放其占用的內(nèi)存,并更新整個Hook鏈表。如果程序安裝了鉤子,但是在尚未卸載鉤子之前就結(jié)束了,那么系統(tǒng)會自動為它做卸載鉤子的操作。
鉤子子程是一個應(yīng)用程序定義的回調(diào)函數(shù)(CALLBACK Function),不能定義成某個類的成員函數(shù),只能定義為普通的C函數(shù)。用以監(jiān)視系統(tǒng)或某一特定類型的事件,這些事件可以是與某一特定線程關(guān)聯(lián)的,也可以是系統(tǒng)中所有線程的事件。
答案
首先函數(shù)柯里化因為參數(shù)固定,使用vars數(shù)組保存每次傳進來的參數(shù),然后判斷fn的參數(shù)個數(shù),如果fn參數(shù)個數(shù)正好等于vars數(shù)組中保存的個數(shù),那么執(zhí)行fn,否則遞歸一次,返回curried函數(shù),繼續(xù)等待輸入。這里外層curry 函數(shù)只會執(zhí)行一次便會被剝離,之后add會變成curried的一個引用,同時curried可以閉包引用外層的vars,使得每次傳入的參數(shù)可以長久保存。
參考上面網(wǎng)上優(yōu)秀答案的思路,寫出這個不定參數(shù)處理add函數(shù),...args可以接受不定參數(shù),由于題目二中并沒有題目一中 const add = curry((a, b ,c ,d) = a + b + c +d) 函數(shù)劫持的過程,所以不能直接返回函數(shù)定義,而是要返回一個執(zhí)行完的函數(shù)curried(...args),同時在curried中再返回一個函數(shù)定義curried,這樣就可以把函數(shù)連接起來了。由于參數(shù)不定,這里對每次傳入的參數(shù)都要進行執(zhí)行處理,執(zhí)行方法是利用函數(shù)的隱式轉(zhuǎn)換,當函數(shù)執(zhí)行結(jié)束時會有一個toString的操作,來使函數(shù)能參與其他的運算,這里我們將toString從新定義,返回vars中的累加值,從而實現(xiàn)add運算。
嗶哩嗶哩。API劫持主要是利用動態(tài)鏈接技術(shù),通過預(yù)先加載SO,隱藏符號,是有由教程視頻的,可以前往嗶哩嗶哩學習。ApiHook又叫做API劫持,也就是如果A程序調(diào)用了B.cll里面的C函數(shù),我們可以做到當A調(diào)用C函數(shù)執(zhí)行的時候,直接執(zhí)行我們自己事先準備好的函數(shù),之后我們在執(zhí)行真正的C,當然我們可以不執(zhí)行C或者更改C的參數(shù)。
HOOK技術(shù)是Windows消息處理機制的一個平臺,應(yīng)用程序可以在上面設(shè)置子程序以監(jiān)視指定窗口的某種消息,而且所監(jiān)視的窗口可以是其他進程所創(chuàng)建的。當消息到達后,在目標窗口處理函數(shù)之前處理它。鉤子機制允許應(yīng)用程序截獲處理window消息或特定事件。
鉤子實際上是一個處理消息的程序段,通過系統(tǒng)調(diào)用,把它掛入系統(tǒng)。每當特定的消息發(fā)出,在沒有到達目的窗口前,鉤子程序就先捕獲該消息,亦即鉤子函數(shù)先得到控制權(quán)。這時鉤子函數(shù)即可以加工處理(改變)該消息,也可以不作處理而繼續(xù)傳遞該消息,還可以強制結(jié)束消息的傳遞。
擴展資料:
Hook原理
Hook技術(shù)無論對安全軟件還是惡意軟件都是十分關(guān)鍵的一項技術(shù),其本質(zhì)就是劫持函數(shù)調(diào)用。但是由于處于Linux用戶態(tài),每個進程都有自己獨立的進程空間,所以必須先注入到所要Hook的進程空間,修改其內(nèi)存中的進程代碼,替換其過程表的符號地址。在Android中一般是通過ptrace函數(shù)附加進程,然后向遠程進程注入so庫,從而達到監(jiān)控以及遠程進程關(guān)鍵函數(shù)掛鉤。
Hook技術(shù)的難點,并不在于Hook技術(shù),初學者借助于資料“照葫蘆畫瓢”能夠很容易就掌握Hook的基本使用方法。如何找到函數(shù)的入口點、替換函數(shù),這就涉及了理解函數(shù)的連接與加載機制。
從Android的開發(fā)來說,Android系統(tǒng)本身就提供給了我們兩種開發(fā)模式,基于AndroidSDK的Java語言開發(fā),基于AndroidNDK的NativeC/C++語言開發(fā)。所以,我們在討論Hook的時候就必須在兩個層面上來討論。
對于Native層來說Hook的難點其實是在理解ELF文件與學習ELF文件上,特別是對ELF文件不太了解的讀者來說;對于Java層來說,Hook就需要了解虛擬機的特性與Java上反射的使用。
轉(zhuǎn)載:
原始函數(shù)是這樣的
[cpp] view plain copy
kernel32!CreateProcessInternalW:
00000000`7738e750 4c8bdc mov r11,rsp
00000000`7738e753 53 push rbx
00000000`7738e754 56 push rsi
00000000`7738e755 57 push rdi
00000000`7738e756 4154 push r12
00000000`7738e758 4155 push r13
00000000`7738e75a 4156 push r14
00000000`7738e75c 4157 push r15
00000000`7738e75e 4881ec400b0000 sub rsp,0B40h
00000000`7738e765 488b0564cc0e00 mov rax,qword ptr [kernel32!local_unwind+0x606b1 (00000000`7747b3d0)]
跟32位一樣,在函數(shù)入口寫入跳轉(zhuǎn)指令,跟32不一樣的是,不能再用之前的E9 xx xx xx xx這樣的指令了,E9不支持64位地址跳轉(zhuǎn),最大只能支持到32位,
直接用E9大部分情況下會出錯.所以我們換一種方法.
[cpp] view plain copy
mov rax,0x1122334455667788
jmp rax
機器碼是48 b8 8877665544332211 ffe0總共占了12個字節(jié),不是我們之前用E9跳轉(zhuǎn)的5字節(jié)了.
最前面的48叫REX Prefix,大家可以GOOGLE下,4是固定的,8表示使用64位寄存器.
如果沒有前面的48就變成了mov eax, 0x1122334455667788了,使用32位寄存器.
我們需要把函數(shù)前面12字節(jié)改成跳轉(zhuǎn)指令,正好
[cpp] view plain copy
00000000`7738e750 4c8bdc mov r11,rsp
00000000`7738e753 53 push rbx
00000000`7738e754 56 push rsi
00000000`7738e755 57 push rdi
00000000`7738e756 4154 push r12
00000000`7738e758 4155 push r13
00000000`7738e75a 4156 push r14
這12個字節(jié)是完整的7條指令,寫入12字節(jié)指令,不會破壞后面的指令.
寫入跳轉(zhuǎn)指令后
[cpp] view plain copy
kernel32!CreateProcessInternalW:
00000000`7738e750 48b8001055fbfe070000 mov rax,offset x64dll!FakeCreateProcessInternal (000007fe`fb551000)
00000000`7738e75a ffe0 jmp rax
00000000`7738e75c 4157 push r15
00000000`7738e75e 4881ec400b0000 sub rsp,0B40h
00000000`7738e765 488b0564cc0e00 mov rax,qword ptr [kernel32!local_unwind+0x606b1 (00000000`7747b3d0)]
00000000`7738e76c 4833c4 xor rax,rsp
00000000`7738e76f 48898424300b0000 mov qword ptr [rsp+0B30h],rax
00000000`7738e777 4889a42438050000 mov qword ptr [rsp+538h],rsp
完整代碼如下.
少NTDLL.h的朋友可以去搜索下載,也可以把RtlAdjustPrivilege替換成AdjustTokenPrivileges,效果樣的,只是代碼多幾行而已.
聲明:本人很菜,水平有限,匯編功底也是相當?shù)乃?如發(fā)現(xiàn)有誤人子弟之處,敬請指正.若您有更好的方法也請多多指教.
[cpp] view plain copy
#include stdio.h
#include tchar.h
#include windows.h
#include shlwapi.h
#include ntdll.h
#pragma comment(lib, "shlwapi.lib")
#define CODE_LEN 12
TCHAR ModuleFile[MAX_PATH];
DWORD dwOldProtect;
BYTE OldCode[CODE_LEN] = {0x90};
typedef HANDLE (WINAPI *__CreateProcessInternal)(HANDLE hToken,LPCTSTR lpApplicationName,LPTSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCTSTR lpCurrentDirectory,LPSTARTUPINFOA lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation,PHANDLE hNewToken);
__CreateProcessInternal pfnCreateProcess = 0;
HANDLE WINAPI FakeCreateProcessInternal(HANDLE hToken,LPCTSTR lpApplicationName,LPTSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCTSTR lpCurrentDirectory,LPSTARTUPINFOA lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation,PHANDLE hNewToken)
{
MessageBox(NULL, lpCommandLine, lpApplicationName, MB_ICONASTERISK);
return pfnCreateProcess(hToken, lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation, hNewToken);
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, // handle to DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpReserved ) // reserved
{
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
::DisableThreadLibraryCalls(hinstDLL);
GetModuleFileName(NULL, ModuleFile, _countof(ModuleFile));
if (StrRStrI(ModuleFile, 0, TEXT("explorer.exe")))
{
pfnCreateProcess = (__CreateProcessInternal)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "CreateProcessInternalW");
::VirtualProtect(pfnCreateProcess, CODE_LEN, PAGE_EXECUTE_READWRITE, dwOldProtect);
memcpy(OldCode, pfnCreateProcess, CODE_LEN);
memset(pfnCreateProcess, 0x90, CODE_LEN);
/*
mov rax, FakeCreateProcessInternal
jmp rax
*/
*(LPWORD)pfnCreateProcess = 0xb848;
*(INT64*)((INT64)pfnCreateProcess+2) = (INT64)FakeCreateProcessInternal;
*(LPWORD)((INT64)pfnCreateProcess+10) = 0xe0ff;
::VirtualProtect(pfnCreateProcess, CODE_LEN, dwOldProtect, NULL);
pfnCreateProcess = (__CreateProcessInternal)VirtualAlloc(NULL, CODE_LEN+12, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(pfnCreateProcess, OldCode, CODE_LEN);
/*
mov rax, CreateProcessInternalW + CODE_LEN
jmp rax
*/
*(LPWORD)((INT64)pfnCreateProcess+CODE_LEN) = 0xb848;
*(INT64*)((INT64)pfnCreateProcess+CODE_LEN+2) = (INT64)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "CreateProcessInternalW")+CODE_LEN;
*(LPWORD)((INT64)pfnCreateProcess+CODE_LEN+10) = 0xe0ff;
}
else if (StrRStrI(ModuleFile, 0, TEXT("Rundll32.exe")))
{
DWORD dwProcessId = 0;
HANDLE hProcess = 0;
HWND hwndDeskTop;
hwndDeskTop = FindWindow(TEXT("ProgMan"), NULL);
GetModuleFileName(hinstDLL, ModuleFile, _countof(ModuleFile));
GetWindowThreadProcessId(hwndDeskTop, dwProcessId);
BOOLEAN bEnable;
::RtlAdjustPrivilege(0x13, 1, 0, bEnable);
if (dwProcessId)
{
hProcess = OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, NULL, dwProcessId);
}
LPVOID Param = VirtualAllocEx(hProcess, NULL, 256, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(hProcess, Param, (LPVOID)ModuleFile, 256, NULL);
HANDLE hThread = CreateRemoteThread(hProcess,
NULL,
NULL,
(LPTHREAD_START_ROUTINE)LoadLibraryW,
Param,
NULL,
NULL);
if (hThread)
{
WaitForSingleObject(hThread, INFINITE);
}
VirtualFreeEx(hProcess, Param , 0, MEM_RELEASE);
CloseHandle(hThread);
CloseHandle(hProcess);
}
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
int _stdcall Setup(void)
{
return 1;
}
編譯成DLL后,在運行里執(zhí)行rundll32.exe X64Dll.dll,Setup,DLL會自動注入到explorer.exe進程.
完全工程及編譯好的文件點擊打開鏈接
順便說下,CreateRemoteThread在WIN7下是可以用的,問題不在CreateRemoteThread,而是在OpenProcess打開進程的權(quán)限
權(quán)限設(shè)為
[cpp] view plain copy
PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION
就可以了,WIN7( 32/64)測試都沒問題
新聞名稱:c語言函數(shù)劫持,js函數(shù)劫持
網(wǎng)站網(wǎng)址:http://chinadenli.net/article49/dsgpghh.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、網(wǎng)站策劃、、虛擬主機、網(wǎng)站改版、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)