冰楓論壇

標題: Memory Scan [打印本頁]

作者: kkmomo    時間: 2015-1-1 21:58
標題: Memory Scan
本帖最後由 kkmomo 於 2015-1-1 22:05 編輯

為了找特殊值只好自己寫一個
偷懶就寫得很隨便~
這裡的直接寫死成找 DWORD 而已
需要找別的要自己改

找加密過的值在 getCryptValue 裡換成解密運算就可以
(像是找動態數據什麼的)

也可以參考google到的這篇
http://www.csdn123.com/html/mycsdn20140110/65/659154f3fcd53390cb5cc65945fc3cb7.html

  1. DWORD getCryptValue(DWORD ptr)
  2. {
  3.         return *(PDWORD)ptr;
  4. }
  5.  
  6. int FirstMemScan(HANDLE hProcess, DWORD start, DWORD end, DWORD value, DWORD *result, int size)
  7. {
  8.         MEMORY_BASIC_INFORMATION mbi;
  9.         DWORD localStart;
  10.         DWORD localEnd;
  11.         DWORD totalsize;
  12.         int count;
  13.  
  14.         VirtualQueryEx(hProcess, (PVOID)(start)&mbi, sizeof(MEMORY_BASIC_INFORMATION));
  15.         localStart = (DWORD)mbi.BaseAddress;
  16.         count = 0;
  17.  
  18.         while(localStart < MEMORY_BOUNDARY && localStart <= end)
  19.         {
  20.                 if( !IsValidMem(mbi) )
  21.                 {
  22.                         localStart += mbi.RegionSize;
  23.                         VirtualQueryEx(hProcess, (PVOID)(localStart)&mbi, sizeof(MEMORY_BASIC_INFORMATION));
  24.                         continue;
  25.                 }
  26.                 totalsize = 0;
  27.                 while (localStart + totalsize < MEMORY_BOUNDARY)
  28.                 {
  29.                         VirtualQueryEx(hProcess, (PVOID)(localStart + totalsize)&mbi, sizeof(MEMORY_BASIC_INFORMATION));
  30.                         if( !IsValidMem(mbi) )
  31.                                 break;
  32.                         totalsize += mbi.RegionSize;
  33.                 }
  34.                 localEnd = min(localStart + totalsize, end);
  35.                 for (DWORD curr = max(localStart , start); curr < localEnd; curr += 4)
  36.                 {
  37.                         if (getCryptValue(curr) == value)
  38.                         {
  39.                                 result[count++] = curr;
  40.                                 debug("[%4d] %08X\n", count - 1, result[count - 1]);
  41.                                 if (count >= size)
  42.                                 {
  43.                                         debug("result arrive max size\n");
  44.                                         break;
  45.                                 }
  46.                         }
  47.                 }
  48.                 if (count >= size)
  49.                         break;
  50.                 localStart += totalsize;
  51.         }
  52.         return count;
  53. }
  54.  
  55. int MemScan(HANDLE hProcess, DWORD value, DWORD *oldResult, DWORD *newResult, int size)
  56. {
  57.         MEMORY_BASIC_INFORMATION mbi;
  58.         int count = 0;
  59.         if (oldResult == nullptr || newResult == nullptr)
  60.                 return -1;
  61.  
  62.         for (int index = 0; index < size; index++)
  63.         {
  64.                 if (IsValidPtr((PVOID)(oldResult[index])) && getCryptValue(oldResult[index]) == value)
  65.                 {
  66.                         newResult[count++] = oldResult[index];
  67.                         debug("new[%4d] %08X\n", count - 1, newResult[count - 1]);
  68.                 }
  69.         }
  70.         return count;
  71. }



作者: nmasd1023    時間: 2015-1-1 22:06
本帖最後由 nmasd1023 於 2015-2-5 09:15 編輯

不客氣地收下了




歡迎光臨 冰楓論壇 (https://bingfong.com/) Powered by 冰楓