Сейчас на форуме: tyns777 (+5 невидимых)

 eXeL@B —› Вопросы новичков —› X64DBG Сканер памяти (Поиск шаблона)
Посл.ответ Сообщение

Ранг: -1.9 (гость), 3thx
Активность: 0.160.1
Статус: Участник

Создано: 24 августа 2019 22:42 · Поправил: PEvgen
· Личное сообщение · #1

Уважаемые!
Возникла необходимость сканировать память в скрипте.
Сделать что-то типа этого:
Нарыто:
1. x64dbg.DbgMemMap(memmap) - "count" получается верный, к страницам как получить доступ хз
2. x64dbg.FindMem(start, size, pattern) - в каком виде подсовывать ей шаблон, строку не находит, хоть и требует "const char *"(может я с размером 1 к 1-му не прав?). "ctypes" строку не принимает
Вот суть вопроса из 2х частей.
Возможно ли желаемое?



Ранг: -1.9 (гость), 3thx
Активность: 0.160.1
Статус: Участник

Создано: 27 августа 2019 14:49
· Личное сообщение · #2

Не, ну могли хотя бы написать: "Жень, перестань нас беспокоить своими мелочами, для подобной х....ни мы слишком умные"

| Сообщение посчитали полезным: erchess


Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 27 августа 2019 15:08
· Личное сообщение · #3

PEvgen пишет:
Возникла необходимость сканировать память в скрипте.

для скрипта вроде find с аргументами, а то что ниже на уровне плагина, но то что ты юзаешь,для других задач.
в принципе диа вынес в скрипт, то же самое что и в сдк апи
семпл
Code:
  1.          char buffer[MAX_MNEMONIC_SIZE];
  2.          duint Size = Memory::GetSize(DbgValFromString(argv[1]), false, true);
  3.          Size = (Memory::GetBase(DbgValFromString(argv[1]), false, true) + Size) - DbgValFromString(argv[1]);
  4.          duint temp = DbgValFromString(argv[1]);
  5.          int len = DbgValFromString(argv[3]) * 2;
  6.          strncpy_s(buffer, argv[2], len);
  7.          duint found = temp = Pattern::FindMem(temp, Size, buffer);
  8.  


-----
Чтобы юзер в нэте не делал,его всё равно жалко..





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 27 августа 2019 15:13
· Личное сообщение · #4

Мог бы загуглить вопросы на гитхабе, там были подобные темы .. Если это касается отладчика X64DBG, то нужно самостоятельно всё разбирать, там есть баги или отсутствие документации, поэтому будь протагонистом.

Code:
  1. from x64dbgpy.pluginsdk import *
  2. import sys
  3.  
  4. cip = register.GetCIP()
  5. if memory.ReadByte(cip) != 0x60:
  6.     gui.Message("Start at UPX entry point (1:[CIP]==0x60)")
  7.     exit(0)
  8.  
  9. x64dbg.DbgCmdExecDirect("bc")
  10. x64dbg.DbgCmdExecDirect("bphwc")
  11. found = pattern.FindMem(cip, 0x1000, "83 EC ?? E9");
  12. if found == 0:
  13.     gui.Message("Could not find pattern!");
  14.     exit(0)
  15.  
  16. debug.SetBreakpoint(found + 3)
  17. debug.Run()
  18. debug.StepIn()
  19.  
  20. cip = register.GetCIP()
  21. comment.Set(cip, "OEP Found by Python!")
  22. gui.Message("Reached OEP. Use Scylla to dump and restore imports!")
  23. x64dbg.DbgCmdExec("scylla")


--> Link <--

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube


| Сообщение посчитали полезным: PEvgen

Ранг: -1.9 (гость), 3thx
Активность: 0.160.1
Статус: Участник

Создано: 27 августа 2019 18:25
· Личное сообщение · #5

Bronco пишет:
то же самое что и в сдк апи
- видимо этого покамест нету....

В принципе пол ответа это уже что-то, по крайней мере в конкретной ситуации....

В общем полноценно эмулировать поиск шаблона, наверное, можно лишь через плуг, в конце-концов прога ведь это делает....
как раз и плуг пора пробовать писать...
Всем спасибо!

Добавлено спустя 3 минуты
Кстати... мож кто в курсе как из PyScr $RESULT получить?




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 27 августа 2019 18:48
· Личное сообщение · #6

PEvgen пишет:
как раз и плуг пора пробовать писать...


ClawSearch - A memory scanner plugin for x64dbg, inspired by Cheat Engine - --> Link <--

PEvgen пишет:
В принципе пол ответа это уже что-то, по крайней мере в конкретной ситуации....


PEvgen пишет:
Bronco пишет:
то же самое что и в сдк апи - видимо этого покамест нету....


Можно же не ждать ответа, дали хорошие наводки, сорсы дебагера открыты, что ещё нужно для счастья?!

DbgMemMap(&wMemMapStruct); файл в сорсах MemoryMapView.cpp

Code:
  1. void MemoryMapView::refreshMap()
  2. {
  3.     MEMMAP wMemMapStruct;
  4.     int wI;
  5.  
  6.     memset(&wMemMapStruct, 0, sizeof(MEMMAP));
  7.  
  8.     DbgMemMap(&wMemMapStruct);
  9.  
  10.     setRowCount(wMemMapStruct.count);
  11.  
  12.     QString wS;
  13.     MEMORY_BASIC_INFORMATION wMbi;
  14.     for(wI = 0; wI < wMemMapStruct.count; wI++)
  15.     {
  16.         wMbi = (wMemMapStruct.page)[wI].mbi;
  17.  
  18.         // Base address
  19.         setCellContent(wI, 0, ToPtrString((duint)wMbi.BaseAddress));
  20.  
  21.         // Size
  22.         setCellContent(wI, 1, ToPtrString((duint)wMbi.RegionSize));
  23.  
  24.         // Information
  25.         wS = QString((wMemMapStruct.page)[wI].info);
  26.         setCellContent(wI, 2, wS);
  27.  
  28.         // Content, TODO: proper section content analysis in dbg/memory.cpp:MemUpdateMap
  29.         char comment_text[MAX_COMMENT_SIZE];
  30.         if(DbgFunctions()->GetUserComment((duint)wMbi.BaseAddress, comment_text)) // user comment present
  31.             wS = comment_text;
  32.         else if(wS.contains(".bss"))
  33.             wS = tr("Uninitialized data");
  34.         else if(wS.contains(".data"))
  35.             wS = tr("Initialized data");
  36.         else if(wS.contains(".edata"))
  37.             wS = tr("Export tables");
  38.         else if(wS.contains(".idata"))
  39.             wS = tr("Import tables");
  40.         else if(wS.contains(".pdata"))
  41.             wS = tr("Exception information");
  42.         else if(wS.contains(".rdata"))
  43.             wS = tr("Read-only initialized data");
  44.         else if(wS.contains(".reloc"))
  45.             wS = tr("Base relocations");
  46.         else if(wS.contains(".rsrc"))
  47.             wS = tr("Resources");
  48.         else if(wS.contains(".text"))
  49.             wS = tr("Executable code");
  50.         else if(wS.contains(".tls"))
  51.             wS = tr("Thread-local storage");
  52.         else if(wS.contains(".xdata"))
  53.             wS = tr("Exception information");
  54.         else
  55.             wS = QString("");
  56.         setCellContent(wI, 3, wS);
  57.  
  58.         // Type
  59.         const char* type = "";
  60.         switch(wMbi.Type)
  61.         {
  62.         case MEM_IMAGE:
  63.             type = "IMG";
  64.             break;
  65.         case MEM_MAPPED:
  66.             type = "MAP";
  67.             break;
  68.         case MEM_PRIVATE:
  69.             type = "PRV";
  70.             break;
  71.         default:
  72.             type = "N/A";
  73.             break;
  74.         }
  75.         setCellContent(wI, 4, type);
  76.  
  77.         // current access protection
  78.         setCellContent(wI, 5, getProtectionString(wMbi.Protect));
  79.  
  80.         // allocation protection
  81.         setCellContent(wI, 6, getProtectionString(wMbi.AllocationProtect));
  82.  
  83.     }
  84.     if(wMemMapStruct.page != 0)
  85.         BridgeFree(wMemMapStruct.page);
  86.     reloadData(); //refresh memory map
  87. }


-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube


| Сообщение посчитали полезным: plutos


Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 27 августа 2019 18:50 · Поправил: Bronco
· Личное сообщение · #7

PEvgen пишет:
полноценно эмулировать поиск шаблона, наверное, можно лишь через плуг

смотря какая задача, сам поиск на двиге яра, а она шустрая ого-го. Если просто искать паттерн, то и скриптовых команд достаточно, если потом править через асм, то это слабое место. при большом кол-ве сабж падает. Если искать указатели, как рав так и ва, то лучше через плаг. бывают коллизии на совпадение, и надо выравнивать оффсет патерна и проверять содержимое. И обязательно отслеживать размер памяти для поиска, так и быстрее и наверняка.
Да, и это, ....это не эмуляция, это реальная задачка.
mak пишет:
что ещё нужно для счастья?!

вот реально, встроенный патчер не отключишь, к слову никак. а из-за него куча бед, падений и фризов.

-----
Чтобы юзер в нэте не делал,его всё равно жалко..




Ранг: -1.9 (гость), 3thx
Активность: 0.160.1
Статус: Участник

Создано: 27 августа 2019 19:45
· Личное сообщение · #8

mak пишет:
Можно же не ждать ответа, дали хорошие наводки
я ж это и имею в виду!

found = pattern.FindMem(cip, 0x1000, "83 EC ?? E9"); - это пол ответа:
1. я давал строку в чистом виде
2. где-то на глаза мне попадалось, что эти поиски автоматически доходят до конца страницы (повторный поиск этой теории к успеху не привел:s10, исходя из этой теории я передавал длину искомой строки вторым параметром (глупо, не спорю, но я был введен в заблуждение)

MEMORY_BASIC_INFORMATION вот этого и нету в скрипте и перебор страниц в карте (хоть в каком-то виде) тоже отсутствует
Bronco пишет:
Если просто искать паттерн, то и скриптовых команд достаточно
все верно, факт наличия искомого подтверждается одной строчкой в обычном скрипте

Bronco пишет:
это не эмуляция, это реальная задачка
эмуляция имелось в виду для упрощения понимания сути вопроса - "вот так же" (но с перламутровыми пуговицами)



Ранг: -1.9 (гость), 3thx
Активность: 0.160.1
Статус: Участник

Создано: 29 августа 2019 08:19
· Личное сообщение · #9

MrExodia реально удивил - решение вопроса простое закрытие темы!
--> GitHub <--




Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 29 августа 2019 20:32
· Личное сообщение · #10

задача - поиск по всему процессу аки артмани или читэнжин, только в виде скрипта.

искать есть смысл только в аллокнутых регионах памяти, к которым есть доступ
стандартные функции икс64дебага предполагают, что юзер уже и так понимает где он ищет.
и никаких средств для получения доступа к карте памяти процесса нет. печально, между прочим.

однако и между прочим - в юзермоде винды нет структур, внятно описывающих границы выделенных процессу страниц памяти.
значит, чтобы выполнять поиск "чегототам" по всей памяти процесса - надо сначала построить свою карту процесса - все регионы памяти, имеющие доступ хотя бы на чтение.

для этого в цикле придётся перебрать всё адресное пространство через GetProtect, GetBase, GetSize ориентируясь на MemoryAlign.

DbgMemMap - явно недоработанная часть, которая не поддерживает нативное (хз, может там какой-то хитрый метод может) перечисление страниц. Я уже ранее натыкался на костыли и недоработки питоновой обёртки, так что я думаю для опытных это не новость - там еще пилить и пилить)

/*твин дефексакава закончил*/

| Сообщение посчитали полезным: PEvgen

Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 30 августа 2019 22:41
· Личное сообщение · #11

PEvgen пишет:
MrExodia реально удивил - решение вопроса простое закрытие темы!

Он тебе дал исчерпывающий ответ. Скажи спасибо, и сделай сам.




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 31 августа 2019 04:23 · Поправил: difexacaw
· Личное сообщение · #12

-=AkaBOSS=-

> искать есть смысл только в аллокнутых регионах памяти, к которым есть доступ

Именно так. MEMORY_WORKING_SET_BLOCK это список страниц, загруженных в рабочий набор, к которым прошла выборка. Остальные трогать не нужно.

> в юзермоде винды нет структур, внятно описывающих границы выделенных процессу страниц памяти.

Есть, одним сервисом возвращается дамп всей памяти ^

Code:
  1. WsGet proc uses esi edi
  2. Local Mm[512]:ULONG
  3. Local Self:MEMORY_BASIC_INFORMATION
  4. Local Page:DWORD
  5.          invoke WsEmpty
  6.          .if !Eax
  7.                  invoke ZwQueryVirtualMemory, NtCurrentProcess, 0, MemoryWorkingSetList, addr Mm, 512*4, NULL
  8.                  .if !Eax
  9.                         invoke ZwQueryVirtualMemory, NtCurrentProcess, addr WsGet, MemoryBasicInformation, addr Self, sizeof(MEMORY_BASIC_INFORMATION), NULL
  10.                         .if !Eax
  11.                               mov esi,Self.AllocationBase
  12.                               mov edi,esi
  13.                               add edi,Self.RegionSize
  14.                               mov ebx,MEMORY_WORKING_SET_LIST.NumberOfEntries[Mm]
  15.                               .repeat
  16.                                    mov eax,MEMORY_WORKING_SET_LIST.WorkingSetInfo[Mm][ebx*4][-4]
  17.                                    bt eax,1     ; MM_EXECUTE | MM_EXECUTE_READWRITE | MM_EXECUTE_WRITECOPY
  18.                                    mov Page,eax
  19.                                    .if Carry?
  20.                                        .if (Eax < Esi) || (Eax >= Edi)
  21.                                           mov ecx,fs:[TEB.Peb]
  22.                                           mov ecx,PEB.ImageBaseAddress[ecx]
  23.                                           invoke ZwAreMappedFilesTheSame, Eax, Ecx
  24.                                           .if Eax
  25.                                             invoke MmCrc, Page
  26.                                             .if (Eax != 084C05E40H) && (Eax != 05632AEDFH) && (Eax != 0A22330FBH) && (Eax != 0025B7DE6H)
  27.                                              ; ntdll.dll
  28.                                              ; wow64.dll
  29.                                              ; wow64cpu.dll
  30.                                              ; wow64win.dll
  31.                                              .if !Eax ; !File
  32.                                                       bt Page,8        ; Shared
  33.                                                       jc Skip
  34.                                                       
  35.                                                       int 3
  36.                                                       
  37.                                              .endif
  38.                                             .endif
  39.                                           .endif
  40.                                        .endif
  41.                                    .endif
  42.                               Skip:
  43.                                    dec ebx
  44.                               .until Zero?
  45.                         .endif
  46.                  .endif
  47.          .endif
  48.          ret
  49. WsGet endp


-----
vx




Ранг: -1.9 (гость), 3thx
Активность: 0.160.1
Статус: Участник

Создано: 01 сентября 2019 21:03
· Личное сообщение · #13

Alchemistry пишет:
Скажи спасибо
Я, наверное, плохо воспитан, раз не приучен благодарить людей посылающих меня на х.
Особенно тех у кого и смелости не хватает сделать это не шепотом, а уж про адекватность и наличие повода для посыла я подавно молчу...




Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 02 сентября 2019 05:15 · Поправил: Bronco
· Личное сообщение · #14

PEvgen, хз посмотрел исузу, и по ходу у тебя тупик, не в самом поиске, а в перечисление страниц памяти процесса и их размера, ну и фуй с этой меммапой, используй VirtualQueryEx в цикле, те же фаберже..))

-----
Чтобы юзер в нэте не делал,его всё равно жалко..




Ранг: -1.9 (гость), 3thx
Активность: 0.160.1
Статус: Участник

Создано: 02 сентября 2019 08:31
· Личное сообщение · #15

Bronco пишет:
в перечисление страниц памяти процесса и их размера
- совершенно верно, там по MEMMAP, MEMPAGE и MBI только заглушки никакой реализации
Bronco пишет:
VirtualQueryEx
хотелось без PyWin скриптец, к тому же она там не присутствует самолично, я хз как бы оно пошло - использование ее


 eXeL@B —› Вопросы новичков —› X64DBG Сканер памяти (Поиск шаблона)
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати