社区
进程/线程/DLL
帖子详情
如何用Visual C++实现远程线程嵌入?
xdimfan
2004-05-03 08:34:56
目前正在学习dll方面的知识,对于远程线程的嵌入不太明白如何实现,请高手指教:)
...全文
64
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++
实现
远程
线程
嵌入
技术
远程
线程
技术指的是通过在另一个进程中创建
远程
线程
的方法进入那个进程的内存地址空间。我们知道,在进程中,可以通过CreateThread函数创建
线程
,被创建的新
线程
与主
线程
(就是进程启动时被同时自动建立的那个
线程
)共享地址空间以及其他的资源。 但是很少有人知道,通过CreateRemoteThread也同样可以在另一个进程内创建新
线程
,被创建的
远程
线程
同样可以共享
远程
进程(是
远程
进程耶!)的地址空间,所以,实际上,我们通过一个
远程
线程
,进入了
远程
进程的内存地址空间,也就拥有了那个
远程
进程相当的权限。例如在
远程
进程内部启动一个DLL木马(与进入进程内部相比,启动一个DLL木马是小意思,实际上我们可
用
Visual
C++
实现
远程
线程
嵌入
技术
远程
线程
技术指的是通过在另一个进程中创建
远程
线程
的方法进入那个进程的内存地址空间。我们知道,在进程中,可以通过CreateThread函数创建
线程
,被创建的新
线程
与主
线程
(就是进程启动时被同时自动建立的那个
线程
)共享地址空间以及其他的资源。 但是很少有人知道,通过CreateRemoteThread也同样可以在另一个进程内创建新
线程
,被创建的
远程
线程
同样可以共享
远程
进程(是
远程
进程耶!)的地址空间,所以,实际上,我们通过一个
远程
线程
,进入了
远程
进程的内存地址空间,也就拥有了那个
远程
进程相当的权限。例如在
远程
进程内部启动一个DLL木马(与进入进程内部相比,启动一个DLL木马是小意思,实际上我们可
Visual
C++
程序设计学习笔记1~12章源代码
本源代码既有多
线程
的使用,VC的各种控件的使用,以及动态连接库,ActiveX控件,网络编程,数据库编程,以及最后的一个整体大程序,KTV点歌系统等等
Visual
C++
高级编程
针对于
visual
C++
高级编程,包括控件使用、ACTIVEX技术等,每个都是实例
进程/线程/DLL
15,467
社区成员
49,171
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章