远程线程注入DLL

1.提升本进程的系统权限
2.进入宿主的内存空间
 a.OpenProcess(),修改宿主进程的一些属性,如允许远程创建线程等

  HANDLE OpenProcess(
    DWORD dwDesiredAccess,  
// 访问标志
    BOOL bInheritHandle,    // 继承句柄标志
    DWORD dwProcessId       // 进程ID
  );
 b.VirtualAllocEx(),在宿主进程中开辟一块内存空间,用来存放DLL的文件名
  LPVOID VirtualAllocEx(
    HANDLE hProcess,          
// 宿主进程句柄
    LPVOID lpAddress,         // 分配空间的起始地址,一般用NULL,这样会在系统认为最合适的位置分配
    SIZE_T dwSize,            // 分配空间的大小
    DWORD flAllocationType,   // 分配空间的类型,一般用MEM_COMMIT为指定空间提交物理内存
    DWORD flProtect           // 访问保护类型,PAGE_READWRITE表示可读可写
  );

 c.WriteProcessMemory(),往宿主内存中写入DLL名称
  BOOL WriteProcessMemory(
    HANDLE hProcess,                
// 宿主进程的句柄
    LPVOID lpBaseAddress,           // 要写的内存地址
    LPCVOID lpBuffer,               // 要写入数据的缓冲区指针
    SIZE_T nSize,                   // 要写入的bytes数
    SIZE_T * lpNumberOfBytesWritten // 实际写入的bytes数
  );

3.在宿主中启动新的线程
 a.GetProcAddress(),得到Kernel32.dll中的函数LoadLibraryW(A)的入口地址
 b.CreateRemoteThread(),创建远程线程,让其附加执行我们的DLL代码
  HANDLE CreateRemoteThread(
    HANDLE hProcess,                          
// 被注入进程的句柄
    LPSECURITY_ATTRIBUTES lpThreadAttributes, // 安全指针一般NULL就可以了
    SIZE_T dwStackSize,                       // 线程初始化尺寸,一般用0
    LPTHREAD_START_ROUTINE lpStartAddress,    // 一个指向要执行线程函数的指针
    LPVOID lpParameter,                       // 函数的参数
    DWORD dwCreationFlags,                    // 控制创建标志,用0表示线程立刻执行
    LPDWORD lpThreadId                        // 返回标识变量我觉得没什么用,反正句柄都有了

posted @ 2009-11-18 13:20  小试锋芒  阅读(581)  评论(0编辑  收藏  举报