首页
社区
课程
招聘
[原创]重读老文章系列:另类远程线程模式
发表于: 2012-7-19 23:24 27041

[原创]重读老文章系列:另类远程线程模式

2012-7-19 23:24
27041
收藏
免费 6
支持
分享
最新回复 (49)
雪    币: 231
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
thread = CreateRemoteThread(proc, NULL, 0, entry, NULL, 0, NULL);
调试过程中发现是被杀在这个函数,我关掉杀软后,发现这个函数执行失败,thread返回为NULL

2012-7-20 23:14
0
雪    币: 231
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
27
贴出的我的代码,大牛们帮忙看看什么地方的错误呢?

// NewInject.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include <Tlhelp32.h>

LPVOID CopyModule(HANDLE proc, LPVOID image)
{
        PIMAGE_NT_HEADERS headers = (PIMAGE_NT_HEADERS)((LPBYTE)image + ((PIMAGE_DOS_HEADER)image)->e_lfanew);
        PIMAGE_DATA_DIRECTORY datadir;
        DWORD size = headers->OptionalHeader.SizeOfImage;
        LPVOID mem = NULL;
        LPBYTE buf = NULL;
        BOOL ok = FALSE;

        if (headers->Signature != IMAGE_NT_SIGNATURE)
                return NULL;

        if (IsBadReadPtr(image, size))
                return NULL;

        mem = VirtualAllocEx(proc, NULL, size, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);

        if (mem != NULL)
        {
                buf = (LPBYTE)VirtualAlloc(NULL, size, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);

                if (buf != NULL)
                {
                        RtlCopyMemory(buf, image, size);

                        datadir = &headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC];

                        if (datadir->Size > 0 && datadir->VirtualAddress > 0)
                        {
                                DWORD_PTR delta = (DWORD_PTR)((LPBYTE)mem - headers->OptionalHeader.ImageBase);
                                DWORD_PTR olddelta = (DWORD_PTR)((LPBYTE)image - headers->OptionalHeader.ImageBase);
                                PIMAGE_BASE_RELOCATION reloc = (PIMAGE_BASE_RELOCATION)(buf + datadir->VirtualAddress);

                                while(reloc->VirtualAddress != 0)
                                {
                                        if (reloc->SizeOfBlock >= sizeof(IMAGE_BASE_RELOCATION))
                                        {
                                                DWORD count = (reloc->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof(WORD);
                                                LPWORD list = (LPWORD)((LPBYTE)reloc + sizeof(IMAGE_BASE_RELOCATION));
                                                DWORD i;

                                                for (i = 0; i < count; i++)
                                                {
                                                        if (list[i] > 0)
                                                        {
                                                                DWORD_PTR *p = (DWORD_PTR *)(buf + (reloc->VirtualAddress + (0x0FFF & (list[i]))));

                                                                *p -= olddelta;
                                                                *p += delta;
                                                        }
                                                }
                                        }

                                        reloc = (PIMAGE_BASE_RELOCATION)((LPBYTE)reloc + reloc->SizeOfBlock);
                                }

                                ok = WriteProcessMemory(proc, mem, buf, size, NULL);
                        }

                        VirtualFree(buf, 0, MEM_RELEASE); // release buf
                }

                if (!ok)
                {
                        VirtualFreeEx(proc, mem, 0, MEM_RELEASE);
                        mem = NULL;
                }
        }

        return mem;
}

typedef HANDLE (WINAPI * CreateRemoteThreadT)
(
__in      HANDLE hProcess,
__in_opt  LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in      SIZE_T dwStackSize,
__in      LPTHREAD_START_ROUTINE lpStartAddress,
__in_opt  LPVOID lpParameter,
__in      DWORD dwCreationFlags,
__out_opt LPDWORD lpThreadId
);

BOOL NewInject(DWORD pid, LPTHREAD_START_ROUTINE start)
{
        HANDLE proc, thread;
        HMODULE module, newmodule;
        BOOL ok = FALSE;

        proc = OpenProcess(PROCESS_QUERY_INFORMATION |
        PROCESS_VM_OPERATION |
    PROCESS_VM_WRITE |
    PROCESS_VM_READ |
    PROCESS_CREATE_THREAD |
    PROCESS_DUP_HANDLE,
    FALSE, pid);

        if (proc != NULL)
        {
                module = GetModuleHandle(NULL);

                newmodule = (HMODULE)CopyModule(proc, module);

                if (newmodule != NULL)
                {
                        LPTHREAD_START_ROUTINE entry = (LPTHREAD_START_ROUTINE)((LPBYTE)newmodule + (DWORD_PTR)((LPBYTE)start - (LPBYTE)module));

                        //thread = CreateRemoteThread(proc, NULL, 0, entry, NULL, 0, NULL);
                        CreateRemoteThreadT pCreateRemoteThread= (CreateRemoteThreadT)GetProcAddress(LoadLibrary("kernel32.dll"),"CreateRemoteThread");
                        thread = pCreateRemoteThread(proc, NULL, 0, entry, NULL, 0, NULL);

                        if (thread != NULL)
                        {
                                CloseHandle(thread);
                                ok = TRUE;
                        }
                        else
                        {
                                VirtualFreeEx(proc, module, 0, MEM_RELEASE);
                        }
                }

                CloseHandle(proc);
        }

        return ok;
}

//一般来说提升到 DEBUG 权限就 OK 了,下面是我以前摆弄的提权到 DEBUG 的代码
bool AdjustProcessTokenPrivilege()
{
        LUID luidTmp;
        HANDLE hToken;
        TOKEN_PRIVILEGES tkp;
       
        if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
        {
                OutputDebugString("AdjustProcessTokenPrivilege OpenProcessToken Failed ! \n");
               
                return false;
        }
       
        if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luidTmp))
        {
                OutputDebugString("AdjustProcessTokenPrivilege LookupPrivilegeValue Failed ! \n");
               
                CloseHandle(hToken);
               
                return FALSE;
        }
       
        tkp.PrivilegeCount = 1;
        tkp.Privileges[0].Luid = luidTmp;
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
       
        if(!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL))
        {
                OutputDebugString("AdjustProcessTokenPrivilege AdjustTokenPrivileges Failed ! \n");
               
                CloseHandle(hToken);
               
                return FALSE;
        }

        return true;
}

DWORD GetProcessIdByName(LPCTSTR name)
{
        PROCESSENTRY32 prostruct;
        DWORD id = 0;
        HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
        prostruct.dwSize = sizeof(PROCESSENTRY32);
        if(!Process32First(hSnapshot,&prostruct))
                return 0;
        do
        {
                prostruct.dwSize = sizeof(PROCESSENTRY32);
                if(!Process32Next(hSnapshot,&prostruct))
                        break;
                if(strcmp(prostruct.szExeFile,name) == 0)
                {
                        id = prostruct.th32ProcessID;
                        break;
                }
        }
        while(TRUE);
        CloseHandle(hSnapshot);
        return id;
}

DWORD WINAPI _TestThread( LPVOID LParam)
{
       
        ::MessageBox(NULL, "测试新方法远程注入", "测试", MB_OK);
       
        return 0;
       
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
        // TODO: Place code here.

        BOOL bIsOK = FALSE;

        bIsOK = AdjustProcessTokenPrivilege();
        if (!bIsOK)
        {
                return -100;
        }

        //提权DEBUG后
        NewInject(GetProcessIdByName("svchost.exe"), _TestThread);

        return 0;
}
2012-7-20 23:17
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
28
我表示你的系统一定是win7吧,win7下远程线程没那么简单~
哈哈哈
2012-7-21 00:47
0
雪    币: 142
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
29
win7下测试成功,当然,只欺负了记事本,计算器,cmd之类的
svchost是服务,估计要管理员权限运行
2012-7-21 01:07
0
雪    币: 138
活跃值: (460)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
30
话说会PE 能干好多weisuo的事
话说老V 没钱花的时候真好

代码和 前几天 http://bbs.pediy.com/showthread.php?t=153508  意思一样, 人家是替换 ,老V是 在原来的基础新空间新线程执行;

老V 你在做什么大事啊 , 这么缺钱~  用你的代码买给做黑..产的 应该就不差钱了吧?
2012-7-21 10:30
0
雪    币: 231
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
31
我的系统是xpSP3的,不知道为什么那个远程线程没有创建成功。
2012-7-21 12:18
0
雪    币: 231
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
32
今天再次测试,成功了,但是正如一前面一个兄弟说的那样,只能欺负记事本,计算器,我昨天测试的是svchost.exe,这个的确不行
2012-7-21 16:17
0
雪    币: 78
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
33
这种方法游戏外挂都用烂了
2012-7-21 16:23
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
34
跟引用的DLL有关,MFC的程序需要静态连接才行,最好引用的函数要简单~
USER32.dLL在svchost.exe里不存在。
2012-7-22 09:56
0
雪    币: 485
活跃值: (78)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
35
来迟了,学习
2012-7-22 15:33
0
雪    币: 93
活跃值: (52)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
36
最近看到类似的这种不少,不过老V这个更邪恶,但用了这两个WriteProcessMemory, CreateRemoteThread一般都会被杀软报的啊,能避开这个吗~~
2012-7-22 23:53
0
雪    币: 564
活跃值: (375)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
37
可以把代码一句一句的load进来,然后处理一些跳转和CALL应该就可以了
2012-7-25 11:28
0
雪    币: 314
活跃值: (271)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
38
标记下
2012-7-26 20:12
0
雪    币: 51
活跃值: (61)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
39
老方法啊,病毒常用
2012-7-31 16:51
0
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
40
win7 要是svchost的话必须是管理员权限,否则OpenProcess是不行的
2012-8-2 17:26
0
雪    币: 297
活跃值: (120)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
41
看了老V的猛贴,我又受了点刺激。
2012-10-21 00:09
0
雪    币: 81
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
42
感谢分享好东西,收藏一下
2012-11-25 15:04
0
雪    币: 58
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
43
此方法很常见,不过新手还是用处很大。
2012-11-26 16:41
0
雪    币: 184
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
44
MARK下!
2013-2-15 11:56
0
雪    币: 49
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
45
看不懂,只好支持下,然后去看基础了
2013-2-17 21:20
0
雪    币: 773
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
46
请问luoyinkey兄,我用你的代码测试,注入的是记事本,还是没成功,这是为什么呀?PS:测试系统:xp sp3
2013-3-7 21:19
0
雪    币: 43
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
47
~~~ 嗯,超好玩的东西,我以前都不知道呢,如果被映射的DLL里面的API在目标进程里面没有被加载,那可能就会出错了吧?
2013-4-24 09:39
0
雪    币: 88
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
48
老V,这个是不是利用PE的重定位功能将shellcode注入到PE文件重定位的时候然后重新加载这个PE文件?
2013-4-24 15:36
0
雪    币: 46
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
49
你是怎么学到这一步的
2013-4-24 15:59
0
雪    币: 183
活跃值: (1058)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
50
这种实现必要要目标进程加载了本进程的所有DLL 才可以吧,而且加载的DLL基址 都要一样。
2013-4-24 16:10
0
游客
登录 | 注册 方可回帖
返回
//