登录注册
旗下网站 社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 邀请注册
主题 : Perfect MemoryLoader 绕过ring3层 所有API HOOK
heitaizi 离线
级别: 一星会员
UID: 78650
精华: 0
发帖: 78
金钱: 3684 金
威望: 152 点
社区警告: 0 次
预留信息: 0
账号服务: 0 次
中介服务: 0 次
热心值: 0 点
在线时间: 20(时)
注册时间: 2010-03-08
最后登录: 2012-05-03
0楼  发表于: 02-05   

Perfect MemoryLoader 绕过ring3层 所有API HOOK

类似TMD壳的系统DLL重载功能  B4kIcHA  
非LoadLibrary型系统模块重加载  FEkx&9]  
当然了 我这个代码任何模块包括EXE等等都是可以拿来MemoryLoader的 @c.pOX[]m,  
导出函数随意安全调用 EXE不存在的重定位话注意加载基址莫冲突 DLL不存在这个问题  e.N#+  
^dro*a,  
加载后模块是隐藏的 过XUETR等任何ARK工具查看 过国内任何杀软并且不报毒  谁叫我们是源码呢 当然你的函数调用系统功能号触犯杀软的RING0过滤规则就另当别论了  mwt3EV5  
Af;$ }P  
//2012/2/15  BY 金在中 QQ88009720 RW'QU`N[Y  
//Perfect MemoryLoader },l3N K  
//If you use this code freely  ,You can pass all the ring3 API hook;
% 74}H8q_z  
=dPrG=A   
复制代码
  1. #include <stdio.h>
  2. #include <Windows.h>
  3. #include <winnt.h> 
  4. typedef void *HMEMORYLOADER;
  5. void MemoryFreeLibrary(HMEMORYLOADER);
  6. #define POINTER_TYPE DWORD
  7. typedef struct {
  8.  PIMAGE_NT_HEADERS headers;
  9.  unsigned char *codeBase;
  10.  HMODULE *modules;
  11.  int numModules;
  12.  int initialized;
  13. } MEMORYMODULE, *PMEMORYMODULE;
  14. typedef BOOL (WINAPI *DllEntryProc)(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved);
  15. #define GET_HEADER_DICTIONARY(module, idx) &(module)->headers->OptionalHeader.DataDirectory[idx]
  16. static void
  17. CopySections(const unsigned char *data, PIMAGE_NT_HEADERS old_headers, PMEMORYMODULE module)
  18. {
  19.  int i, size;
  20.  unsigned char *codeBase = module->codeBase;
  21.  unsigned char *dest;
  22.  PIMAGE_SECTION_HEADER section = IMAGE_FIRST_SECTION(module->headers);
  23.  for (i=0; i<module->headers->FileHeader.NumberOfSections; i++, section++) {
  24.   if (section->SizeOfRawData == 0) {
  25.    size = old_headers->OptionalHeader.SectionAlignment;
  26.    if (size > 0) {
  27.     dest = (unsigned char *)VirtualAlloc(codeBase + section->VirtualAddress,
  28.      size,
  29.      MEM_COMMIT,
  30.      PAGE_READWRITE);
  31.     section->Misc.PhysicalAddress = (POINTER_TYPE)dest;
  32.     memset(dest, 0, size);
  33.    }
  34.    continue;
  35.   }
  36.   dest = (unsigned char *)VirtualAlloc(codeBase + section->VirtualAddress,
  37.    section->SizeOfRawData,
  38.    MEM_COMMIT,
  39.    PAGE_READWRITE);
  40.   memcpy(dest, data + section->PointerToRawData, section->SizeOfRawData);
  41.   section->Misc.PhysicalAddress = (POINTER_TYPE)dest;
  42.  }
  43. }
  44. static int ProtectionFlags[2][2][2] = {
  45.  {
  46.   {PAGE_NOACCESS, PAGE_WRITECOPY},
  47.   {PAGE_READONLY, PAGE_READWRITE},
  48.  }, {
  49.   {PAGE_EXECUTE, PAGE_EXECUTE_WRITECOPY},
  50.   {PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE},
  51.  },
  52. };
  53. static void
  54. FinalizeSections(PMEMORYMODULE module)
  55. {
  56.  int i;
  57.  PIMAGE_SECTION_HEADER section = IMAGE_FIRST_SECTION(module->headers);
  58. #define imageOffset 0
  59.  for (i=0; i<module->headers->FileHeader.NumberOfSections; i++, section++) {
  60.   DWORD protect, oldProtect, size;
  61.   int executable = (section->Characteristics & IMAGE_SCN_MEM_EXECUTE) != 0;
  62.   int readable =   (section->Characteristics & IMAGE_SCN_MEM_READ) != 0;
  63.   int writeable =  (section->Characteristics & IMAGE_SCN_MEM_WRITE) != 0;
  64.   if (section->Characteristics & IMAGE_SCN_MEM_DISCARDABLE) {
  65.    VirtualFree((LPVOID)((POINTER_TYPE)section->Misc.PhysicalAddress | imageOffset), section->SizeOfRawData, MEM_DECOMMIT);
  66.    continue;
  67.   }
  68.   protect = ProtectionFlags[executable][readable][writeable];
  69.   if (section->Characteristics & IMAGE_SCN_MEM_NOT_CACHED) {
  70.    protect |= PAGE_NOCACHE;
  71.   }
  72.   size = section->SizeOfRawData;
  73.   if (size == 0) {
  74.    if (section->Characteristics & IMAGE_SCN_CNT_INITIALIZED_DATA) {
  75.     size = module->headers->OptionalHeader.SizeOfInitializedData;
  76.    } else if (section->Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA) {
  77.     size = module->headers->OptionalHeader.SizeOfUninitializedData;
  78.    }
  79.   }
  80.   if (size > 0) {
  81.    if (VirtualProtect((LPVOID)((POINTER_TYPE)section->Misc.PhysicalAddress | imageOffset), size, protect, &oldProtect) == 0);
  82.      }
  83.  }
  84. }
  85. static void
  86. PerformBaseRelocation(PMEMORYMODULE module, SIZE_T delta)
  87. {
  88.  DWORD i;
  89.  unsigned char *codeBase = module->codeBase;
  90.  PIMAGE_DATA_DIRECTORY directory = GET_HEADER_DICTIONARY(module, IMAGE_DIRECTORY_ENTRY_BASERELOC);
  91.  if (directory->Size > 0) {
  92.   PIMAGE_BASE_RELOCATION relocation = (PIMAGE_BASE_RELOCATION) (codeBase + directory->VirtualAddress);
  93.   for (; relocation->VirtualAddress > 0; ) {
  94.    unsigned char *dest = codeBase + relocation->VirtualAddress;
  95.    unsigned short *relInfo = (unsigned short *)((unsigned char *)relocation + IMAGE_SIZEOF_BASE_RELOCATION);
  96.    for (i=0; i<((relocation->SizeOfBlock-IMAGE_SIZEOF_BASE_RELOCATION) / 2); i++, relInfo++) {
  97.     DWORD *patchAddrHL;
  98.     int type, offset;
  99.     type = *relInfo >> 12;
  100.     offset = *relInfo & 0xfff;
  101.     switch (type)
  102.     {
  103.     case IMAGE_REL_BASED_ABSOLUTE:
  104.      break;
  105.     case IMAGE_REL_BASED_HIGHLOW:
  106.      patchAddrHL = (DWORD *) (dest + offset);
  107.      *patchAddrHL += (DWORD)delta;
  108.      break;
  109.     default:
  110.      break;
  111.     }
  112.    }
  113.    relocation = (PIMAGE_BASE_RELOCATION) (((char *) relocation) + relocation->SizeOfBlock);
  114.   }
  115.  }
  116. }
  117. static int
  118. BuildImportTable(PMEMORYMODULE module)
  119. {
  120.  int result=1;
  121.  unsigned char *codeBase = module->codeBase;
  122.  PIMAGE_DATA_DIRECTORY directory = GET_HEADER_DICTIONARY(module, IMAGE_DIRECTORY_ENTRY_IMPORT);
  123.  if (directory->Size > 0) {
  124.   PIMAGE_IMPORT_DESCRIPTOR importDesc = (PIMAGE_IMPORT_DESCRIPTOR) (codeBase + directory->VirtualAddress);
  125.   for (; !IsBadReadPtr(importDesc, sizeof(IMAGE_IMPORT_DESCRIPTOR)) && importDesc->Name; importDesc++) {
  126.    POINTER_TYPE *thunkRef;
  127.    FARPROC *funcRef;
  128.    HMODULE handle = LoadLibraryA((LPCSTR) (codeBase + importDesc->Name));
  129.    if (handle == INVALID_HANDLE_VALUE)
  130.    {
  131.     result = 0;
  132.     break;
  133.    }
  134.    module->modules = (HMODULE *)realloc(module->modules, (module->numModules+1)*(sizeof(HMODULE)));
  135.    if (module->modules == NULL) {
  136.     result = 0;
  137.     break;
  138.    }
  139.    module->modules[module->numModules++] = handle;
  140.    if (importDesc->OriginalFirstThunk) {
  141.     thunkRef = (POINTER_TYPE *) (codeBase + importDesc->OriginalFirstThunk);
  142.     funcRef = (FARPROC *) (codeBase + importDesc->FirstThunk);
  143.    } else {
  144.     thunkRef = (POINTER_TYPE *) (codeBase + importDesc->FirstThunk);
  145.     funcRef = (FARPROC *) (codeBase + importDesc->FirstThunk);
  146.    }
  147.    for (; *thunkRef; thunkRef++, funcRef++) {
  148.     if (IMAGE_SNAP_BY_ORDINAL(*thunkRef)) {
  149.      *funcRef = (FARPROC)GetProcAddress(handle, (LPCSTR)IMAGE_ORDINAL(*thunkRef));
  150.     } else {
  151.      PIMAGE_IMPORT_BY_NAME thunkData = (PIMAGE_IMPORT_BY_NAME) (codeBase + (*thunkRef));
  152.      *funcRef = (FARPROC)GetProcAddress(handle, (LPCSTR)&thunkData->Name);
  153.     }
  154.     if (*funcRef == 0) {
  155.      result = 0;
  156.      break;
  157.     }
  158.    }
  159.    if (!result) {
  160.     break;
  161.    }
  162.   }
  163.  }
  164.  return result;
  165. }
  166. HMEMORYLOADER MemoryLoadLibrary(const void *data)
  167. {
  168.  PMEMORYMODULE result;
  169.  PIMAGE_DOS_HEADER dos_header;
  170.  PIMAGE_NT_HEADERS old_header;
  171.  unsigned char *code, *headers;
  172.  SIZE_T locationDelta;
  173.  DllEntryProc DllEntry;
  174.  BOOL successfull;
  175.  dos_header = (PIMAGE_DOS_HEADER)data;
  176.  if (dos_header->e_magic != IMAGE_DOS_SIGNATURE)
  177.  {
  178.   return NULL;
  179.  }
  180.  old_header = (PIMAGE_NT_HEADERS)&((const unsigned char *)(data))[dos_header->e_lfanew];
  181.  if (old_header->Signature != IMAGE_NT_SIGNATURE)
  182.  {
  183.   return NULL;
  184.  }
  185.  code = (unsigned char *)VirtualAlloc((LPVOID)(old_header->OptionalHeader.ImageBase),
  186.   old_header->OptionalHeader.SizeOfImage,
  187.   MEM_RESERVE,
  188.   PAGE_READWRITE);
  189.  if (code == NULL) {
  190.   code = (unsigned char *)VirtualAlloc(NULL,
  191.    old_header->OptionalHeader.SizeOfImage,
  192.    MEM_RESERVE,
  193.    PAGE_READWRITE);
  194.   if (code == NULL)
  195.   {
  196.    return NULL;
  197.   }
  198.  }
  199.  result = (PMEMORYMODULE)HeapAlloc(GetProcessHeap(), 0, sizeof(MEMORYMODULE));
  200.  result->codeBase = code;
  201.  result->numModules = 0;
  202.  result->modules = NULL;
  203.  result->initialized = 0;
  204.  VirtualAlloc(code,
  205.   old_header->OptionalHeader.SizeOfImage,
  206.   MEM_COMMIT,
  207.   PAGE_READWRITE);
  208.  headers = (unsigned char *)VirtualAlloc(code,
  209.   old_header->OptionalHeader.SizeOfHeaders,
  210.   MEM_COMMIT,
  211.   PAGE_READWRITE);
  212.  memcpy(headers, dos_header, dos_header->e_lfanew + old_header->OptionalHeader.SizeOfHeaders);
  213.  result->headers = (PIMAGE_NT_HEADERS)&((const unsigned char *)(headers))[dos_header->e_lfanew];
  214.  result->headers->OptionalHeader.ImageBase = (POINTER_TYPE)code;
  215.  CopySections((const unsigned char *)data, old_header, result);
  216.  locationDelta = (SIZE_T)(code - old_header->OptionalHeader.ImageBase);
  217.  if (locationDelta != 0) {
  218.   PerformBaseRelocation(result, locationDelta);
  219.  }
  220.  if (!BuildImportTable(result)) {
  221.   goto error;
  222.  }
  223.  FinalizeSections(result);
  224.  if (result->headers->OptionalHeader.AddressOfEntryPoint != 0) {
  225.   DllEntry = (DllEntryProc) (code + result->headers->OptionalHeader.AddressOfEntryPoint);
  226.   if (DllEntry == 0)
  227.   {
  228.    goto error;
  229.   }
  230.   successfull = (*DllEntry)((HINSTANCE)code, DLL_PROCESS_ATTACH, 0);
  231.   if (!successfull)
  232.   {
  233.    goto error;
  234.   }
  235.   result->initialized = 1;
  236.  }
  237.  return (HMEMORYLOADER)result;
  238. error:
  239.  MemoryFreeLibrary(result);
  240.  return NULL;
  241. }
  242. FARPROC MemoryGetProcAddress(HMEMORYLOADER module, const char *name)
  243. {
  244.  unsigned char *codeBase = ((PMEMORYMODULE)module)->codeBase;
  245.  int idx=-1;
  246.  DWORD i, *nameRef;
  247.  WORD *ordinal;
  248.  PIMAGE_EXPORT_DIRECTORY exports;
  249.  PIMAGE_DATA_DIRECTORY directory = GET_HEADER_DICTIONARY((PMEMORYMODULE)module, IMAGE_DIRECTORY_ENTRY_EXPORT);
  250.  if (directory->Size == 0) {
  251.   return NULL;
  252.  }
  253.  exports = (PIMAGE_EXPORT_DIRECTORY) (codeBase + directory->VirtualAddress);
  254.  if (exports->NumberOfNames == 0 || exports->NumberOfFunctions == 0) {
  255.   return NULL;
  256.  }
  257.  nameRef = (DWORD *) (codeBase + exports->AddressOfNames);
  258.  ordinal = (WORD *) (codeBase + exports->AddressOfNameOrdinals);
  259.  for (i=0; i<exports->NumberOfNames; i++, nameRef++, ordinal++) {
  260.   if (_stricmp(name, (const char *) (codeBase + (*nameRef))) == 0) {
  261.    idx = *ordinal;
  262.    break;
  263.   }
  264.  }
  265.  if (idx == -1) {
  266.   return NULL;
  267.  }
  268.  if ((DWORD)idx > exports->NumberOfFunctions) {
  269.   return NULL;
  270.  }
  271.  return (FARPROC) (codeBase + (*(DWORD *) (codeBase + exports->AddressOfFunctions + (idx*4))));
  272. }
  273. void MemoryFreeLibrary(HMEMORYLOADER mod)
  274. {
  275.  int i;
  276.  PMEMORYMODULE module = (PMEMORYMODULE)mod;
  277.  if (module != NULL) {
  278.   if (module->initialized != 0) {
  279.    DllEntryProc DllEntry = (DllEntryProc) (module->codeBase + module->headers->OptionalHeader.AddressOfEntryPoint);
  280.    (*DllEntry)((HINSTANCE)module->codeBase, DLL_PROCESS_DETACH, 0);
  281.    module->initialized = 0;
  282.   }
  283.   if (module->modules != NULL) {
  284.    for (i=0; i<module->numModules; i++) {
  285.     if (module->modules != INVALID_HANDLE_VALUE) {
  286.      FreeLibrary(module->modules);
  287.     }
  288.    }
  289.    free(module->modules);
  290.   }
  291.   if (module->codeBase != NULL) {
  292.    VirtualFree(module->codeBase, 0, MEM_RELEASE);
  293.   }
  294.   HeapFree(GetProcessHeap(), 0, module);
  295.  }
Au9Rr3n  
以上代码已经完整 如若要调用例程和注释的 自行购买附件  [5H#ay  
MemoryLoader.rar (34 K) 下载次数:73 售价:100金钱 5~v({R.  
v81<K*w`P  
[ 此帖被heitaizi在2012-02-05 17:09重新编辑 ]
清空我的评分动态本帖最近评分记录: 共1条评分记录
啊冲 金钱 +5 02-06 好东西应该加分,只是附件卖的有点贵哦.
隐藏评分记录
哥比蒸馏水还纯洁
ttuiop 离线
级别: 三星会员
UID: 81373
精华: 0
发帖: 349
金钱: 84 金
威望: 136 点
社区警告: 0 次
预留信息: 0
账号服务: 0 次
中介服务: 0 次
热心值: 0 点
在线时间: 229(时)
注册时间: 2011-05-01
最后登录: 2012-05-17
1楼  发表于: 02-05   
强大的东西,速度拿下
iokey 离线
级别: 二星会员
UID: 80644
精华: 0
发帖: 205
金钱: 744 金
威望: 212 点
社区警告: 0 次
预留信息: 0
账号服务: 0 次
中介服务: 0 次
热心值: 0 点
在线时间: 313(时)
注册时间: 2011-01-01
最后登录: 2012-05-20
2楼  发表于: 02-05   
看样子很强大的说 做个记号 说不定哪天要用到
请大家注意言行举止,不要让大家觉得不适!
heitaizi 离线
级别: 一星会员
UID: 78650
精华: 0
发帖: 78
金钱: 3684 金
威望: 152 点
社区警告: 0 次
预留信息: 0
账号服务: 0 次
中介服务: 0 次
热心值: 0 点
在线时间: 20(时)
注册时间: 2010-03-08
最后登录: 2012-05-03
3楼  发表于: 02-05   
例程中把loader函数封装了下 C[fefV9g2  
^W sgAyCB  
给出了一个简单的MessageboxA 调用 O)W+rmToI  
但是OD下断 MessageboxA Z;N3mD+\ye  
                  MessageboxW _# Hd2h  
                  MessageboxExW +\["HS7+'0  
                  MessageboxExA 4"|3pMr  
? #a&eW  
都无法断下  p8XvfM  
&KBDrJEX  
代码只要灵活运用 胜过那些虚伪的高价壳   iOfO+3'Z_U  
#yIHr&'oX  
7Cp /{l;d  
其实说穿了 TMD这种壳以前也就是拉圾的 内存IAT转发类型加密IAT  所以只要谨慎的对比静态PE文件和进程内存就可以还原TMD的IAT X*MK(aV3  
|X*y-d77W  
但是如果你是用我这代码编译生成的文件话 就是无IAT的真正动态调用 基本很难还原 如果再加个壳的话那强度可想而知了 &0f/ F:M  
vn*K\,  
[ 此帖被heitaizi在2012-02-05 17:50重新编辑 ]
如果您觉得有人语言挑衅或违反版规,请点每帖右下角的“举报”按钮!
哥比蒸馏水还纯洁
8970665 离线
级别: 四星会员
UID: 65336
精华: 0
发帖: 660
金钱: 204 金
威望: 275 点
社区警告: 0 次
预留信息: 0
账号服务: 0 次
中介服务: 0 次
热心值: 0 点
在线时间: 246(时)
注册时间: 2009-02-24
最后登录: 2012-05-14
4楼  发表于: 02-05   
myfunc.h在哪里
heitaizi 离线
级别: 一星会员
UID: 78650
精华: 0
发帖: 78
金钱: 3684 金
威望: 152 点
社区警告: 0 次
预留信息: 0
账号服务: 0 次
中介服务: 0 次
热心值: 0 点
在线时间: 20(时)
注册时间: 2010-03-08
最后登录: 2012-05-03
5楼  发表于: 02-05   
引用
引用第4楼8970665于2012-02-05 17:52发表的 : ~^ '+ .  
myfunc.h在哪里 !,7)ZW?*8  
}.=wQ_  
pnv)D} "  
&)!N 5Veb  
{ueDwnZ  
没调用到那头文件 你删掉即可 a(`"qS  
哥比蒸馏水还纯洁
dukunn 离线
级别: 特殊会员
UID: 77239
精华: 0
发帖: 64
金钱: 391 金
威望: 506 点
社区警告: 0 次
预留信息: 628704
账号服务: 0 次
中介服务: 0 次
热心值: 0 点
在线时间: 7(时)
注册时间: 2009-09-04
最后登录: 2012-03-22
6楼  发表于: 02-05   
小金子。。。。。。。。。厉害啊。。。。。
kaokao 离线
级别: 四星会员
UID: 18402
精华: 0
发帖: 639
金钱: 50 金
威望: 2 点
社区警告: 0 次
预留信息: 0
账号服务: 0 次
中介服务: 0 次
热心值: 0 点
在线时间: 550(时)
注册时间: 2007-03-21
最后登录: 2012-04-21
7楼  发表于: 02-05   
做个记号 说不定哪天要用到
yxlovemoney 离线
级别: 二星会员
UID: 68359
精华: 0
发帖: 174
金钱: 241 金
威望: 158 点
社区警告: 0 次
预留信息: 0
账号服务: 0 次
中介服务: 0 次
热心值: 0 点
在线时间: 63(时)
注册时间: 2009-04-02
最后登录: 2012-05-12
8楼  发表于: 02-05   
先留个名,谢谢分享
segasonyn64 离线
级别: 二星会员
UID: 45862
精华: 0
发帖: 165
金钱: 305 金
威望: 186 点
社区警告: 0 次
预留信息: 0
账号服务: 0 次
中介服务: 0 次
热心值: 0 点
在线时间: 101(时)
注册时间: 2008-04-16
最后登录: 2012-05-20
9楼  发表于: 02-05   
这个要顶啊,感谢分享!!!
描述
快速回复

验证问题:
10-6=?,请输入中文答案 正确答案:四
按"Ctrl+Enter"直接提交
上一个 下一个