分析傀儡进程

样本注入的过程:是先创建进程,获取句柄,在新进程内获取内存,再WriteProcessMemory,再SetThreadContext,再ResumeThread,先WriteProcessMemory,再SetThreadContext。
那也就是说,如果要改写到新进程的数据,那肯定要在WriteProcessMemory之前所以,改的时机就确定了,就是WriteProcessMemory之前。那要改哪里。你刚已经通过SetThreadContext获取到了新的eip地址
      

SetThreadContext函数,用来为指定线程设置context
BOOL WINAPI SetThreadContext(
  _In_       HANDLE  hThread,  //线程句柄
  _In_ const CONTEXT *lpContext  //指定线程的context结构体
);
typedef struct _CONTEXT{
DWORD ContextFlags;
DWORD Dr0;
DWORD Dr1;
DWORD Dr2;
DWORD Dr3;
DWORD Dr6;
DWORD Dr7;
FLOATING_SAVE_AREA FloatSave;
DWORD SegGs;
DWORD SegFs;
DWORD SegEs;
DWORD SegDs;
DWORD Edi;
DWORD Esi;
DWORD Ebx;
DWORD Edx;
DWORD Ecx;
DWORD Eax;
DWORD Ebp;
DWORD Eip;           //设置新线程运行的入口点  偏移为0xB4
DWORD SegCs;
DWORD EFlags;
DWORD Esp;
DWORD SegSs;
} CONTEXT;
下断SetThreadContext,找到context结构体中的成员eip

接下来下断WriteProcessMemory
 
Address  0x00400000 写入的目的地址是 
目的地址就是0x004B5780-0x00400000+0x00F80028 ==0x010357A8 在数据窗口中找到数据位置。然后将入口处改成CC
 

OD调试时,需要设置为实时调试设置设置 Jiack为实时调试器下完WriteProcessMemory后,改完数据,直接F9跑起来

那下断点WriteProcessMemory






有一个是源地址,有一个是目的地址Adress 这个是0x10000000,是目的1009c314 - 10000000 + 0x7fe30010改的地方是0x7fe30010 + 9c314先把od,设置为默认调试器
选项   实时调试设置设置 Jiack为实时调试器下完WriteProcessMemory后,改完数据,直接F9跑起来




posted @ 2017-08-02 19:38  康小泡  阅读(978)  评论(0编辑  收藏  举报