首页
社区
课程
招聘
[原创]ZwLoadDriver用其他注册表路径加载驱动的办法~
发表于: 2011-10-28 13:44 23415

[原创]ZwLoadDriver用其他注册表路径加载驱动的办法~

2011-10-28 13:44
23415
先上代码~
#include <stdio.h>
#include <tchar.h>
#include   <locale.h>   
#include   <windows.h>   
#include <stdlib.h>
#include   <psapi.h>   
#include   <Tlhelp32.h>   
#pragma   comment   (lib,   "psapi.lib")
typedef struct _UNICODE_STRING {
	USHORT Length;
	USHORT MaximumLength;
	PWSTR Buffer;
} UNICODE_STRING;
typedef UNICODE_STRING *PUNICODE_STRING;
typedef struct _STRING {
	USHORT Length;
	USHORT MaximumLength;
	PCHAR Buffer;
} ANSI_STRING;
typedef ANSI_STRING *PANSI_STRING;
DWORD drvldr_load(char* drvname)
{
	char regkey[512];
	int buflen;
	UNICODE_STRING us;
	ANSI_STRING as;
	HMODULE hNtdll = LoadLibraryA( ("ntdll.dll") );
	int (__stdcall *RtlAnsiStringToUnicodeString)(void*,void*,int)=
		(int (__stdcall *)(void *,void *,int))GetProcAddress(hNtdll,"RtlAnsiStringToUnicodeString");
	int (__stdcall *ZwLoadDriver)(void*)=
		(int (__stdcall *)(void *))GetProcAddress(hNtdll,"ZwLoadDriver");
	///
	buflen=sprintf(regkey,"\\Registry\\Machine\\SOFTWARE\\%s",drvname);
	as.Buffer = (PCHAR)regkey;
	as.Length = (USHORT)buflen;
	as.MaximumLength=(USHORT)buflen;
	RtlAnsiStringToUnicodeString(&us, &as,TRUE);

	return ZwLoadDriver(&us);
}
DWORD drvldr_reg(char* drvname,DWORD start_type,char* path)
	//path should be kernel type like \??\xxx
{
	char regkey[512];
	DWORD regdata;
	int buflen;
	HKEY hkey;
	///
	sprintf(regkey,"SOFTWARE\\%s",drvname);
	if(RegCreateKeyA(HKEY_LOCAL_MACHINE, regkey, &hkey)!=ERROR_SUCCESS)
	{return -1;}
	regdata=SERVICE_KERNEL_DRIVER;
	RegSetValueExA(hkey, ("Type"), 0, REG_DWORD, (const unsigned char *)®data, 4);
	regdata=SERVICE_ERROR_NORMAL;
	RegSetValueExA(hkey, ("ErrorControl"), 0, REG_DWORD, (const unsigned char *)®data, 4);
	regdata = start_type;
	RegSetValueExA(hkey, ("Start"), 0, REG_DWORD, (const unsigned char *)®data, 4);
	buflen = strlen(drvname);
	RegSetValueExA(hkey, ("DisplayName"), 0, REG_EXPAND_SZ, (const unsigned char *)drvname, buflen);
	buflen = strlen(path); 
	RegSetValueExA(hkey, ("ImagePath"), 0, REG_EXPAND_SZ, (const unsigned char *)path, buflen);
	RegSetValueExA(hkey,("Group"),0,REG_SZ,(const BYTE *)"Base",strlen("Base"));
	RegCloseKey(hkey); 
	//sprintf(regkey,"System\\CurrentControlSet\\Services\\%s",drvname);
	//RegCreateKeyA(HKEY_LOCAL_MACHINE, regkey, &hkey);
	//regdata=SERVICE_KERNEL_DRIVER;
	//RegCloseKey(hkey); 
	sprintf(regkey,"System\\Setup\\AllowStart\\%s",drvname);
	RegCreateKeyA(HKEY_LOCAL_MACHINE, regkey, &hkey);
	regdata=SERVICE_KERNEL_DRIVER;
	RegCloseKey(hkey); 
	return 0;
}
//Jan 4 2005
//Enable specific privilege
BOOL EnableSpecificPrivilege(BOOL bEnable,LPCTSTR Name)
{
	BOOL bResult = FALSE;
	HANDLE hToken;
	TOKEN_PRIVILEGES TokenPrivileges;

	if(OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,&hToken) == 0)
	{
		return FALSE;
	}

	TokenPrivileges.PrivilegeCount = 1;
	TokenPrivileges.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
	bResult = LookupPrivilegeValue(NULL,Name,&TokenPrivileges.Privileges[0].Luid);
	if(!bResult)
	{
		CloseHandle(hToken);
		return FALSE;
	}

	bResult = AdjustTokenPrivileges(hToken,FALSE,&TokenPrivileges,sizeof(TOKEN_PRIVILEGES),NULL,NULL);
	if(GetLastError() != ERROR_SUCCESS || !bResult)
	{
		CloseHandle(hToken);
		return FALSE;
	}

	CloseHandle(hToken);
	return TRUE;
}

//Jan 4 2005
//Enable all privilege, return num of privileges successfully enabled
DWORD EnableAllPrivilege(BOOL bEnable)
{
	DWORD count=0; 
	///
	count+=EnableSpecificPrivilege(bEnable,SE_ASSIGNPRIMARYTOKEN_NAME);
	count+=EnableSpecificPrivilege(bEnable,SE_AUDIT_NAME);
	count+=EnableSpecificPrivilege(bEnable,SE_BACKUP_NAME);
	count+=EnableSpecificPrivilege(bEnable,SE_CHANGE_NOTIFY_NAME);
	count+=EnableSpecificPrivilege(bEnable,SE_CREATE_PAGEFILE_NAME);
	count+=EnableSpecificPrivilege(bEnable,SE_CREATE_PERMANENT_NAME);
	count+=EnableSpecificPrivilege(bEnable,SE_CREATE_TOKEN_NAME);
	count+=EnableSpecificPrivilege(bEnable,SE_DEBUG_NAME);
	count+=EnableSpecificPrivilege(bEnable,SE_INC_BASE_PRIORITY_NAME);
	count+=EnableSpecificPrivilege(bEnable,SE_INCREASE_QUOTA_NAME);
	count+=EnableSpecificPrivilege(bEnable,SE_LOAD_DRIVER_NAME);
	count+=EnableSpecificPrivilege(bEnable,SE_LOCK_MEMORY_NAME);
	count+=EnableSpecificPrivilege(bEnable,SE_PROF_SINGLE_PROCESS_NAME);
	count+=EnableSpecificPrivilege(bEnable,SE_REMOTE_SHUTDOWN_NAME);
	count+=EnableSpecificPrivilege(bEnable,SE_RESTORE_NAME);
	count+=EnableSpecificPrivilege(bEnable,SE_SECURITY_NAME);
	count+=EnableSpecificPrivilege(bEnable,SE_SHUTDOWN_NAME);
	count+=EnableSpecificPrivilege(bEnable,SE_SYSTEM_ENVIRONMENT_NAME);
	count+=EnableSpecificPrivilege(bEnable,SE_SYSTEM_PROFILE_NAME);
	count+=EnableSpecificPrivilege(bEnable,SE_SYSTEMTIME_NAME);
	count+=EnableSpecificPrivilege(bEnable,SE_TAKE_OWNERSHIP_NAME);
	count+=EnableSpecificPrivilege(bEnable,SE_TCB_NAME);
	count+=EnableSpecificPrivilege(bEnable,SE_UNSOLICITED_INPUT_NAME);
	count+=EnableSpecificPrivilege(bEnable,SE_MACHINE_ACCOUNT_NAME);

	return count;
}
int _tmain(int argc, _TCHAR* argv[])
{
	EnableAllPrivilege(TRUE);
	drvldr_reg("caonima",3,"\\??\\D:\\1.sys");
	drvldr_load("caonima");
	return 0;
}


对于1.sys的有些特殊的要求,首先1.sys里的代码不会被真的执行,但是1.sys这个驱动导入的动态库驱动可以被执行
举例下图:
1.sys的导入表样子:

导入的dllsys的导出表样子:

真正被执行的代码要写在动态库驱动的NTSTATUS DllInitialize(IN PUNICODE_STRING RegistryPath)里~~
具体怎么写内核版动态库,请自行baidu研究。
好了爆完~这个方法的好处就是写注册表的过程基本不触发任何报警——至于加载部分,仁者见仁吧,这玩意2005年的东西了~

[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 6
支持
分享
最新回复 (32)
雪    币: 544
活跃值: (264)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
2
顶!              
2011-10-28 14:11
0
雪    币: 357
活跃值: (3123)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
3
太坏了
2011-10-28 14:12
0
雪    币: 275
活跃值: (51)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
板凳,从微博里面看到的···
2011-10-28 14:14
0
雪    币: 55
活跃值: (75)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
5
顶楼主啊,v校多爆点东西出来哦,让我等菜鸟多学点东西呢。
2011-10-28 14:48
0
雪    币: 1233
活跃值: (907)
能力值: ( LV12,RANK:750 )
在线值:
发帖
回帖
粉丝
6
还是不够猛阿!
2011-10-28 15:10
0
雪    币: 475
活跃值: (59)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
听说v校又爆料了,火速过来膜拜。
2011-10-28 15:21
0
雪    币: 105
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
前排围观爆料
2011-10-28 15:49
0
雪    币: 412
活跃值: (30)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
9
好一个驱动.
drvldr_load("caonima");
2011-10-28 16:16
0
雪    币: 195
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
前排围观,出售广告位
2011-10-28 16:20
0
雪    币: 402
活跃值: (342)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
11
顶V大...
2011-10-28 16:55
0
雪    币: 62
活跃值: (72)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
12
前排围观v大
2011-10-28 16:55
0
雪    币: 27
活跃值: (90)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
13
老V终于把这个爆料了。。
2011-10-28 16:56
0
雪    币: 88
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
V校爆料 没有及时膜拜 罪过罪过啊~
2011-10-28 17:14
0
雪    币: 1751
活跃值: (1611)
能力值: ( LV12,RANK:222 )
在线值:
发帖
回帖
粉丝
15
顶!看起来很强大。
2011-10-28 18:08
0
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
16
Orz
为什么权限令牌要弄这么一堆?
2011-10-28 18:09
0
雪    币: 87
活跃值: (41)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
17
学习+学习+学习
2011-10-29 13:09
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
18
太强大饿 V校真是神人
2011-10-29 22:57
0
雪    币: 615
活跃值: (1127)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
19
羞死了 坏!
2011-10-30 09:36
0
雪    币: 306
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
MJ说:我要爆V的J
2011-10-30 20:01
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
21
这跟MJ有啥关系呢?
2011-10-30 23:40
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
看看

谢谢
2011-10-31 00:25
0
雪    币: 51
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
相当的牛B啊。
2011-10-31 09:26
0
雪    币: 471
活跃值: (3703)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
24
感谢V校科普..........................
2011-10-31 13:36
0
雪    币: 321
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
驱动名太nb了。
2011-10-31 19:54
0
游客
登录 | 注册 方可回帖
返回
//