Форум: "WinAPI";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
ВнизКак сделать дамп процесса из Delphi... Найти похожие ветки
← →
TankMan © (2004-02-06 19:01) [0]Вот проблема такая возникла... кто-нибудь может поделиться информацией?
Мне нужно-то всего - как найти и исправить EP из дельфи, и как останавливать программу на определенном месте (break Point), допустим на самом EP... или чуть дальше... и править байты уже позже...т.е. добиться такого же еффекта как и в LordPE, только не в SI :)...воот... и вобщем непосредственно сам дамп процесса...
← →
Digitman © (2004-02-07 12:08) [1]
> исправить EP
> и в LordPE, только не в SI
уж не знаю что такое EP, LordPE, SI, но дамп ВАП произвольного Win32+процесса реализуется с помощью связки ф-ций OpenProcess + AjustTokenPrivelegies + VirtualQueryEx + VirtualprotectEx + ReadProcessMemory
← →
TankMan © (2004-02-08 01:03) [2]Уж не знаю что такое "ВАП" :)... а
EP это - Entry Point, т.е. точка входа в программу.
LordPe - это программа, которая может "остановить" выбранную программу на точке в хода для SoftIce-а...
Вот...
А так вобщем вопрос один возниает ReadProcessMemory - это функция чтения памяти процесса (как видно из названия :) ) но у нее есть следующие "проблемные" для меня параметры - это куда, всетаки копировать таКОЙ объем, и еще то - каКОЙ именно объем... т.е. где узнать, начиная с какого адресса и сколько байт нужно читать?
← →
Игорь Шевченко © (2004-02-08 01:06) [3]
> и как останавливать программу на определенном месте (break
> Point), допустим на самом EP
Любым отладчиком. С сайта Borland можно скачать td32
← →
Opuhshii © (2004-02-08 09:12) [4]>break Point
CC - int 3
>EP
указан в заголовке PE файла,..
← →
TankMan © (2004-02-09 20:06) [5]А как сделать полный дамп программы - это самый главный вопрос?
← →
8ung © (2004-02-09 21:19) [6]
> А как сделать полный дамп программы - это самый главный
> вопрос?
Циклическое выполнение ReadProcessMemory.
← →
Erazzer (2004-02-09 22:25) [7]Копай в сторону структуры PE-файла (exe, dll, wdm и т.д.).
← →
TankMan © (2004-02-10 00:17) [8]>>8ung
...хм.. этой процедуре нужно указывать адресс откуда читать... и в каких-же пределах нужно работать?...я даже не представляю...
>>Erazzer
а что я могу там узнать? (например?)
← →
evvcom (2004-02-10 01:44) [9]
> а что я могу там узнать? (например?)
Там как раз и узнается, где размещается программа (точнее секции), какова их длина и многое другое.
← →
Digitman © (2004-02-10 08:15) [10]
> TankMan © (10.02.04 00:17) [8]
во всей этой петрушке ключевая ф-ция - VirtualQueryEx()
она как раз и позволяет определить наличие/размер/статус указанного региона в ВАП указанного процесса
циклический перебор регионов (в диапазоне адресов от 0 до 2ГБ) с пом.этой ф-ции дает инф-цию для работы ReadProcessmemory() в каждой итерации цикла .. требуемые атрибуты защиты страниц в каждом регионе (если их недостаточно для чтения) устанавливаются с пом. VirtualprotectEx
← →
TankMan © (2004-02-10 18:12) [11]>>vvcom
Нет, я конечно понимаю, что в РЕ можно найти все секции их размещение и все такое, но это если программа не запакована, а если она распаковывается в памяти, то что получится? или там указаны размеры секций с заранее предусмотренным местом для разжатых данных? и еще, ну прочитаю я эти все секции, а РЕ в новом файле мне откуда брать? или самому потом дописывать?
>>Digitman
ЭЭЭ...а пример не затруднительно будет выложить? А то я чего-то не пойму как именно эти функции использовать :(
← →
Digitman © (2004-02-10 18:37) [12]
> как именно эти функции использовать
давай по порядку ...
начинаем с VirtualQueryEx()
что непонятно ? конкретно ?
← →
Игорь Шевченко © (2004-02-10 19:03) [13]TankMan © (10.02.04 18:12)
Очень хороший пример у Рихтера
← →
Unax © (2004-02-11 10:33) [14]2 Digitman
Только почему-то ф-я VirtualProtect терпит неудачу, даже если состояние страницы MEM_COMMIT??
← →
AKul © (2004-02-11 11:49) [15]
> Unax © (11.02.04 10:33) [14]
> Только почему-то ф-я VirtualProtect терпит неудачу
А что по этому поводу говорит GetLastError()?
> TankMan © (06.02.04 19:01)
Что в данном вопросе подразумевается под дампом процесса:
1. Необходимо сохранить образ исполняемого файла (например, в exe он запакован/закриптован, а в памяти распаковывается/раскодируется). Сохраненный образ должен быть "нормальным" исполняемым файлом - т.е. необходимо создать аналог утилиты ProcDump.
2. Необходимо сохранить всю "действительную" виртуальную память процесса, включая стеки всех потоков, всю динамическую память, образы всех загруженных DLL и т.д. Но как в этом случае быть с объектами ядра, User, GDI и т.п.?
3. Ваш вариант.
> Мне нужно-то всего - как найти и исправить EP из дельфи,
> и как останавливать программу на определенном месте (break
> Point)
Для того, чтобы исправить точку входа - придется разбираться со структурой PE-файла (или хотя бы PE-заголовка. Можно посмотреть на файл windows.pas (для Delphi, winnt.h - С++), где есть немного интересного по этой теме, например структура TImageOptionalHeader и т.п.). Ну а как работать с exe-файлом как с файлом данных, думаю описывать не стоит.
Остановить программу в определенном месте можно, например, так:
1. Создаем процесс (CreateProcess) как отладочный (CREATE_DEBUG) и приостановленный (CREATE_SUSPENDED).
2. Вычислияем адрес точки входа (например, анализом PE-заголовка), по этому адресу (или другому, какому нужно) записываем байт 0CCh (код int 3), предварительно сохранив значение байта по этому адресу (используя функции WtiteProcessMemory, ReadProcessMemory).
3. Resume"им процесс (точнее поток) и ждем отладочного события о точке останова (EXCEPTION_DEBUG_EVENT с EXCEPTION_BREAKPOINT).
4. Дождавшись этого события, восстанавливаем ранее сохраненный байт по адресу, где устаналивали int 3, понимаем, что отлаживаемый процесс (точнее какой-нибудь из его потоков) остановился на этом BreakPoint"е.... и делаем дальше все что нужно....
← →
Songoku © (2004-02-11 13:40) [16]Vichslit" mesto zagruski Processa, ispol"zuya PE struckturi vichislit" razmer modulya, i skopirovat" s pomosh"u ReadProcessMemory skopirovat" na disk.
Potom istrawit" Sekziu Importa(Expotra).
P.s. Sorry netu russokoi klavi!
← →
TankMan © (2004-02-11 17:31) [17]>>Digitman
На счет VirtualQueryEx - первый параметр мне понятен ( :) ), а вот начинася со второго проблема - какой именно адрес мне нужно указывать? - я получаю структуру типа MEMORY BASIC INFORMATION... но что в ней такого полезного?...
>>AKul
Мне нужен вариант 2... - вообще мне нужно взломать программу, а точнее сделать... (ну что-то типа универсального кряка), дело в том, что программа при запуске чуть-чуть изменяет свой код, и поэтому просто обычным способом байты изменить нельзя (точнее, почти, нельзя), т.е. для того чтобы заставить ее работать нормально, нужно сделать лоадер - а этот способ мне совсем не нравится... так что цель моя - написать программку, которая запустит процесс, дойдет до той точки, после которой все уже "расшифровалось" , "удалит" "дешефровщик" (чтобы потом еще раз уже "расшифрованный" файл еще раз нерашифровывать), изменит в памяти нужные байты, и сделает дамп...
Все это врпинципе уже достигнуто, кроме последнего :(... меня это и огорчает, мне дали ссылку на пример написания трейсера, там все ясно и понятно написано, но вот про дамп файла там ни слова :(...
← →
Digitman © (2004-02-11 17:46) [18]
> Unax © (11.02.04 10:33) [14]
> Только почему-то ф-я VirtualProtect терпит неудачу, даже
> если состояние страницы MEM_COMMIT??
The VirtualProtect function changes the access protection on a region of committed pages in the virtual address space of the calling process
а мы тут говорим отнюдь не об address space of the calling process
> TankMan © (11.02.04 17:31) [17]
> начинася со второго проблема - какой именно адрес
> мне нужно указывать? - я получаю структуру типа MEMORY BASIC
> INFORMATION... но что в ней такого полезного?...
ВАП начинается с вирт.адреса = 0
это и есть адрес, который следует передать 2-м параметром при первой итерации цикла
в случае успеха ф-ция вернет тебе упомянутую структуру, в которой описывается труктура и атрибуты запрошенного региона (т.е. региона с вирт.адресом = 0)
адрес след.региона (для передачи его параметром при следующей итерации) будет равен
NextRegionAddress = mbi.BaseAddress + mbi.RegionSize
выход из цикла по условию возврата 0 как рез-та вызова очер.ф-ции с очередным баз.адресом
← →
TankMan © (2004-02-11 19:33) [19]так...я вот чего хотел уточнить, что такое регионы? это секции(section)? или что-то другое? если это так, то как мне их соединять воедино, чтобы получился рабочий ехе?
← →
Digitman © (2004-02-12 09:14) [20]
> что такое регионы? это секции(section)?
нет, регионы это не секции
термин "секция" имеет отношение к формату PE-модуля, хранимого в файле .. различают несколько основных типов секций - секции кода, секции данных, секции стека ..на основании инф-ции о структуре и атрибутах той или иной секции системный загрузчик (при загрузке PE-модуля из файла в АП процесса) распределяет и инициализирует нужным образом блоки страниц фирт.памяти, именуемые в ран-тайм регионами .. кр.того, регионы формируются и при запросе программой (уже в ходе ее работы) вирт.памяти из "кучи"
т.е. понятие регион тесно связано с ран-тайм
размер региона всегда кратен размеру страницы (4кб)
все ВАП процесса состоит из регионов, число которых всегда > 1
> как мне их соединять воедино, чтобы получился рабочий ехе
никак.
тебе вообще для чего дамп понадобился ?
ты вознамерился сотворить из дампа исп.файл, чтобы при его запуске состояние вирт.памяти процеса в точности соответствовало моменту снятия дампа ? если так, то в общем случае ничего путного не выйдет, бросай эту затею ..
этот механизм реализован только в WinXP и называется он, кажется, hibernate .. вероятно, для XP существует какой-то соотв.набор WinAPI-ф-ций, с пом.которых можно как-то управлять hibernate-механизмом программно, но мне такие ф-ции не известны - попросту не интересовался никогда
← →
AKul © (2004-01-23 13:18) [21]
> TankMan © (11.02.04 17:31) [17]
> Мне нужен вариант 2...
Судя по описанию, которое идет за этой фразой - Вам нужен все-таки вариант 1 (Вам не нужно сохранять стеки, образы всех загруженных DLL).
Для Вашей задачи (преобразование дампа в эекзешник) простым дампом процесса не обойтись.
Допустим, если Вы не хотите пользоваться функцией VirtualQueryEx, то Вы можете просто считать функцией ReadProcessMemory начиная с ImageBase (а для экзешника оно обычно 0x400000) определенное количество байт (сами подберете длину этого блока).
Но вот восстановить заголок exe-файла - проблема, так как пакеры, криптеры всю "ненужную" информацию удаляют из него. Так же придется восстановливать импорт.
Лучше будет изучить алгоритм этого пакера/криптера и по его алгоритму восстанавлить оригинал.
> дело в том, что программа при запуске чуть-чуть изменяет
> свой код
Если все же программа только чуть-чуть изменяет свой код, не перемещает его и т.п. (что-то с трудом верится в это!), то заголовок exe-файла у Вас есть (берите не из дампа, а из запущенного файла) и размещение секций файла в памяти Вы знаете на 100% (ну, или узнаете, прочитав документацию по структуре PE-файла). Останавливайте программу где нужно (Вы писали, что знаете где), находите секцию кода и сохраняйте ее из памяти в оригинальный экзешник вместо существующей.
Если Relocation Table применялась (очень маловероятно для екзешника, только если он имел какой-нибудь "странный" ImageBase), то придется восстановить все абсолютные переходы и ссылки на адреса памяти (это не проблема).
Меняйте точку входа в заголовке файла на требуемую.
... и запускайте, наслаждаясь своим творением!
← →
TankMan © (2004-02-12 18:46) [22]>>AKul
>Судя по описанию, которое идет за этой фразой - Вам нужен все-таки вариант 1
А да, я перепутал именно он и нужен...
>Но вот восстановить заголок exe-файла - проблема, так как пакеры, криптеры всю "ненужную" информацию удаляют из него. Так же придется восстановливать импорт.
Хм... ну как-то же ProcDump и LordPE это делает? вот например UPX - останавливаем ехе на месте, сразуже после распаковки и делаем дамп, меняем EP на OEP и все нормально... никакого импорта восстанавливать и не нужно... ведь как-то же LordPE определяет все то что должен содержать и импорт и заголовок ехе?
>Если все же программа только чуть-чуть изменяет свой код, не перемещает его и т.п.
Дело в том, что криптер (элементарнейший, но всеже) исправляет достаточное колличество инфы, и я не знаю, где точно... а хотя... да надобудет попробовать такой вариант...
← →
AKul © (2004-02-13 09:24) [23]
> TankMan © (12.02.04 18:46) [22]
> Хм... ну как-то же ProcDump и LordPE это делает? вот например
> UPX - останавливаем ехе на месте, сразуже после распаковки
> и делаем дамп, меняем EP на OEP и все нормально... никакого
> импорта восстанавливать и не нужно... ведь как-то же LordPE
> определяет все то что должен содержать и импорт и заголовок
> ехе?
Во-первых, им известен алгоритм работы этих упаковщиков.
Во-вторых, импорт они сами восстанавливают. Кроме того, для этого есть специальные утилиты. Да Вы сами можете написать такую, главное понять как представляется импорт в PE-файле, и как происходит статическая линковка DLL загрузчиком.
> Дело в том, что криптер (элементарнейший, но всеже) исправляет
> достаточное колличество инфы, и я не знаю, где точно...
Проанализируйте отладчиком, дизассемблером, сравните, наконец, дамп до запуска (в момент загрузки) с дампом после раскриптовки.
> а хотя... да надобудет попробовать такой вариант...
Попробуйте...
← →
TankMan © (2004-02-13 20:35) [24]Все ясно... значит не судьба :(
← →
Defunct (2004-02-15 18:18) [25]> значит не судьба :(
Еще один несостоявщийся хакер... А жаль
2 Digitman, под ВАП понимать VMA?
Насколько большой блок меняет расшифровшик?
> дело в том, что программа при запуске чуть-чуть изменяет свой код
Может проще будет переписать расшифровщик с учетом ограничений на объем и сразу с учетом всех Run-time изменений кода.
Можно изменить размер секции EXE, добавить свой, как Вы говорите, "Loader", и поставить первой командой JMP на него.
Либо так: первую расшифровываемую команду изменить так чтобы расшифровшик рсшифровал JMP на Loader. Ну а в "Loader" прошейте адрес обратного прыжка.
← →
Defunct (2004-02-15 18:29) [26]Еще один вариант:
1. измените байт в экзешнике, который соответствует первому расшифрованному байту, так чтобы врезультате расшифровки получилось 0CCh
2. независимый Loader запускает Ваш exeшник в режиме отладки, ловит BreakPoint, меняет измененный код.
3. Меняет байт 0CCH на байт, который должен был быть оригинально расшифрованным.
4. Выключает режим отладки.
← →
TankMan © (2004-02-15 21:50) [27]>>Defunct
>> значит не судьба :(
>Еще один несостоявщийся хакер... А жаль
не хакер а крякер... :)
>измените байт в экзешнике, который соответствует
да это тот же лоадер, мне это не нужно, я собирался сделать именно рабочий файл независящий не от каких программ (лоадеров)...да впринципе уже и сделал... так что, раз уж ни-кто не может поделится примером, который может сделать дамп процесса (при котором получится рабочий ехе), я думаю что тема закрыта...
← →
Digitman © (2004-02-16 08:18) [28]
> Defunct (15.02.04 18:18) [25]
> 2 Digitman, под ВАП понимать VMA?
Виртуальное Адресное Пространство (процесса)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.052 c