資源簡介
用了幾天時間開發的一個源代碼函數庫,
函數庫提供了一種在驅動里執行用戶層代碼的途徑,
具體實現了調用LoadLibrary來在某個現有的進程中加載一個DLL,調用WinExec來啟動一個進程。
測試能在winXP 32, WIN7 32位 和WIN7 64位等系統中運行。
在DriverEntry中調用 cbk_init初始化。
在卸載函數中調用 cbk_deinit清除。
在某個進程上下文執行環境調用cbk_execute。
如果要在某個現有進程中加載DLL,調用 cbkInsertLoadLibraryA/W
如果要在某個現有進程調用WinExec來啟動另外一個進程,調用 cbkInsertWinExec
函數庫有為木馬開發者提供一點點后門之嫌疑,慎用。
對應的博客文章 http://blog.csdn.net/fanxiushu/article/details/38141219

代碼片段和文件信息
///?By?Fanxiushu?2014-06-25
//http://thisissecurity.net/2014/04/08/how-to-run-userland-code-from-the-kernel-on-windows/
#include?“callback.h“
/////////////////////////////////////在用戶應用程序里執行
struct?SHELLCODE_PARAMS
{
PVOID?pfunc;
PVOID?param;
BOOLEAN?bWinExec;
};
static?ULONG?ShellCode_Start(PVOID?data?ULONG?data_len)
{
SHELLCODE_PARAMS*?params?=?(SHELLCODE_PARAMS*)data;
if?(params->bWinExec){?//?WinExec
///
((ULONG(_stdcall*)(PVOID?int))(params->pfunc))(params->param?1?);
}
else{
///
((ULONG(_stdcall*)(PVOID))(params->pfunc))(params->param);
}
////?這個返回值等于?KeUserModeCallback?返回值
return?STATUS_SUCCESS;
}
static?VOID?ShellCode_End(){}
//////////////////////////////////////////////////////////
//分配內存KeUserModeCallback?第一個參數是?ULONG,?所以?64位系統的分配策略從基址開始尋找?4G范圍內的空閑空間
static?NTSTATUS?getProcessMemory(HANDLE?proc_handlePVOID?baseAddr?PVOID*?ppMem?SIZE_T*?pSize)
{
NTSTATUS?status?=?STATUS_UNSUCCESSFUL;
#ifdef?_WIN64
const?ULONG?COUNT?=?1000;?const?ULONG?SepSize?=?1024?*?1024?*?3?/?2;?const?ULONG_PTR?base?=?1024?*?1024?*?50;
ULONG?i;
for?(i?=?0;?i? ULONG_PTR?pMem?=?(ULONG_PTR)baseAddr?+?base?+?i*SepSize;?
SIZE_T?size?=?*pSize;?
status?=?ZwAllocateVirtualMemory(proc_handle?(PVOID*)&pMem?0?&size?MEM_COMMIT?|?MEM_RESERVE??PAGE_EXECUTE_READWRITE);
if?(NT_SUCCESS(status)){
*pSize?=?size;
*ppMem?=?(PVOID)pMem;
break;?
}
}
#else
status?=?ZwAllocateVirtualMemory(proc_handle?ppMem?0?pSize?MEM_COMMIT?|?MEM_RESERVE?|?MEM_TOP_DOWN?PAGE_EXECUTE_READWRITE);
#endif
return?status;
}
////?KeUserModeCallback?一定要在當前進程的當前用戶線程環境下調用才成功
static?NTSTATUS?CallKeUserModeCallback(HANDLE?proc_handle?PVOID?KernelCallbackTable
PVOID?func_addr?PVOID?lpParam?ULONG?ParamSize?BOOLEAN?bWinExec?)
{
NTSTATUS?status?=?STATUS_SUCCESS;
//
PVOID?pMem?=?NULL;
SIZE_T?size?=?ParamSize;
size?=?(size?/?PAGE_SIZE?+?1)*PAGE_SIZE?+?PAGE_SIZE;?///計算占用進程的空間
status?=?getProcessMemory(proc_handle?KernelCallbackTable?&pMem?&size);
if?(!NT_SUCCESS(status)){
DPT(“ZwAllocateVirtualMemory?Err=0x%X\n“?status);
return?status;
}??????????????????????????????????
DPT(“pMem?Addr=%p;?KernelCallbackTable=%p\n“?pMem?KernelCallbackTable);
__try{
////
ULONG?TableIndex?=?(((ULONG_PTR)pMem?-?(ULONG_PTR)KernelCallbackTable)?/?sizeof(ULONG_PTR));??//獲取索引
PVOID?ShellCodeAddr?=?(PVOID)((ULONG_PTR)pMem?+?sizeof(ULONG_PTR));
ULONG?ShellCodeSize?=?(ULONG_PTR)ShellCode_End?-?(ULONG_PTR)ShellCode_Start;
PVOID?ParamAddr?=?(PVOID)((ULONG_PTR)ShellCodeAddr?+?ShellCodeSize);
*(ULONG_PTR*)pMem?=?(ULONG_PTR)ShellCodeAddr;??///?把開頭地址內容寫成下ShellCode執行的真正地址?KernelCallbackTable[TableIndex]?=?ShellCodeAddr;?
RtlCopyMemory(ShellCodeAddr?ShellCode_Start?ShellCodeSize);
RtlCopyMemory(ParamAddr?lpParam?ParamSize);
SHELLCODE_PARAMS?sp;?RtlZeroMemory(&sp?sizeof(SHELLCODE_PARAMS));
sp.pfunc?=?func_addr;
sp.param?=?ParamAddr;
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????530??2014-07-26?20:11??說明.txt
?????文件??????15883??2014-07-26?18:01??callback.cpp
?????文件???????3712??2014-07-01?11:11??callback.h
?????文件???????4232??2014-07-07?15:50??common.cpp
?????文件???????3053??2014-07-15?15:53??common.h
?????文件??????55858??2014-06-25?14:50??pedef.h
-----------?---------??----------?-----??----
????????????????83268????????????????????6
評論
共有 條評論