远程线程的实现
先申明哈本人是菜鸟,下面发表自己对远程线程的学习认识,如有不完善的地方,还忘高人指教:
1.在windows32位的系统下,各个进程之间都是受到保护的,各个进程拥有自己的私有地址空间,使得要想访问其他进程有一定的难度,但是微软还是给大家留了一首哈哈...........那就是通过远程线程可以实现。现在我们一起来学习以下怎么样通过远程线程访问其他进程,包括一些系统进程。
2.上面提到了win32下的各个进程是受保护的,所以我们在打开其他进程前就必须先把自己的进程的权限提升。提升本地进程的权限是有函数可以实现的:OpenProcessToken|() LookupPrivilegeValue() | AdjustTokenPrivileges(). 通过这3个函数即可。函数的具体使用大家可以参考msdn........我把自己的代码贴在下面供大家参考:
HANDLE hToken;
TOKEN_PRIVILEGES tp = { 0 };
LUID id;
HANDLE hProcess = GetCurrentProcess();
if (!OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
&hToken))
return;
if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &id))
{
CloseHandle(hToken);
return;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid=id;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES),
NULL, NULL);
2.现在已经把权限提升了,仅接到做什么呢?
那就是打开目标进程,在目标进程内划分一块空间给我们自己写的代码使用:
我们使用函数CreateToolhelp32Snapshot()给当前的进程列表创建一个快照,
Processentery32 pe32;
Handle hsnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) 第一个参数表示对当前的进程快照,参考msdn可以看到还有其他参数。Process32first(shnap,&pe32);
这个函数是对快照的进程列表的第一个进程查找,然后使用prcocess32next(shnap,&pe32)
对下一个查找。知道找到目标进程,pe32.th32ProcessID;获得目标进程的id号。
然后使用openprocess()函数打开目标进程并获得目标进程的句柄,接到用VirtualAllocEx()函数在目标进程中划分空间,他的第一个参数就是目标进程的句柄,如果为NULL的话,就是在本进程中划分空间大小。
目标进程打开了,空间大小划分了,但是咋个在目标进程中写东写了?????????
呵呵。。。。。
我们可以这样来:先在自己的程序中写好,考到我们刚刚划分的那个空间中去(这里就要用到memcpy()这个函数),这里用说名一点的是,空间大下一定要大于我们准备写的代码(写到目标进程中去的)。
最后就是使用CreateRemoteThread()这个函数这目标进程中创建一个线程,这个函数很好,值得大家认真学习一哈。
最后在说一哈,这个技术当中最麻烦的地方是们,那就是在目标进程划分出的空间中写代码是最麻烦的。为啥这样说呢?这里就涉及到地址的处理。我们通常这样来,#define beep_addr 0xAAAAAAAA
先宏定义。然后在本进程中获得要调用的函数的地址,列入Beep(),这个函数,
Hmodul hg=getmodulehandle(“kernel32”);
Handle mm=getprocaddress(hg,“Beep”);
把handle放到我们beep_addr中去。
说到这里也差不多了,哈哈。。。小弟实属菜鸟。。学习,忘高人不要见笑!!!!!