首页
社区
课程
招聘
[原创]重读老文章系列:另类远程线程模式
发表于: 2012-7-19 23:24 27040

[原创]重读老文章系列:另类远程线程模式

2012-7-19 23:24
27040
一提到远程线程,一般都想到DLL注入啊,shellcode运行啊~
其实这两种根本不给力啊~
现在让我们来说一种新模型哦~
不借助shellcode,不借助不给力的DLL注入,我们直接在远程运行EXE里的代码~
当然API还是那个API,这里涉及到PE文件的一些知识,就不多说了,直接上代码~

PS:
一如既往,有意资助者请联系QQ:86879759

LPVOID CopyModule(HANDLE proc, LPVOID image)
{
	PIMAGE_NT_HEADERS headers = (PIMAGE_NT_HEADERS)((LPBYTE)image + ((PIMAGE_DOS_HEADER)image)->e_lfanew);
	PIMAGE_DATA_DIRECTORY datadir;
	DWORD size = headers->OptionalHeader.SizeOfImage;
	LPVOID mem = NULL;
	LPBYTE buf = NULL;
	BOOL ok = FALSE;

	if (headers->Signature != IMAGE_NT_SIGNATURE)
		return NULL;

	if (IsBadReadPtr(image, size))
		return NULL;

	mem = VirtualAllocEx(proc, NULL, size, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);

	if (mem != NULL) {
		buf = (LPBYTE)VirtualAlloc(NULL, size, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);

		if (buf != NULL) {
			RtlCopyMemory(buf, image, size);

			datadir = &headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC];

			if (datadir->Size > 0 && datadir->VirtualAddress > 0) {
				DWORD_PTR delta = (DWORD_PTR)((LPBYTE)mem - headers->OptionalHeader.ImageBase);
				DWORD_PTR olddelta = (DWORD_PTR)((LPBYTE)image - headers->OptionalHeader.ImageBase);
				PIMAGE_BASE_RELOCATION reloc = (PIMAGE_BASE_RELOCATION)(buf + datadir->VirtualAddress);

				while(reloc->VirtualAddress != 0) {
					if (reloc->SizeOfBlock >= sizeof(IMAGE_BASE_RELOCATION)) {
						DWORD count = (reloc->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof(WORD);
						LPWORD list = (LPWORD)((LPBYTE)reloc + sizeof(IMAGE_BASE_RELOCATION));
						DWORD i;

						for (i = 0; i < count; i++) {
							if (list[i] > 0) {
								DWORD_PTR *p = (DWORD_PTR *)(buf + (reloc->VirtualAddress + (0x0FFF & (list[i]))));

								*p -= olddelta;
								*p += delta;
							}
						}
					}

					reloc = (PIMAGE_BASE_RELOCATION)((LPBYTE)reloc + reloc->SizeOfBlock);
				}

				ok = WriteProcessMemory(proc, mem, buf, size, NULL);
			}

			VirtualFree(buf, 0, MEM_RELEASE); // release buf
		}

		if (!ok) {
			VirtualFreeEx(proc, mem, 0, MEM_RELEASE);
			mem = NULL;
		}
	}

	return mem;
}

BOOL NewInject(DWORD pid, LPTHREAD_START_ROUTINE start)
{
	HANDLE proc, thread;
	HMODULE module, newmodule;
	BOOL ok = FALSE;

	proc = OpenProcess(PROCESS_QUERY_INFORMATION |
		PROCESS_VM_OPERATION |
		PROCESS_VM_WRITE |
		PROCESS_VM_READ |
		PROCESS_CREATE_THREAD |
		PROCESS_DUP_HANDLE,
		FALSE, pid);

	if (proc != NULL) {
		module = GetModuleHandle(NULL);

		newmodule = (HMODULE)CopyModule(proc, module);

		if (newmodule != NULL) {
			LPTHREAD_START_ROUTINE entry = (LPTHREAD_START_ROUTINE)((LPBYTE)newmodule + (DWORD_PTR)((LPBYTE)start - (LPBYTE)module));

			thread = CreateRemoteThread(proc, NULL, 0, entry, NULL, 0, NULL);

			if (thread != NULL) {
				CloseHandle(thread);
				ok = TRUE;
			}
			else {
				VirtualFreeEx(proc, module, 0, MEM_RELEASE);
			}
		}

		CloseHandle(proc);
	}

	return ok;
}


使用样例:
//提权DEBUG后
NewInject(GetProcessIdByName(L"Diablo III.exe"), ThreadProc);


一切代码如同在本地一样,EXE就可以~

[课程]Linux pwn 探索篇!

收藏
免费 6
支持
分享
最新回复 (49)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
老V 用力 不要停啊
2012-7-19 23:29
0
雪    币: 31
活跃值: (43)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
代码没能看懂,能说下思路吗?
2012-7-19 23:34
0
雪    币: 128
活跃值: (27)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
看懂了,标题起的不好啊,文不对题

其实就是省去提取shellcode,
让“一切代码如同在本地一样”
2012-7-19 23:59
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
5
起名麻烦,本来想直接打 重读老文章系列(3) 的
2012-7-20 02:50
0
雪    币: 219
活跃值: (738)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
6
学习 shellcode中
2012-7-20 07:04
0
雪    币: 416
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
2012-7-20 08:10
0
雪    币: 1905
活跃值: (1537)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
构造function,重定位替代old function?
2012-7-20 09:47
0
雪    币: 596
活跃值: (449)
能力值: ( LV12,RANK:320 )
在线值:
发帖
回帖
粉丝
9
去年分析过的几个病毒就用过这种方法
2012-7-20 10:00
0
雪    币: 1149
活跃值: (833)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
10
ls 是明白人 呵呵....继续学习....
2012-7-20 10:04
0
雪    币: 220
活跃值: (701)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
不知道稳定性和兼容性怎么样?
2012-7-20 10:46
0
雪    币: 78
活跃值: (85)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
额,这个,得自带重定位节的EXE才行,也就是说只能自个儿写的exe通用~~

还以为是过HIPS的呢~呵呵
2012-7-20 11:47
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
希望楼主以后上传代码不要把注释都删掉,照顾一下菜鸟呗.....
2012-7-20 14:58
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
知识还是要靠积累的,就涉及PE文件头,还有几个API,看不懂,楼主也照顾不了。
2012-7-20 15:03
0
雪    币: 507
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
最近分析到几个样本 就是类似这种方式起个傀儡svchost干坏事,有些申请空间后解密恶意代码跳过去,有些就直接覆盖svchost的代码。。。。不会是LZ的作品吧~ :)
2012-7-20 15:31
0
雪    币: 297
活跃值: (235)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
16
大体看了下写入了重定位信息么,写外壳的时候用过这种方式
2012-7-20 17:35
0
雪    币: 208
活跃值: (148)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
就是把本进程exe加载到内存后的整个内存镜像重定位,拷贝到其他进程,在执行
2012-7-20 19:23
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
18
话说,这可不是僵尸哦,亲,被注入的进程完美生存着,僵尸这种东西是肉眼可见的东西啊。我的作品基本都是正常软件啊,不过**一点而已。
2012-7-20 20:41
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
思想总是这么飞跃
2012-7-20 21:30
0
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
谢谢无私,收藏了。
2012-7-20 21:50
0
雪    币: 6
活跃值: (1099)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
有码的就要顶
2012-7-20 22:00
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
mark一下

虽然现在没看懂

等一会ih
2012-7-20 22:24
0
雪    币: 182
活跃值: (221)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
打开目标进程,开内存,把自己按照PE复制进去,修正重定位,然后远线程调用自身启动函数?
2012-7-20 22:32
0
雪    币: 182
活跃值: (221)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
不是运行短短shellcode,而是整个程序本身,编写调试简单了,功能还能做的强大
2012-7-20 22:33
0
雪    币: 231
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
测试了这份代码,直接被3XX给阻止了。有没有不被拦截的呢?
2012-7-20 22:50
0
游客
登录 | 注册 方可回帖
返回
//