Dump Memory в exe

Discussion in 'Реверсинг' started by noxjoker, 25 Mar 2015.

  1. noxjoker

    noxjoker Member

    Joined:
    7 Aug 2009
    Messages:
    189
    Likes Received:
    24
    Reputations:
    0
    Стоит такая задача - Допустим мы запустили калькулятор, сделали там определенные расчеты, теперь я делаю дамп памяти этого процесса. Задача стоит в том чтобы теперь этот дамп памяти воспроизвести опять но уже с помощью моего ехе. То есть мой ехе будет ложить дамп (левой программы) обратно в память и должен выскочить калькулятор с расчетами который я делал.

    Возможно ли такое может уже есть софт какой-то для этого? Что-то я гуглил вообще глухо. :confused:
     
  2. KIR@PRO

    KIR@PRO from Exception

    Joined:
    26 Dec 2007
    Messages:
    825
    Likes Received:
    287
    Reputations:
    359
    Такое можно сделать но это потребует огромного геморроя.
    1) необходимо что бы все адреса (памяти) в новом процессе соответствовали тому с которого был снят дамп. (это не так сложно будет сделать если 1] приложение маленькое; 2] не используется множество отдельных регионов памяти)
    2) необходимо будет делать еще и дамп стека...
    3) помимо собственных ресурсов, каждое приложение взаимодействует с ОС, и это, влечет создание в памяти ОС структур данных для приложения, некоторые из которых не получится скопировать/вставить и и придется воспроизводить действия (запросы ядру/библиотекам) что бы ОС их создала... (Как пирмер: Окно которое отображается это именно такая структура) (Стоит обмолвиться о том, что вместо адресов таких структур ОС возвращает для них числовой номер (handle) по которому она определит с какой структурой работать, а потому не факт, что ОС сгенерирует нам именно такой же handle какой был выдан приложению на момент снятия дампа...)
     
    _________________________
  3. noxjoker

    noxjoker Member

    Joined:
    7 Aug 2009
    Messages:
    189
    Likes Received:
    24
    Reputations:
    0
    хм вот интересно в Windows можно же уйти в спящий режим и комп вырубается но при включении робота восстанавливается. Да винде легче потому-что она хранит все а тут именно придется один процесс. Хотя бы найти готовый софт который делает что-то похожее..
     
  4. KIR@PRO

    KIR@PRO from Exception

    Joined:
    26 Dec 2007
    Messages:
    825
    Likes Received:
    287
    Reputations:
    359
    Винда так делает потому что она управляет всеми программами, и она решает какой процесс будет исполнятся сейчас а какой позже, перед спящим режимом она тупо по очереди останавливает процессы, сохраняет их и СВОЮ память на ЖД (если это гибернация) либо оставляет все в оперативной памяти и переходит в режим пониженного энергопотребления.

    Да да, в спящем режиме процессор и оперативная память продолжают работать, но в специальном режиме, в котором выполнение прикладных программ невозможно.
     
    _________________________
  5. Forte

    Forte Elder - Старейшина

    Joined:
    27 Sep 2010
    Messages:
    53
    Likes Received:
    24
    Reputations:
    32
    В недрид скрипт
    или написал свои скрипт и делаешь inject это будетъ проще всево
     
  6. noxjoker

    noxjoker Member

    Joined:
    7 Aug 2009
    Messages:
    189
    Likes Received:
    24
    Reputations:
    0
    Если есть примеры кидай сюда.
     
  7. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,582
    Likes Received:
    1,310
    Reputations:
    1,557
    Немного оффтопа.
    "Спящий режим" понятие двусмысленное. Раньше ру версиях винды так назывался "hibernation". Начиная с висты спящим режимом стал называться "sleep mode", который ранее переводили как "ждущий режим".
     
    swt1 likes this.
  8. Forte

    Forte Elder - Старейшина

    Joined:
    27 Sep 2010
    Messages:
    53
    Likes Received:
    24
    Reputations:
    32
    Dump Memory

    000A9C08 31 00 39 00 38 00 32 00 31 00 31 00 31 00 37 1.9.8.2.1.1.1.7

    Address -> 000A9C08
    Bytes Unicode -> 31 00 39 00 38 00 32 00 31 00 31 00 31 00 37
    расчет calc.exe -> 1.9.8.2.1.1.1.7

    Например:
    [DllImport("kernel32.dll")]
    public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
    [DllImport("kernel32.dll")]
    public static extern bool ReadProcessMemory(int hProcess, int lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesRead);

    const int PROCESS_WM_READ = 0x0010;

    Process process = Process.GetProcessesByName("calc")[0];
    IntPtr processHandle = OpenProcess(PROCESS_WM_READ, false, process.Id);
    int bytesRead = 0;
    byte[] buffer = new byte[24]; //bytes Unicode

    // 0x000A9C08 address
    ReadProcessMemory(processHandle, 000A9C08, buffer, buffer.Length, bytesRead);

    Console.WriteLine(Encoding.Unicode.GetString(buffer) + " (" + bytesRead.ToString() + "bytes)");