Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.18;
Скачать: CL | DM;

Вниз

Как сделать дамп процесса из 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 вся ветка

Текущий архив: 2004.04.18;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.036 c
14-1080269816
Думкин
2004-03-26 05:56
2004.04.18
С днем рождения! 26 марта.


4-1076490186
comwad
2004-02-11 12:03
2004.04.18
Привлечение внимания пользователя к приложению


3-1079622694
Masha Streltsova
2004-03-18 18:11
2004.04.18
Picklist в DBGrid е


6-1074854456
juiceman
2004-01-23 13:40
2004.04.18
what about Indy ?


1-1080566510
TButton
2004-03-29 17:21
2004.04.18
Сравнить 2 record а