首页
社区
课程
招聘
[原创]Ring3下劫持CreateProcess注入dll
发表于: 2010-12-8 22:38 144501

[原创]Ring3下劫持CreateProcess注入dll

2010-12-8 22:38
144501

前段时间写的代码,写完后一运行就出错,又因为手头有点事,就放在那了.今天中午没事拿出来和"雪"牛一起看了看,终于能跑起来了.这种被ken戏称称为"吸星大法"的技术,确实没啥新意,只当练手吧.顺便温习下IAT HOOK和PE结构.高手飘过!
大体说下思路:首先利用远程线程注入到系统的explorer.exe进程,注入后利用IAT HOOK,勾住explorer.exe的CreateProcessA,因为应用程序都是这个桌面进程拉起来的.所以后面创建的进程,都会走进我们挂钩后的函数.在我们的函数中做下过滤,根据进程名判断是否是我们感兴趣的进程.如果是,以CREATE_SUSPENDED标志创建进程,此时该进程虽然被创建但已被挂起.这时,我们可以将进程对应的可执行文件映射进内存,根据PE结构知道该进程的EP,然后修改EP处的代码.我这里选择的方式是,从EP开始搜索第一个call xxxx,然后修改xxxx处的地址,直接跳转到我们的代码处(当然必须先将我们的代码写入目标进程中),执行完我们的代码,再JMP到call对应的xxxx处.至于我们的代码中要干什么,想干什么就干什么了,我这里只是向进程load了一个dll.有人可能会问,这样不是闲着蛋疼,没事找事,直接为目标进程创建一个LoadlibraryA的远程线程不就load一个dll了,问题是有些进程自己做了保护,程序运行起来后,就不那么轻易让你注入了.废话不多说,直接上代码吧!
代码1:向系统的explorer.exe进程注入DLL
这段代码没什么好解释的,就是在系统进程快照中查找名叫explorer.exe的进程id,然后通过OpenProcess将进程映射到本进程的句柄表中,再远程分配空间,写内存,创建远程线程.

void main()
{
	char lpDllName[100] = {0};
	GetCurrentDirectory( 100, lpDllName );
	strcat( lpDllName, "\\InjectProcessDll.dll" );
	cout<<"Dll当前路径:"<<lpDllName<<endl;

	HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
	if( hSnapshot == NULL )
	{
		cout<<"Create Snapshot false."<<endl;
		cin.get();
		return;
	}
	PROCESSENTRY32 stProcessEntry32 = {0};
	stProcessEntry32.dwSize = sizeof(PROCESSENTRY32);
	Process32First( hSnapshot, &stProcessEntry32 );
	bool bFind = false;
	do
	{
		if( strncmp( stProcessEntry32.szExeFile, "explorer.exe", strlen("explorer.exe") ) == 0 )
		{
			bFind = true;
			break;
		}
	}while( Process32Next( hSnapshot, &stProcessEntry32 ) );
	CloseHandle( hSnapshot );
	if( !bFind )
	{
		cout<<"查找explorer进程失败."<<endl;
		cin.get();
		return;
	}

	DWORD dwPId = stProcessEntry32.th32ProcessID;
	HANDLE hProcess = OpenProcess(  PROCESS_ALL_ACCESS, false, dwPId );
	if( hProcess == NULL )
	{
		cout<<"打开explorer进程失败."<<endl;
		cin.get();
		return;
	}
	LPVOID lpDllNameAddr = VirtualAllocEx( hProcess, NULL, strlen(lpDllName)+1, MEM_COMMIT, PAGE_READWRITE );
	if( lpDllNameAddr == NULL )
	{
		cout<<"explorer进程中申请内存失败."<<endl;
		CloseHandle(hProcess);
		cin.get();
		return;
	}
	cout<<"在目标进程:"<<stProcessEntry32.szExeFile<<"中申请的空间地址:"<<hex<<lpDllNameAddr<<endl;
	DWORD dwRes = 0;
	bool bRet = WriteProcessMemory( hProcess, lpDllNameAddr, lpDllName, strlen(lpDllName), &dwRes );
	if( !bRet )
	{
		cout<<"explorer进程写信息失败."<<endl;
		VirtualFreeEx( hProcess, lpDllNameAddr, strlen(lpDllName)+1, MEM_DECOMMIT );
		CloseHandle(hProcess);
		cin.get();
		return;

	}
	HMODULE hModuleKernel32 = GetModuleHandle("kernel32.dll");
	LPTHREAD_START_ROUTINE lpLoadLibraryAddr = (LPTHREAD_START_ROUTINE)GetProcAddress( hModuleKernel32, "LoadLibraryA" );
	if( lpLoadLibraryAddr != NULL )
	{
		cout<<"获得函数地址:"<<hex<<lpLoadLibraryAddr<<endl;
		HANDLE hRemote = CreateRemoteThread( hProcess, NULL, 0, lpLoadLibraryAddr, lpDllNameAddr, 0, NULL );
		if( hRemote != NULL )
		{
			cout<<"创建远程线程成功,句柄:"<<hex<<hRemote<<endl;
			WaitForSingleObject( hRemote, INFINITE );
			CloseHandle( hRemote );
			cout<<"远程线程运行结束"<<endl;
			cin.get();

		}
		else
			cout<<"创建远程线程失败."<<endl;
	}
	else
		cout<<"获取LoadLibrary地址失败"<<endl;

	
	VirtualFreeEx( hProcess, lpDllNameAddr, strlen(lpDllName)+1, MEM_DECOMMIT );
	CloseHandle(hProcess);
	cin.get();
	return;


}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (123)
雪    币: 410
活跃值: (214)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
2
没人顶。自己顶下。。
2010-12-9 17:43
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不错啊,顶一下~~~
有没有单exe文件注入的相关代码和说明
2010-12-9 18:32
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
顶顶顶顶
2010-12-9 18:36
0
雪    币: 306
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼主能提供工程文件吗?,这个有点意思,但是不是所有的进程都是explorer创建的
2010-12-9 19:00
0
雪    币: 410
活跃值: (214)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
6
1。文中已经指出,大部分应用程序,并非所有进程
2。工程文件见附件
2010-12-9 20:50
0
雪    币: 272
活跃值: (3263)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
好东西,,标注下
2010-12-9 21:06
0
雪    币: 1149
活跃值: (888)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
8
看帖 回帖是一种美德  顶了。。。。。。你 注入了 explorer.exe  所以 你可以多干了很多事。。
2010-12-9 21:52
0
雪    币: 1369
活跃值: (5190)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
谢谢分享啊....
2010-12-10 09:32
0
雪    币: 197
活跃值: (82)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
Mark学习
2010-12-10 09:37
0
雪    币: 547
活跃值: (2200)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
11
收集代码,学习注入,谢谢
2010-12-10 12:27
0
雪    币: 145
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
还是直接用汇编吧,然后实现自定位那样不是更好
2010-12-11 12:59
0
雪    币: 81
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
13
谢谢。。复习下。。。。
2010-12-11 15:07
0
雪    币: 94
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
给力,给力。
2010-12-11 15:21
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
收藏了。哈哈
2010-12-11 21:08
0
雪    币: 439
活跃值: (1284)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
16
TAG:劫持、注入
2010-12-11 22:34
0
雪    币: 458
活跃值: (36)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
呵呵,这个不错,支持开源。
2010-12-12 00:55
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
我六个区,这邪恶
2010-12-12 08:03
0
雪    币: 78
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
够邪恶的
2010-12-12 08:08
0
雪    币: 1075
活跃值: (1481)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
写的不错,下载学习一下。
2010-12-12 10:21
0
雪    币: 386
活跃值: (46)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
21
支持有码,注多了会不会导致explorer进程假死呢?
2010-12-12 10:37
0
雪    币: 585
活跃值: (578)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
22
进程间的 API HOOK,标记备查
2010-12-12 13:37
0
雪    币: 149
活跃值: (171)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
23
收藏一下。学习了。。。
2010-12-12 20:43
0
雪    币: 219
活跃值: (208)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
谢谢分享啊....
2010-12-12 21:29
0
雪    币: 221
活跃值: (2326)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
25
谢谢。学习一下!!!!
2010-12-12 22:15
0
游客
登录 | 注册 方可回帖
返回
//