社区
进程/线程/DLL
帖子详情
如何用Visual C++实现远程线程嵌入?
xdimfan
2004-05-03 08:34:56
目前正在学习dll方面的知识,对于远程线程的嵌入不太明白如何实现,请高手指教:)
...全文
60
4
打赏
收藏
如何用Visual C++实现远程线程嵌入?
目前正在学习dll方面的知识,对于远程线程的嵌入不太明白如何实现,请高手指教:)
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
ygzdev
2004-05-03
打赏
举报
回复
嘿嘿,这个看《WINDOWS 核心编程》里面就有啦!不过我想问楼上的PS工具是什么啊,我不知道,介绍一下如何!
itmaster
2004-05-03
打赏
举报
回复
远程线程技术指的是通过在另一个进程中创建远程线程的方法进入那个进程的内存地址空间。我们知道,在进程中,可以通过CreateThread函数创建线程,被创建的新线程与主线程(就是进程启动时被同时自动建立的那个线程)共享地址空间以及其他的资源。 但是很少有人知道,通过CreateRemoteThread也同样可以在另一个进程内创建新线程,被创建的远程线程同样可以共享远程进程(是远程进程耶!)的地址空间,所以,实际上,我们通过一个远程线程,进入了远程进程的内存地址空间,也就拥有了那个远程进程相当的权限。例如在远程进程内部启动一个DLL木马(与进入进程内部相比,启动一个DLL木马是小意思,实际上我们可以随意篡改那个远程进程的数据)。
首先,我们通过OpenProcess 来打开我们试图嵌入的进程(如果远程进程不允许打开,那么嵌入就无法进行了,这往往是由于权限不足引起的,解决方法是通过种种途径提升本地进程的权限)
hRemoteProcess = OpenProcess( PROCESS_CREATE_THREAD | file://允许远程创建线程
PROCESS_VM_OPERATION | file://允许远程VM操作
PROCESS_VM_WRITE,//允许远程VM写
FALSE, dwRemoteProcessId )
由于我们后面需要写入远程进程的内存地址空间并建立远程线程,所以需要申请足够的权限(PROCESS_CREATE_THREAD、VM_OPERATION、VM_WRITE)。
然后,我们可以建立LoadLibraryW函数这个线程来启动我们的DLL木马,LoadLibraryW函数是在kernel32.dll中定义的,用来加载DLL文件,它只有一个参数,就是DLL文件的绝对路径名pszLibFileName,(也就是木马DLL的全路径文件名),但是由于木马DLL是在远程进程内调用的,所以我们首先还需要将这个文件名复制到远程地址空间:(否则远程线程是无法读到这个参数的)
file://计算DLL路径名需要的内存空间
int cb = (1 + lstrlenW(pszLibFileName)) * sizeof(WCHAR);
file://使用VirtualAllocEx函数在远程进程的内存地址空间分配DLL文件名缓冲区
pszLibFileRemote = (PWSTR) VirtualAllocEx( hRemoteProcess, NULL, cb,
MEM_COMMIT, PAGE_READWRITE);
file://使用WriteProcessMemory函数将DLL的路径名复制到远程进程的内存空间
iReturnCode = WriteProcessMemory(hRemoteProcess,
pszLibFileRemote, (PVOID) pszLibFileName, cb, NULL);
file://计算LoadLibraryW的入口地址
PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");
万事俱备,我们通过建立远程线程时的地址pfnStartAddr(实际上就是LoadLibraryW的入口地址)和传递的参数pszLibFileRemote(实际上是我们复制过去的木马DLL的全路径文件名)在远程进程内启动我们的木马DLL:
file://启动远程线程LoadLibraryW,通过远程线程调用用户的DLL文件
hRemoteThread = CreateRemoteThread( hRemoteProcess, NULL, 0,
pfnStartAddr, pszLibFileRemote, 0, NULL);
至此,远程嵌入顺利完成,为了试验我们的DLL是不是已经正常的在远程线程运行,我编写了以下的测试DLL:
BOOL APIENTRY DllMain(HANDLE hModule, DWORD reason, LPVOID lpReserved)
{
char szProcessId[64] ;
switch ( reason )
{
case DLL_PROCESS_ATTACH:
{
file://获取当前进程ID
_itoa ( GetCurrentProcessId(), szProcessId, 10 );
MessageBox ( NULL, szProcessId, "RemoteDLL", MB_OK );
}
default:
return TRUE;
}
}
当我使用RmtDll.exe程序将这个TestDLL.dll嵌入Explorer.exe进程后(PID=1208),该测试DLL弹出了1208字样的确认框,同时使用PS工具也能看到
Process ID: 1208
C:\WINNT\Explorer.exe (0x00400000)
……
C:\TestDLL.dll (0x100000000)
……
这证明TestDLL.dll已经在Explorer.exe进程内正确地运行了。
无论是使用特洛伊DLL还是使用远程线程,都是让木马的核心代码运行于别的进程的内存空间,这样不仅能很好地隐藏自己,也能更好的保护自己
kugou123
2004-05-03
打赏
举报
回复
PS是一个查看活动进程ID的工具
MyNameEPC
2004-05-03
打赏
举报
回复
使用CreateReomteThead()函数。
EDA/PLD中的用
Visual
C++
实现
远程
线程
嵌入
技术
《EDA/PLD中的
Visual
C++
实现
远程
线程
嵌入
技术》
远程
线程
技术是一种高级的系统编程技术,它允许程序在不直接控制的情况下,干预另一个进程的内存空间。通常,
线程
是在同一个进程中创建的,它们共享相同的内存空间...
用
Visual
C++
实现
远程
线程
嵌入
技术
远程
线程
技术指的是通过在另一个进程中创建
远程
线程
的方法进入那个进程的内存地址空间。我们知道,在进程中,可以通过CreateThread函数创建
线程
,被创建的新
线程
与主
线程
(就是进程启动时被同时自动建立的那个
线程
)...
Visual
C++
程序设计学习笔记1~12章源代码
在
Visual
C++
中,可以开发ActiveX控件,这些控件可以在网页、Windows应用程序中
嵌入
,
实现
跨平台交互。 6. **网络编程**:
Visual
C++
提供了Winsock API进行网络编程,可以创建客户端和服务器应用程序,
实现
TCP/IP...
Visual
C++
高级编程
《
Visual
C++
高级编程》是针对使用Microsoft的
Visual
C++
6.0版本进行深入开发的一门技术领域,涵盖了各种高级主题,旨在帮助开发者提升在Windows环境下的编程技能。在这个领域,我们主要会探讨以下几个核心知识点:...
Teach Yourself
Visual
C++
6 in 21 Days
###
Visual
C++
6.0 自学指南 #### 第一天:熟悉
Visual
C++
开发环境 - **开发环境介绍**:
Visual
C++
6.0 是一个强大的集成开发环境...- **Web 内容展示**:
实现
将网页内容
嵌入
到
Visual
C++
应用程序中的功能。
进程/线程/DLL
15,473
社区成员
49,171
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章