Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.036 c
14-1079973074
mur
2004-03-22 19:31
2004.04.18
ООП


14-1080543009
lehich
2004-03-29 10:50
2004.04.18
регистрация на форуме


1-1080566692
SMT
2004-03-29 17:24
2004.04.18
Font embedding в исполняемый файл


1-1080594387
Pavel
2004-03-30 01:06
2004.04.18
Timer


3-1079272168
BAYES
2004-03-14 16:49
2004.04.18
MSAccess





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский