![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сделать дамп процесса из Delphi... [D5, Win95/98, WinME, WinXP]
TankMan © (2004-02-06 19:01:00)Вот проблема такая возникла... кто-нибудь может поделиться информацией?
Мне нужно-то всего - как найти и исправить EP из дельфи, и как останавливать программу на определенном месте (break Point), допустим на самом EP... или чуть дальше... и править байты уже позже...т.е. добиться такого же еффекта как и в LordPE, только не в SI :)...воот... и вобщем непосредственно сам дамп процесса...
Digitman (2004-02-16 08:18:00) [1]
> Defunct (15.02.04 18:18) [25]
> 2 Digitman, под ВАП понимать VMA?
Виртуальное Адресное Пространство (процесса)
TankMan (2004-02-15 21:50:00) [2]>>Defunct
>> значит не судьба :(
>Еще один несостоявщийся хакер... А жаль
не хакер а крякер... :)
>измените байт в экзешнике, который соответствует
да это тот же лоадер, мне это не нужно, я собирался сделать именно рабочий файл независящий не от каких программ (лоадеров)...да впринципе уже и сделал... так что, раз уж ни-кто не может поделится примером, который может сделать дамп процесса (при котором получится рабочий ехе), я думаю что тема закрыта...
Defunct (2004-02-15 18:29:00) [3]Еще один вариант:
1. измените байт в экзешнике, который соответствует первому расшифрованному байту, так чтобы врезультате расшифровки получилось 0CCh
2. независимый Loader запускает Ваш exeшник в режиме отладки, ловит BreakPoint, меняет измененный код.
3. Меняет байт 0CCH на байт, который должен был быть оригинально расшифрованным.
4. Выключает режим отладки.
Defunct (2004-02-15 18:18:00) [4]> значит не судьба :(
Еще один несостоявщийся хакер... А жаль
2 Digitman, под ВАП понимать VMA?
Насколько большой блок меняет расшифровшик?
> дело в том, что программа при запуске чуть-чуть изменяет свой код
Может проще будет переписать расшифровщик с учетом ограничений на объем и сразу с учетом всех Run-time изменений кода.
Можно изменить размер секции EXE, добавить свой, как Вы говорите, "Loader", и поставить первой командой JMP на него.
Либо так: первую расшифровываемую команду изменить так чтобы расшифровшик рсшифровал JMP на Loader. Ну а в "Loader" прошейте адрес обратного прыжка.
TankMan (2004-02-13 20:35:00) [5]Все ясно... значит не судьба :(
AKul (2004-02-13 09:24:00) [6]
> TankMan © (12.02.04 18:46) [22]
> Хм... ну как-то же ProcDump и LordPE это делает? вот например
> UPX - останавливаем ехе на месте, сразуже после распаковки
> и делаем дамп, меняем EP на OEP и все нормально... никакого
> импорта восстанавливать и не нужно... ведь как-то же LordPE
> определяет все то что должен содержать и импорт и заголовок
> ехе?
Во-первых, им известен алгоритм работы этих упаковщиков.
Во-вторых, импорт они сами восстанавливают. Кроме того, для этого есть специальные утилиты. Да Вы сами можете написать такую, главное понять как представляется импорт в PE-файле, и как происходит статическая линковка DLL загрузчиком.
> Дело в том, что криптер (элементарнейший, но всеже) исправляет
> достаточное колличество инфы, и я не знаю, где точно...
Проанализируйте отладчиком, дизассемблером, сравните, наконец, дамп до запуска (в момент загрузки) с дампом после раскриптовки.
> а хотя... да надобудет попробовать такой вариант...
Попробуйте...
TankMan (2004-02-12 18:46:00) [7]>>AKul
>Судя по описанию, которое идет за этой фразой - Вам нужен все-таки вариант 1
А да, я перепутал именно он и нужен...
>Но вот восстановить заголок exe-файла - проблема, так как пакеры, криптеры всю "ненужную" информацию удаляют из него. Так же придется восстановливать импорт.
Хм... ну как-то же ProcDump и LordPE это делает? вот например UPX - останавливаем ехе на месте, сразуже после распаковки и делаем дамп, меняем EP на OEP и все нормально... никакого импорта восстанавливать и не нужно... ведь как-то же LordPE определяет все то что должен содержать и импорт и заголовок ехе?
>Если все же программа только чуть-чуть изменяет свой код, не перемещает его и т.п.
Дело в том, что криптер (элементарнейший, но всеже) исправляет достаточное колличество инфы, и я не знаю, где точно... а хотя... да надобудет попробовать такой вариант...
Digitman (2004-02-12 09:14:00) [8]
> что такое регионы? это секции(section)?
нет, регионы это не секции
термин "секция" имеет отношение к формату PE-модуля, хранимого в файле .. различают несколько основных типов секций - секции кода, секции данных, секции стека ..на основании инф-ции о структуре и атрибутах той или иной секции системный загрузчик (при загрузке PE-модуля из файла в АП процесса) распределяет и инициализирует нужным образом блоки страниц фирт.памяти, именуемые в ран-тайм регионами.. кр.того, регионы формируются и при запросе программой (уже в ходе ее работы) вирт.памяти из "кучи"
т.е. понятие регион тесно связано с ран-тайм
размер региона всегда кратен размеру страницы (4кб)
все ВАП процесса состоит из регионов, число которых всегда > 1
> как мне их соединять воедино, чтобы получился рабочий ехе
никак.
тебе вообще для чего дамп понадобился ?
ты вознамерился сотворить из дампа исп.файл, чтобы при его запуске состояние вирт.памяти процеса в точности соответствовало моменту снятия дампа ? если так, то в общем случае ничего путного не выйдет, бросай эту затею ..
этот механизм реализован только в WinXP и называется он, кажется, hibernate .. вероятно, для XP существует какой-то соотв.набор WinAPI-ф-ций, с пом.которых можно как-то управлять hibernate-механизмом программно, но мне такие ф-ции не известны - попросту не интересовался никогда
TankMan (2004-02-11 19:33:00) [9]так...я вот чего хотел уточнить, что такое регионы? это секции(section)? или что-то другое? если это так, то как мне их соединять воедино, чтобы получился рабочий ехе?
Digitman (2004-02-11 17:46:00) [10]
> 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 callingprocess
а мы тут говорим отнюдь не об 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 17:31:00) [11]>>Digitman
На счет VirtualQueryEx - первый параметр мне понятен ( :) ), а вот начинася со второго проблема - какой именно адрес мне нужно указывать? - я получаю структуру типа MEMORY BASIC INFORMATION... но что в ней такого полезного?...
>>AKul
Мне нужен вариант 2... - вообще мне нужно взломать программу, а точнее сделать... (ну что-то типа универсального кряка), дело в том, что программа при запуске чуть-чуть изменяет свой код, и поэтому просто обычным способом байты изменить нельзя (точнее, почти, нельзя), т.е. для того чтобы заставить ее работать нормально, нужно сделать лоадер - а этот способ мне совсем не нравится... так что цель моя - написать программку, которая запустит процесс, дойдет до той точки, после которой все уже "расшифровалось" , "удалит" "дешефровщик" (чтобы потом еще раз уже "расшифрованный" файл еще раз нерашифровывать), изменит в памяти нужные байты, и сделает дамп...
Все это врпинципе уже достигнуто, кроме последнего :(... меня это и огорчает, мне дали ссылку на пример написания трейсера, там все ясно и понятно написано, но вот про дамп файла там ни слова :(...
Songoku (2004-02-11 13:40:00) [12]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!
AKul (2004-02-11 11:49:00) [13]
> 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'е.... и делаем дальше все что нужно....
Unax (2004-02-11 10:33:00) [14]2 Digitman
Только почему-то ф-я VirtualProtect терпит неудачу, даже если состояние страницы MEM_COMMIT??
Игорь Шевченко (2004-02-10 19:03:00) [15]TankMan © (10.02.04 18:12)
Очень хороший пример у Рихтера
Digitman (2004-02-10 18:37:00) [16]
> как именно эти функции использовать
давай по порядку ...
начинаем с VirtualQueryEx()
что непонятно ? конкретно ?
TankMan (2004-02-10 18:12:00) [17]>>vvcom
Нет, я конечно понимаю, что в РЕ можно найти все секции их размещение и все такое, но это если программа не запакована, а если она распаковывается в памяти, то что получится? или там указаны размеры секций с заранее предусмотренным местом для разжатых данных? и еще, ну прочитаю я эти все секции, а РЕ в новом файле мне откуда брать? или самому потом дописывать?
>>Digitman
ЭЭЭ...а пример не затруднительно будет выложить? А то я чего-то не пойму как именно эти функции использовать :(
Digitman (2004-02-10 08:15:00) [18]
> TankMan © (10.02.04 00:17) [8]
во всей этой петрушке ключевая ф-ция - VirtualQueryEx()
она как раз и позволяет определить наличие/размер/статус указанного региона в ВАП указанного процесса
циклический перебор регионов (в диапазоне адресов от 0 до 2ГБ) с пом.этой ф-ции дает инф-цию для работы ReadProcessmemory() в каждой итерации цикла .. требуемые атрибуты защиты страниц в каждом регионе (если их недостаточно для чтения) устанавливаются с пом. VirtualprotectEx
evvcom (2004-02-10 01:44:00) [19]
> а что я могу там узнать? (например?)
Там как раз и узнается, где размещается программа (точнее секции), какова их длина и многое другое.
TankMan (2004-02-10 00:17:00) [20]>>8ung
...хм.. этой процедуре нужно указывать адресс откуда читать... и в каких-же пределах нужно работать?...я даже не представляю...
>>Erazzer
а что я могу там узнать? (например?)