找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3133|回复: 5

【C】wow64 切 w64

[复制链接]
发表于 2017-3-19 11:46:41 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
本帖最后由 Ayala 于 2017-3-22 10:41 编辑

  1. #define __STDC__ 1
  2. #include "ntddk.h"
  3. #include "ntimage.h"

  4. /***********************************************************************/
  5. /* shell code start */
  6. /* linker command must append /MERGE:S_CODE=S_DATA /SECTION:S_DATA,RWE */
  7. /***********************************************************************/
  8. void GetRing3Base_m();
  9. /*shellcode Global DATA*/

  10. #pragma data_seg("S_DATA")

  11. __int64    shell_data_sign_S=0;//sign data
  12. __int64     k_Base=0;
  13. __int64     n_Base=0;
  14. __int64    shell_data_sign_E=0; //sign data

  15. #pragma code_seg("S_CODE")

  16. /*shlleocde entry*/
  17. int shell_start(__int64* pf,char** pfn,__int64 pfmax)        // sign code start
  18. {
  19.         __int64 i;
  20.         GetRing3Base_m();
  21.         for (i=0;i<pfmax;i++)
  22.         {
  23.                 GetProcAddress_m(n_Base,pfn[i],&pf[i]);
  24.         }
  25.         
  26.         return i;
  27. }

  28. int strlen_m(char* s)
  29. {
  30.   int i=0;
  31.   for(;s[i++];);
  32.   return i;
  33. }

  34. int strcmp_m(char* s1,char* s2)
  35. {
  36.   int t,ta,tb;
  37.   t|=-1;
  38.   ta=strlen_m(s1);
  39.   tb=strlen_m(s2);
  40.   if (ta==tb)
  41.   {
  42.     t=ta;
  43.     do
  44.     {
  45.       --t;
  46.     }while (t>=0 && s1[t]==s2[t]);
  47.     t++;
  48.   }
  49.   return t;
  50. }

  51. /*get kernel32 and ntdll base*/
  52. void GetRing3Base_m()
  53. {
  54. __int64 p;
  55.    p=*(__int64*)(*(__int64*)(*(__int64 *)(__readgsqword(0x30)+0x60)+0x18)+0x30);
  56.    n_Base=*(__int64*)(p+0x10);
  57.    k_Base=*(__int64*)(*(__int64*)(*(__int64*)p)+0x10);
  58. }
  59. int GetProcAddress_m(__int64 base,char* FuncName,__int64* FuncAddr)
  60. {
  61.   __int64 addr=0;
  62.   __int32* AddressOfNames;
  63.   __int32* AddressOfFunctions;
  64.   __int16* AddressOfNameOrdinals;
  65.   IMAGE_DOS_HEADER*         DOS_HEADER;
  66.   IMAGE_NT_HEADERS64*       NT_HEADER;
  67.   IMAGE_OPTIONAL_HEADER64*  OptionalHeader;
  68.   IMAGE_EXPORT_DIRECTORY*   Export;
  69.   int i,n,t;
  70.   char* Dst;
  71.   char* Src;
  72.   
  73.   if (!base || !FuncName) goto done;
  74.   DOS_HEADER=(IMAGE_DOS_HEADER*)(__int64)base;
  75.   if (DOS_HEADER->e_magic!='ZM') goto done;
  76.   
  77.   NT_HEADER = (IMAGE_NT_HEADERS64*)((__int64)DOS_HEADER +(__int64)DOS_HEADER->e_lfanew);
  78.   
  79.   if (NT_HEADER->Signature!='EP') goto done;
  80.   
  81.   OptionalHeader=&NT_HEADER->OptionalHeader;
  82.   
  83.   if (OptionalHeader->Magic!=0x20B) goto done;//pe 64
  84.   
  85.   Export = (IMAGE_EXPORT_DIRECTORY*)(\
  86.             (__int64)DOS_HEADER + \
  87.             (__int64)(OptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress)\
  88.             );
  89.   t=Export->NumberOfNames;
  90.   AddressOfNameOrdinals =(__int16*)((__int64)DOS_HEADER + (__int64)Export->AddressOfNameOrdinals);
  91.   AddressOfNames        =(__int32*)((__int64)DOS_HEADER + (__int64)Export->AddressOfNames);
  92.   AddressOfFunctions    =(__int32*)((__int64)DOS_HEADER + (__int64)Export->AddressOfFunctions);
  93.   Src=FuncName;
  94.   for (i=0;i<t;i++)
  95.   {
  96.     Dst=(char*)((__int64)DOS_HEADER + AddressOfNames[i]);
  97.     if (Dst[0]==Src[0]&& strcmp_m(Src,Dst)==0)
  98.     {
  99.       n=AddressOfNameOrdinals[i];
  100.       addr=(__int64)DOS_HEADER+AddressOfFunctions[n];
  101.       goto done;
  102.     }
  103.   }
  104. done:
  105.   *FuncAddr=addr;
  106.   return (addr?1:0);
  107. }


  108. #pragma code_seg()
  109. #pragma data_seg()

  110. #include "..\beaengine\headers\BeaEngine.h"

  111. struct FILE* __cdecl fopen();

  112. main()
  113. {
  114.         DISASM diasm={0};
  115.         struct FILE* file=fopen("shellcode.h","wt+");
  116.         __int64 i,j,k;
  117.         
  118.         printf("shellcode start %llx \nend %llx \ndata start %llx \nlength = %d\n",\
  119.                         &shell_start,\
  120.                         &shell_data_sign_S,\
  121.                         &shell_data_sign_E,\
  122.                         (__int64)&shell_data_sign_S-(__int64)&shell_start);
  123.         
  124.         fprintf(file,"unsigned char shellcode[] = {\n");
  125.         for (diasm.Archi=64,k=(__int64)&shell_start;k < (__int64)&shell_data_sign_S;k+=j)
  126.         {
  127.                 diasm.EIP=k;
  128.                 j=Disasm(&diasm);
  129.                 fprintf(file,"\t\t");
  130.                 for (i=0;i<j;i++) fprintf(file,"0x%.2X,",*(unsigned char*)(k+i));
  131.                 fprintf(file,"% *s\t// %s\n",max(50-j*5,0),"",&diasm.CompleteInstr);
  132.         }
  133.         
  134.         for (j=8,k=(__int64)&shell_data_sign_S;k<(__int64)&shell_data_sign_E;k+=j)
  135.         {
  136.                 fprintf(file,"\t\t");
  137.                 for (i=0;i<j;i++) fprintf(file,"0x%.2X,",*(unsigned char*)(k+i));
  138.                 fprintf(file,"\n");
  139.         }
  140.         fprintf(file,"\t\t0\n};\n");
  141.         
  142.         fprintf(file,"#define wow64GetProcAddress_m &shellcode[0x%lx]\n",(char*)&GetProcAddress_m - (char*)&shell_start);
  143.         fprintf(file,"#define wow64GetRing3Base_m   &shellcode[0x%lx]\n",(char*)&GetRing3Base_m - (char*)&shell_start);
  144.         fprintf(file,"#define wow64kernel32_64 &shellcode[0x%lx]\n",(char*)&k_Base - (char*)&shell_start);
  145.         fprintf(file,"#define wow64ntdll_64    &shellcode[0x%lx]\n",(char*)&n_Base - (char*)&shell_start);
  146.         
  147.         
  148.         fclose(file);

  149.         system("pause");
  150. }
复制代码

用wrk自带tool编译可以不会打乱变量声明顺序

  1. @echo off
  2. :re
  3. cls
  4. echo /*********************************************/
  5. echo /             shellcode                       /
  6. echo /*********************************************/
  7. set path=F:\WinDDK\7600.16385.1
  8. set obj=obj\amd64\BeaEngine.obj

  9. set Compiler=.\tools\amd64\cl.exe
  10. set linker=.\tools\amd64\link.exe

  11. set ddkCompiler=%path%\bin\x86\amd64\cl.exe
  12. set ddklinker=%path%\bin\x86\amd64\link.exe

  13. set name=shellcode

  14. %Compiler% .\src\%name%.c /D"_AMD64_" /I"%path%\inc\ddk" /I"%path%\inc\api" /I"%path%\inc\crt" /Fa"Debug\%name%.asm" /Fo"Debug\%name%.obj" /c /wd"4615" /wd"4616" /D"BEA_ENGINE_STATIC" /Od

  15. echo /*********************************************/
  16. echo /            compile end                      /
  17. echo /*********************************************/


  18. %linker% .\Debug\%name%.obj %obj% /MERGE:S_CODE=S_DATA /SECTION:S_DATA,RWE /LIBPATH:"%path%\lib\win7\amd64" /LIBPATH:"%path%\lib\Crt\amd64"  /OUT:"Debug\%name%.exe" /SUBSYSTEM:CONSOLE /MACHINE:AMD64 /IGNORE:4078
  19. echo /*********************************************/
  20. echo /            build end                        /
  21. echo /*********************************************/


  22. pause

  23. goto re
复制代码

  1. #include "shellcode.h"
  2. #include "wow64.h"

  3. __int64 _thunk_w64_data_list[]={
  4.         (__int64)wow64ntdll_64,
  5.         (__int64)wow64kernel32_64
  6. };

  7. __int64 _thunk_w64_func_list[index_wow64_max]={
  8.         0
  9. };
  10. __int64 _thunk_w64_args_list[index_wow64_max]={
  11.         8*32
  12. };



  13. void __declspec(naked) __fastcall _thunk_wow64_dispatch()
  14. {
  15.         __asm ret
  16. }
  17. void __declspec(naked) __fastcall _thunk_w64_to_wow64()
  18. {
  19.         __asm
  20.         {
  21.                 mov esp,ebx
  22.                 inc eax
  23.                 mov ebx,[esp]
  24.                 add esp,8
  25.                
  26.                 sub esp,8
  27.                 mov dword ptr [esp+0],offset _thunk_wow64_dispatch
  28.                 mov dword ptr [esp+4],23h
  29.                 retf
  30.         }
  31. }
  32. void __declspec(naked)  __fastcall _thunk_w64_invoke()
  33. {
  34.         __asm
  35.         {
  36.                
  37.                 cmp dword ptr [esp],8*1
  38.                 dec eax
  39.                 cmovae ecx,[esp+0x10]
  40.                
  41.                 cmp dword ptr [esp],8*2
  42.                 dec eax
  43.                 cmovae edx,[esp+0x18]
  44.                
  45.                 cmp dword ptr [esp],8*3
  46.                 dec esp
  47.                 cmovae eax,[esp+0x20]
  48.                
  49.                 cmp dword ptr [esp],8*4
  50.                 dec esp
  51.                 cmovae ecx,[esp+0x28]
  52.                
  53.                 add esp,8
  54.                 dec eax
  55.                 jmp eax
  56.         }
  57. }

  58. void __declspec(naked) __fastcall _thunk_wow64_to_w64()
  59. {
  60.         __asm
  61.         {
  62.                 sub esp,8
  63.                 mov [esp],ebx
  64.                 mov ebx,esp
  65.                
  66.                 /*alloc stack*/
  67.                 mov ecx,dword ptr _thunk_w64_args_list[eax*8]
  68.                 sub esp,ecx
  69.                 and esp,-16
  70.                
  71.                 /*strmov args*/
  72.                 mov edi,esp
  73.                 mov esi,edx
  74.                 rep movsb
  75.                
  76.                 /*set return address*/
  77.                 sub esp,8
  78.                 mov dword ptr [esp],offset _thunk_w64_to_wow64
  79.                 mov dword ptr [esp+4],0
  80.                
  81.                 /*log args*/
  82.                 mov ecx,dword ptr _thunk_w64_args_list[eax*8]
  83.                 sub esp,8
  84.                 mov [esp],ecx

  85.                 /*set tag func*/
  86.                 mov eax,dword ptr _thunk_w64_func_list[eax*8]
  87.                
  88.                 /*jmp tag proc*/
  89.                 sub esp,8
  90.                 mov dword ptr [esp+0],offset _thunk_w64_invoke
  91.                 mov dword ptr [esp+4],33h
  92.                 retf
  93.         }
  94. }

  95. void __declspec(naked) wow64initEx(__int64 pf,__int64 pfn,__int64 pfmax)
  96. {
  97.         __asm
  98.         {
  99.                 lea edx,[esp+4]
  100.                 xor eax,eax
  101.                 call _thunk_wow64_to_w64
  102.                 ret
  103.         }
  104. }


  105. void wow64init()
  106. {
  107.         _thunk_w64_func_list[0]=(__int64)&shellcode;
  108.         _thunk_w64_args_list[0]=3*8;
  109.         wow64initEx((__int64)&_thunk_w64_func_list,(__int64)&_thunk_w64_pfn_list,(__int64)index_wow64_max);
  110. }



  111. #define w64bywow64(_s_) \
  112. int __declspec(naked) wow64 ## _s_ ## () \
  113. { \
  114.         __asm lea edx,[esp+4] \
  115.         __asm mov eax,index ## _s_ \
  116.         __asm call _thunk_wow64_to_w64 \
  117.         __asm ret \
  118. }



  119. int main()
  120. {
  121.         int i;
  122.         //__asm int 3
  123.         wow64init();
  124.         //__asm int 3
  125.         for (i=0;i<index_wow64_max;i++)
  126.         {
  127.                 printf("0x%llx   %s\n",_thunk_w64_func_list[i],_thunk_w64_pfn_list[i]);
  128.         }
  129.         
  130.         printf("done\n");
  131.         system("pause");
  132.         return 0;
  133. }
复制代码

beaengine.obj source
https://github.com/BeaEngine/beaengine

hello_world.c

4.85 KB, 下载次数: 0

shellcode.c

8.71 KB, 下载次数: 0

wow64.h

47.47 KB, 下载次数: 0

shellcode.h

19.76 KB, 下载次数: 0

BeaEngine.obj

506.13 KB, 下载次数: 1

本帖被以下淘专辑推荐:

回复

使用道具 举报

发表于 2017-3-21 21:48:38 | 显示全部楼层
居然有obj
回复

使用道具 举报

 楼主| 发表于 2017-3-21 23:36:09 | 显示全部楼层

经典反汇编引擎!
回复 赞! 靠!

使用道具 举报

发表于 2017-3-22 06:14:07 | 显示全部楼层
Ayala 发表于 2017-3-21 23:36
经典反汇编引擎!

嗯我知道这玩意儿。
回复 赞! 靠!

使用道具 举报

发表于 2017-3-22 20:24:52 | 显示全部楼层
回复

使用道具 举报

发表于 2017-3-22 20:25:25 | 显示全部楼层
回复

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-12-22 17:13 , Processed in 0.041188 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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