看流星社区

 找回密码
 注册账号
查看: 2395|回复: 1

32位进程注入64位进程

[复制链接]

该用户从未签到

发表于 2016-6-29 17:04:52 | 显示全部楼层 |阅读模式

  1. #include <windows.h>
  2. #include <psapi.h>

  3. #define MakeREX(W,R,X,B) __asm __emit 0100##W##R##X##B##b
  4. #define rep __asm __emit 0xf3
  5. #pragma pack(1)
  6. typedef struct _STUBARGS
  7. {
  8.         unsigned __int64 addr;
  9.         unsigned int argc;
  10.         __int64 argv[1];
  11. }STUBARGS,*PSTUBARGS;
  12. #pragma pack()
  13. __declspec(naked) void __stdcall stubto64(void)
  14. {
  15.         __asm
  16.         {
  17.                 push esi
  18.                 push edi
  19.                 push ebp
  20.                 lea ebp,[esp+44]


  21.                 mov eax,[ebp+STUBARGS.argc]
  22.                 neg eax
  23.                 lea esp,[esp+eax*8]
  24.                 neg eax
  25.                 and esp,not 15


  26.                 lea esi,[ebp+STUBARGS.argv]
  27.                 mov edi,esp
  28.                 mov ecx,eax
  29.                 cld


  30.                 rep
  31.                 MakeREX(1,0,0,0)
  32.                 movsd


  33.                 dec eax
  34.                 jl callproc
  35.                 MakeREX(1,0,0,0)
  36.                 mov ecx,dword ptr[ebp+STUBARGS.argv+8*0]
  37.                 dec eax
  38.                 jl callproc
  39.                 MakeREX(1,0,0,0)
  40.                 mov edx,dword ptr[ebp+STUBARGS.argv+8*1]
  41.                 dec eax
  42.                 jl callproc
  43.                 MakeREX(1,1,0,0)
  44.                 mov eax,dword ptr[ebp+STUBARGS.argv+8*2]
  45.                 dec eax
  46.                 jl callproc
  47.                 MakeREX(1,1,0,0)
  48.                 mov ecx,dword ptr[ebp+STUBARGS.argv+8*3]


  49.                
  50. callproc:
  51.                 MakeREX(1,0,0,0)
  52.                 call dword ptr[ebp+STUBARGS.addr]
  53.                
  54.                 MakeREX(1,0,0,0)
  55.                 mov edx,eax
  56.                 MakeREX(1,0,0,0)
  57.                 shr edx,32


  58.                 lea esp,[ebp-44]
  59.                 pop ebp
  60.                 pop edi
  61.                 pop esi
  62.                 retf
  63.         }
  64. }


  65. __declspec(naked) __int64 __cdecl lcall(void*off,unsigned short seg,...)//__int64 func,unsigned argc,...)
  66. {
  67.         __asm call Far ptr[esp+4]
  68.         __asm ret
  69. }


  70. #define Call64Proc(addr,argc,...) lcall(stubto64,0x33,(unsigned __int64)addr,argc,__VA_ARGS__)
  71. #define To64(x) ((__int64)(x))
  72. HMODULE GetNativeNtdll(void)
  73. {
  74.         MEMORY_BASIC_INFORMATION mbi;static HMODULE ntdll=0;char*lastone=0;
  75.         if(ntdll)return ntdll;
  76.         for(char*p=0;size_t(p)<0x80000000;p+=mbi.RegionSize)
  77.         {
  78.                 if(!VirtualQueryEx((HANDLE)-1,p,&mbi,sizeof mbi))break;
  79.                 if(mbi.AllocationBase==lastone||mbi.State!=MEM_COMMIT||mbi.Type!=MEM_IMAGE)continue;
  80.                 wchar_t name[256];
  81.                 const wchar_t ntdllname[]=L"\\windows\\system32\\ntdll.dll";
  82.                 const unsigned int ntdllnamelen=sizeof ntdllname/sizeof(wchar_t)-1;
  83.                 DWORD namelen;
  84.                 if((namelen=GetMappedFileNameW((HANDLE)-1,mbi.AllocationBase,name,256))>ntdllnamelen)
  85.                 {
  86.                        
  87.                         if(wcsicmp(ntdllname,name+namelen-ntdllnamelen)==0)
  88.                         {
  89.                                 PIMAGE_DOS_HEADER dosheader=PIMAGE_DOS_HEADER(mbi.AllocationBase);
  90.                                 PIMAGE_NT_HEADERS64 ntheaders=PIMAGE_NT_HEADERS64(size_t(dosheader)+dosheader->e_lfanew);
  91.                                 if(ntheaders->FileHeader.Machine==IMAGE_FILE_MACHINE_AMD64)return (HMODULE)mbi.AllocationBase;
  92.                         }
  93.                 }
  94.                 lastone=(char*)mbi.AllocationBase;
  95.         }
  96.         return ntdll;
  97. }


  98. void* GetProcAddress64(const void*BaseAddress,const char*Name)
  99. {
  100.         UINT_PTR base=reinterpret_cast<UINT_PTR>(BaseAddress);
  101.         PIMAGE_DOS_HEADER DosHeader=PIMAGE_DOS_HEADER(BaseAddress);
  102.         PIMAGE_NT_HEADERS64 NtHeaders=PIMAGE_NT_HEADERS64(size_t(DosHeader)+DosHeader->e_lfanew);;
  103.         DWORD ExpRVA=NtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
  104.         DWORD ExpSize=NtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
  105.         if(ExpRVA&&ExpSize)
  106.         {
  107.                 PIMAGE_EXPORT_DIRECTORY ExpDir=reinterpret_cast<PIMAGE_EXPORT_DIRECTORY>(base+ExpRVA);
  108.                 PDWORD NameList=reinterpret_cast<PDWORD>(base+ExpDir->AddressOfNames);
  109.                 PWORD OrdinalList=reinterpret_cast<PWORD>(base+ExpDir->AddressOfNameOrdinals);
  110.                 PDWORD FunctionList=reinterpret_cast<PDWORD>(base+ExpDir->AddressOfFunctions);
  111.                 for(DWORD i=0;i<ExpDir->NumberOfNames;++i)
  112.                 {
  113.                         const char*ExpName=reinterpret_cast<const char*>(base+NameList[i]);
  114.                         if(strcmp(Name,ExpName)==0)
  115.                         {
  116.                                 WORD Ordinal=OrdinalList[i];
  117.                                 return (char*)base+FunctionList[Ordinal];
  118.                         }
  119.                 }
  120.         }
  121.         return 0;
  122. }






  123. HANDLE CreateThread64(HANDLE ProcessHandle,void*ThreadProc,void*Parameter,int Suspended)
  124. {
  125.         __int64 hThread=0,cid[2];
  126.         static void*RtlCreateUserThread64=0;
  127.         if(!RtlCreateUserThread64)
  128.                 RtlCreateUserThread64=GetProcAddress64(GetNativeNtdll(),"RtlCreateUserThread");
  129.         Call64Proc(RtlCreateUserThread64,10,To64(ProcessHandle),To64(0),To64(Suspended),To64(0),To64(0),To64(0),To64(ThreadProc),To64(Parameter),To64(&hThread),To64(cid));
  130.         return (HANDLE)hThread;
  131. }


  132. typedef struct _UNICODE_STRING64
  133. {
  134.     USHORT Length;
  135.     USHORT MaximumLength;
  136.         ULONGLONG  Buffer;
  137. } UNICODE_STRING64, *PUNICODE_STRING64;
  138. HMODULE InjectLibrary64(HANDLE ProcessHandle,wchar_t*Name,unsigned short NameLength)
  139. {
  140.         void*stub,*buf;unsigned stublen;
  141.         __asm
  142.         {


  143.                 mov stub,offset stubstart
  144.                 mov stublen,offset stubend
  145.                 sub stublen,offset stubstart
  146.                 jmp stubend
  147. stubstart:
  148.                 MakeREX(1,1,0,0)
  149.                 lea eax,[ecx+8]
  150.                 MakeREX(1,1,0,0)
  151.                 lea ecx,[esp-8]
  152.                 MakeREX(1,0,0,0)
  153.                 sub esp,48
  154.                 xor ecx,ecx
  155.                 xor edx,edx
  156.                
  157.                 MakeREX(1,0,0,1)
  158.                 call [eax-8]
  159.                 MakeREX(1,0,0,0)
  160.                 add esp,48
  161.                 MakeREX(1,0,0,0)
  162.                 mov eax,[esp-8]
  163.                 MakeREX(1,0,0,0)
  164.                 mov edx,eax
  165.                 MakeREX(1,0,0,0)
  166.                 shr edx,32
  167.                 ret
  168. stubend:
  169.         }
  170.         static struct
  171.         {
  172.                 __int64 LdrLoadDll;
  173.                 UNICODE_STRING64 us;
  174.         }pre={0};
  175.         buf=VirtualAllocEx(ProcessHandle,0,NameLength+sizeof pre+stublen,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
  176.         if(buf)
  177.         {
  178.                 if(!pre.LdrLoadDll)pre.LdrLoadDll=(__int64)GetProcAddress64(GetNativeNtdll(),"LdrLoadDll");
  179.                 pre.us.Length=pre.us.MaximumLength=NameLength;
  180.                 pre.us.Buffer=(ULONGLONG)buf+sizeof pre;
  181.                 WriteProcessMemory(ProcessHandle,buf,&pre,sizeof pre,0);
  182.                 WriteProcessMemory(ProcessHandle,(void*)pre.us.Buffer,Name,NameLength,0);
  183.                 void*code=(char*)buf+sizeof pre+NameLength;
  184.                 WriteProcessMemory(ProcessHandle,code,stub,stublen,0);
  185.                 HANDLE hThread=CreateThread64(ProcessHandle,code,buf,0);
  186.                 if(hThread)
  187.                 {
  188.                         if(WaitForSingleObject(hThread,-1))
  189.                         {
  190.                                 DWORD ec;
  191.                                 GetExitCodeThread(hThread,&ec);
  192.                                 CloseHandle(hThread);
  193.                                 return (HMODULE)ec;
  194.                         }
  195.                         CloseHandle(hThread);
  196.                 }
  197.                 VirtualFreeEx(ProcessHandle,buf,0,MEM_RELEASE);
  198.         }
  199.         return 0;
  200. }


  201. int _tmain()
  202. {
  203.         DWORD pid;
  204.         GetWindowThreadProcessId(FindWindowW(L"notepad",0),&pid);
  205.         HANDLE ProcessHandle=OpenProcess(2035711,0,pid);
  206.         InjectLibrary64(ProcessHandle,L"c:\\windows\\system32\\d3d9.dll",sizeof L"c:\\windows\\system32\\d3d9.dll"-2);
  207.         return 0;
  208. }

复制代码

该用户从未签到

发表于 2016-6-30 09:04:53 | 显示全部楼层

我就是来看看~么么哒~~
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-28 18:33

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表