电脑好像被远程线程注入是病毒吗了,怎么办?求高手

注入代码,注入DLL
打开被注入的进程
  OpenProcess
定义HThreadProc:  VirtualAllocEx  WriteProcessMemory
在某进程进程创建一个远端线程:  CreateRemoteThread(HThreadProc)
HThreadProc()
  LoadLibrary(dll);
阅读(...) 评论()远程线程注入而隐藏恶意代码方法(分析转载)
让自己的代码作为宿主进程的线程,在宿主进程的地址空间中执行确实是个不错的主意。但是要自己把程序放到其他进程的地址空间中去运行,将面临一个严峻的问题:如何实现代码重定位。关于重定位问题,请看下面的程序:& int func()//函数func的定义 & int a = func();//对func的调用 &这段程序经过编译链接后,可能会变成下面的样子: & 0x: push ebp//这是函数func的入口 0x: mov ebp, esp & 0x: call //对函数func的调用 0x: mov dword ptr [ebp-08], eax &请注意&0x&处的直接寻址指令&call &。上面的程序在正常执行(由windows装入并执行)时,因为PE文件的文件头中含有足够的信息,所以系统能够将代码装入到合适的位置从而保证地址&&处就是函数func的入口。但是当我们自己把程序装入到其他进程的地址空间中时,我们无法保证这一点,最终的结果可能会象下面这样:& 0x: push ebp//这是函数func的入口 0x: mov ebp, esp & 0x: call 401800处是什么 0x: mov dword ptr [ebp-08], eax &显然,运行上面的代码将产生不可预料的结果(最大的可能就是执行我们费尽千辛万苦才装入的代码的线程连同宿主进程一起被系统杀死)。 不知大家注意过系统中动态链接库(dll)的装入没有:一个dll被装入不同进程时,装入的地址可能不同,所以系统在这种情况下也必须解决dll中直接寻址指令的重定位问题。原来,绝大多数dll中都包含一些由编译器插入的用于重定位的数据,这些数据就构成了重定位表。系统根据重定位表中的数据,修改dll的代码,完成重定位操作。Richer使用的LoadLibrary也是借用了这一点。所以我们的重定位方法就是:替系统来完成工作,自己根据重定位表中的数据进行重定位。既然如此,那就让我们来了解一下重定位表吧。 先来分析一下重定位表中需要保存哪些信息。还以上面的代码为例,要让它能正确执行,就必须把指令&call &改为&call &。进行这一改动需要两个数据,第一是改哪,也就是哪个内存地址中的数据需要修改,这里是&0x&(不是&0x&);第二是怎么改,也就是应该给该位置的数据加上多少,这里是&0x&。这第二个数据可以从dll的实际装入地址和建议装入地址计算而来,只要让前者减后者就行了。其中实际装入地址装入的时候就会知道,而建议装入地址记录在文件头的ImageBase字段中。所以,综上所述,重定位表中需要保存的信息是:有待修正的数据的地址。
位置数据描述
0h页起始地址(RVA)
0h重定位块长度
h第一个重定位项,32位都须修正
000ah300dh第二个重定位项,32位都须修正
000ch3015h&第三个重定位项,32位都须修正
000eh0000h第四个重定位项,用于对齐
0h页起始地址(RVA)
ch重定位块长度
h第一个重定位项,32位都须修正
001ah302ah第二个重定位项,32位都须修正
&&其他重定位块
h重定位表结束标志 知道了重定位表要保存哪些信息,我们再来
分享这篇日志的人也喜欢
吸霾嘛朋友
你就不要想起我
睡午觉了嘛?
小白主播伤了脸,你们都要爱护我哦
变成小仙女了?开心
热门日志推荐
人人最热标签
北京千橡网景科技发展有限公司:
文网文[号··京公网安备号·甲测资字
文化部监督电子邮箱:wlwh@··
文明办网文明上网举报电话: 举报邮箱:&&&&&&&&&&&&
请输入手机号,完成注册
请输入验证码
密码必须由6-20个字符组成
下载人人客户端
品评校花校草,体验校园广场远程线程注入(二)线程注入 - 推酷
远程线程注入(二)线程注入
这里我们要用到上篇中的那个 msg.dll
下面的代码还是使用的统一的宽字符版本,已经在VS2010下编译通过。
首先上代码,然后慢慢解释:
#include &windows.h&
#include &TlHelp32.h&
BOOL LoadRemoteDll(DWORD dwProcessId, LPTSTR lpszLibName)
HANDLE hProcess
HANDLE hThread
pszLibFileRemote = NULL;
PTHREAD_START_ROUTINE pfnThreadR
//获得想要注入代码的进程的句柄
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
if (NULL == hProcess)
//计算DLL路径名需要的字节数
cch = 2 * (1 + lstrlen(lpszLibName));
//在远程线程中为路径名分配空间
pszLibFileRemote = (PSTR)VirtualAllocEx(hProcess, NULL, cch, MEM_COMMIT, PAGE_READWRITE);
if (pszLibFileRemote == NULL)
//将DLL的路径名复制到远程进程的地址空间
if (!WriteProcessMemory(hProcess, (PVOID)pszLibFileRemote, (PVOID)lpszLibName, cch, NULL))
//获得LoadLibraryA在Kernel.dll中得真正地址
pfnThreadRrn = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT(&Kernel32&)), &LoadLibraryW&);
if (pfnThreadRrn == NULL)
hThread = CreateRemoteThread(hProcess, NULL, 0, pfnThreadRrn, (PVOID)pszLibFileRemote, 0, NULL);
if (hThread == NULL)
//等待远程线程终止
WaitForSingleObject(hThread, INFINITE);
bResult = TRUE;
//关闭句柄
if (pszLibFileRemote != NULL)
VirtualFreeEx(hProcess, (PVOID)pszLibFileRemote, 0, MEM_RELEASE);
if (hThread != NULL)
CloseHandle(hThread);
if (hProcess != NULL)
CloseHandle(hProcess);
BOOL GetProcessIdByName(LPWSTR szProcessName, LPDWORD lpPID)
//变量及其初始化
STARTUPINFO
PROCESS_INFORMATION
PROCESSENTRY32
ZeroMemory(&st, sizeof(STARTUPINFO));
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
st.cb = sizeof(STARTUPINFO);
ZeroMemory(&ps, sizeof(PROCESSENTRY32));
ps.dwSize = sizeof(PROCESSENTRY32);
//遍历进程
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshot == INVALID_HANDLE_VALUE)
return FALSE;
if (!Process32First(hSnapshot, &ps))
return FALSE;
//比较进程名
if (lstrcmpi(ps.szExeFile, TEXT(&calc.exe&)) == 0)
*lpPID = ps.th32ProcessID;
CloseHandle(hSnapshot);
return TRUE;
while (Process32Next(hSnapshot, &ps));
//没有找到
CloseHandle(hSnapshot);
return FALSE;
//修改进程权限
BOOL EnablePrivilege(LPWSTR name)
TOKEN_PRIVILEGES priv = {1, {0, 0, SE_PRIVILEGE_ENABLED}};
LookupPrivilegeValue(0, name, &priv.Privileges[0].Luid);
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);
AdjustTokenPrivileges(hToken, FALSE, &priv, sizeof priv, 0, 0);
rv = GetLastError() == ERROR_SUCCESS;
CloseHandle(hToken);
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
DWORD dwPID;
//提权,获取SE_DEBUG_NAME 权限
//可以在其他进程的内存空间中写入,创建线程
if (0 != EnablePrivilege(SE_DEBUG_NAME))
if (!GetProcessIdByName(TEXT(&calc.exe&), &dwPID))
//通过上传远程线程加载dll
//将msg.dll放置在系统目录下
if (!LoadRemoteDll(dwPID, TEXT(&msg.dll&)))
把上次的dll放到相对目录下面或者是扔到system32下面。
我们首先从main函数开始吧:
主要是由三个部分组成的:
1.提取权限
//提权,获取SE_DEBUG_NAME 权限
//可以在其他进程的内存空间中写入,创建线程
if (0 != EnablePrivilege(SE_DEBUG_NAME))
<span style="color:#.遍历搜索进程UID
if (!GetProcessIdByName(TEXT(&calc.exe&), &dwPID))
<span style="color:#.创建远程线程
//通过上传远程线程加载dll
//将msg.dll放置在系统目录下
if (!LoadRemoteDll(dwPID, TEXT(&msg.dll&)))
前两个步骤我们就不具体讲了,不是我们的重点。关键是其实对于进程令牌Token自己也不是很理解,不好意思给大家讲。。。
关键我们还是来看看第三个步骤好了。
创建远程线程句柄有下面几个步骤:
1.获得想要注入代码的进程的句柄
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
2.计算DLL路径名需要的字节数
cch = 2 * (1 + lstrlen(lpszLibName));
这里自己对宽字符的处理没有做好
可以使用wcslen函数
3.在远程线程中为路径名分配空间
pszLibFileRemote = (PSTR)VirtualAllocEx(hProcess, NULL, cch, MEM_COMMIT, PAGE_READWRITE);
4.将DLL的路径名复制到远程进程的地址空间
WriteProcessMemory(hProcess, (PVOID)pszLibFileRemote, (PVOID)lpszLibName, cch, NULL);
5.获得LoadLibraryA在Kernel.dll中得真正地址
pfnThreadRrn = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT(&Kernel32&)), &LoadLibraryW&);
6.最后是最最关键的函数
hThread = CreateRemoteThread(hProcess, NULL, 0, pfnThreadRrn, (PVOID)pszLibFileRemote, 0, NULL);
7.当然还有扫尾的工作
//关闭句柄
if (pszLibFileRemote != NULL)
VirtualFreeEx(hProcess, (PVOID)pszLibFileRemote, 0, MEM_RELEASE);
if (hThread != NULL)
CloseHandle(hThread);
if (hProcess != NULL)
CloseHandle(hProcess);
运行一下,发现成功了!~~~
最后栋哥跟我提醒了几点:
1.关于进程令牌的代码,有时候不写也是可以通过的。这里还有待研究一下。
2.被注入的程序有时候要放在相对目录下才会产生效果。关于这点自己还没有实践过。有待验证。
3.像explorer.exe有时候会无法注入。换个简单的calc.exe完全可以。火狐,qq全部都可以。可能是explorer.exe有点特别。
4.第一次远程注入可以成功,第二次就不行了,就不能弹出对话框了,貌似进程打开之后马上就关闭了。个人以为原因可能处在dll的fdwReason。有时间尝试着调试一下。
关于远程线程注入就先讲到这里。当然这些都是最简单的最基本的东西。
自己有时间去看看核心编程,顺便进一步了解下操作系统。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致

我要回帖

更多关于 远程线程注入怎么办 的文章

 

随机推荐