Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.138.138.144] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Имеется ехе, который (по данным программы PE Explorer) может экспортировать функции в формате: (пример) Undecorated C++ Function:
void __cdecl AlwaysActiveOn(void). Возможно ли превратить этот EXE в DLL? что нужно для этого и как блокировать выполнение его. По моим догадкам эта программа содержит в себе библиотеку и написана скорее всего на .net |
Сообщ.
#2
,
|
|
|
А с какой целью?
если ехе на .нет то проблематично преобразовать его в длл, если обычный(не байткод), то необходимо чтобы у него были релоки |
Сообщ.
#3
,
|
|
|
Вобщем так: есть несколько демо написанное на DarkGDK, многие из них имеют одинаковую длину, и внутреннее сходство, по описанию это GDK используется с MSVC и .NET. Вот и думаю, можно ли выудить из exe эту библиотеку, ведь exe выдает все команды на экспорт. Насколько мне известно dll и exe не сильно отличаются. Пример как пишется:
#include "DarkGDK.h" void DarkGDK ( void ) { // set sync on and sync rate to 60 frames per second dbSyncOn ( ); dbSyncRate ( 60 ); // make a cube dbMakeObjectCube ( 1, 10 ); // loop until the escape key is pressed while ( !dbEscapeKey ( ) ) { // update screen dbSync ( ); } } все эти функции идут на экспорт( только без приставок db). Знаком с асмом а вот в структуре РЕ плохо разбираюсь. |
Сообщ.
#4
,
|
|
|
RA9YTJ,секция релоков есть?
Прогони через ИДА например, выдили все функции, всего сокрее они будут находится в одном блоке, потом можешь попробовать собрать из них дллку |
Сообщ.
#5
,
|
|
|
Файл Example1.exe состоит из 4 секций:
.text addr 0401000 похоже сами коды функций и основной цикл .rdata addr 0580000 там есть немного строк с сообщениями об ошибках и какие-то данные .data addr 05b2000 тоже есть текст и какие-то данные много нулей .rsrc adrr a0c0000 ресурсы (эконки) какая из них является секцией реалоков?(а что это такое?) ИДА диссамблирует только начальную малую часть и к концу часть, видимо из-за простого примера большая часть функций не вызываются. |
Сообщ.
#6
,
|
|
|
RA9YTJ, прочитай пожалуйста для начала описание PE формата, и некоторые вопросы отпадут сами.
Дока вроде где то валялась на исходниках, или вот ссылка с васма http://www.wasm.ru/docs/2/pe_docs.zip |
Сообщ.
#7
,
|
|
|
Еще вопрос:
Если в этом ехе исполняемый цикл забить нопами и вписать например бесконечный цикл с sleep()с огромным числом. Запустить его, а другой программой находить в этом процессе функции по адресу и запускать их. Так возможно? |
Сообщ.
#8
,
|
|
|
Были бы были релоки, тогда было бы все неплохо, не надо было бы ничего и преобразовывать, работал бы как с DLL - загружаешь с помошью LoadLibrary, находишь адреса функций с помощью GetProcAddress. Этим двум функциям не важно, exe или dll является исполняемый модуль (разве что в случае exe не вызывается DllMain, т.к. его там нет). Ну или импорт бы использовал...
А т.к. их нет - в таком случае или выдирай код дизассемблером, или еще что-нибудь придумай. Но только ИМХО извращение какое-то - забивание нопами и sleep. Куда проще просто заморозить основной поток. А потом что-нибудь придумать несложно - можешь выделить область памяти в этом процессе с помощью VirtualAllocEx, внедрить туда свой код и необходимые структуры данных (если функция принимает какие-либо указатели на структуры данных) с помощью WriteProcessMemory. Создать замороженный поток с помощью CreateRemoteThread, использовать GetThreadContext, SetThreadContext и WriteProcessMemory для записи аргументов функции и адреса возврата (внедренный код) в стек потока и установки правильных значений регистров (при этом eip установить на начало вызываемой функции). Сделать поток активным. После того, как функция отработает, выполняется ret на твой внедренный код, который в свою очередь сохраняет возвращенные данные (например, значение регистра eax) и убивает поток. При этом в основной программе используется WaitForSingleObject для синхронизации. После этого ты считываешь данные, возвращенные функцией и сохраненные твоим кодом, из адресного пространства этого процесса с помощью ReadProcessMemory. Если необходимо, используешь VirtualFreeEx чтобы очистить память в другом процессе и т.п. Ну или можно не внедрять код, а создать процесс с флагом DEBUG_PROCESS, записать в стек потока заведомо неверный адрес возврата, к примеру, нулевой, и отловить при возврате из функции исключение. Может быть, это и проще будет. Возможностей хватает, в принципе, было бы желание... |
Сообщ.
#9
,
|
|
|
RA9YTJ, возможно
можно ещё оставить место под тот ехе файл в своём адресном пространстве, догрузить его, заполная таблицу импорта, и выполнять любые функции из него:) |
Сообщ.
#10
,
|
|
|
Цитата ProgramMan @ ... оставить место под тот ехе файл в своём адресном пространстве, догрузить его, заполная таблицу импорта, и выполнять любые функции из него:) нельзя ли чуть подробнее описать, как это все сделать? хотя бы какие функции ипользуются? заранее спасибо. l1l1l1 |
Сообщ.
#11
,
|
|
|
Сообщ.
#12
,
|
|
|
Цитата ProgramMan @ Пишем простейший загрузчик PE файлов видимо это именно то, что мне нужно. постараюсь разобраться. большое спасибо! |
Сообщ.
#13
,
|
|
|
Что бы ЕХЕ превратить в ДЛЛ - единственное, что надо сделать - заменить в
FileHeader поле Characteristics на соответствуещее длл. И добавить релоки, но тут уже смотря что нужно будет делать и какой EXE-файл... |
Сообщ.
#14
,
|
|
|
Throne, релоков то нет ) читай выше
Это сообщение отправлено Нотифером |
Сообщ.
#15
,
|
|
|
Цитата Throne @ Что бы ЕХЕ превратить в ДЛЛ - единственное, что надо сделать - заменить в FileHeader поле Characteristics на соответствуещее длл. И добавить релоки, но тут уже смотря что нужно будет делать и какой EXE-файл... А как поведет себя файл с точки зрения нормального ехе при замене этого поля? Вообще возможно использовать файл одновременно и как ехе и как длл? в смысле не в ущерб ни одному и ни другому. Столкнулся с похожей задачей, делаю ехе с релоками, подгружаю как длл, определяю нормально адрес функции, но в самой функции адреса не поправленные, без смещений, получаю ошибку при выполнении. |