![]() |
eXeL@B —› Вопросы новичков —› Пишу dll инjection. Есть Вопросы. |
Посл.ответ | Сообщение |
|
Создано: 01 июня 2007 11:30 · Личное сообщение · #1 Вопрос 1: Допустим я загружаю dll все дела, потом из нескольких мест моей проги надо вызывать разные функции этой dll типа func1 func2 и т.п. Непонятно одно, dll грузиться все время по разным адресам т.е чтобы адреса функций не портились их надо как-то в таблицу иморта проги прописать чтоли? 2. Пишу на visual c++ пользуясь __asm вставка в vс++ такой код: [code] #include "stdafx.h" DWORD num1 = 0x10; BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } __declspec(dllexport) void SetNumber() { __asm { cmp ecx, num1 je a cmp ecx,0x12D retn a: mov eax, 0x100 retn 4 } } [/code] В закомпиленом виде он так выглядит: [code] 1000100C >/$ 55 PUSH EBP 1000100D |. 8BEC MOV EBP,ESP 1000100F |. 53 PUSH EBX 10001010 |. 56 PUSH ESI 10001011 |. 57 PUSH EDI 10001012 |. 3B0D 30500010 CMP ECX,DWORD PTR [10005030] 10001018 |. 74 07 JE SHORT rm3944.10001021 1000101A |. 81F9 2D010000 CMP ECX,12D 10001020 |. C3 RETN 10001021 |> B8 00010000 MOV EAX,100 10001026 \. C2 0400 RETN 4 10001029 . 5F POP EDI 1000102A . 5E POP ESI 1000102B . 5B POP EBX 1000102C . 5D POP EBP 1000102D . C3 RETN [/code] Т.е сохраняются регистры в стек, потом идет мой код, но они не восстанавливаются, точнее на место popов регистров я не попадаю никогда. В чем ошибка? 3. Я первый раз dll пишу. Поэтому не понял мой код малюсенький а dll 28kb (release). Откеда там столько мусора и нафиг он нужен? ![]() |
|
Создано: 01 июня 2007 16:14 · Поправил: DrFits · Личное сообщение · #2 10001020 |. C3 RETN и 10001026 \. C2 0400 RETN 4 - это выход из функции, т.е. надо без этого сделать функцию 10001026 \. C2 0400 RETN 4 - это неверная впринципе запись и программа упадёт, надо ставить просто RET, Я бы написал так __asm { cmp ecx, num1 je a cmp ecx,0x12D JMP END_F a: mov eax, 0x100 END_F: } А мусор чтоб урезать - надо компилятору инструкции писать. Например # pragma comment(linker, "/ENTRY:xDllEntry") Подробнее читай в MSDN ----- Само плывет в pуки только то, что не тонет. ![]() |
|
Создано: 01 июня 2007 16:27 · Личное сообщение · #3 Ну Retn 4 у меня же не просто так стоит, просто там функция напр func2 со switchем типа 0055FEEB > \B8 F4010000 MOV EAX,100 ; Cases 4,7,D of switch 0055FED8 0055FEF0 . C2 0400 RETN 4 0055FEF3 > B8 E8030000 MOV EAX,200 ; Cases 5,8,10,12 of switch 0055FED8 0055FEF8 . C2 0400 RETN 4 0055FEFB > B8 DC050000 MOV EAX,300 ; Cases 6,9,11,13 of switch 0055FED8 0055FF00 . C2 0400 RETN 4 func1->func2->моя функция, т.е через retn 4 мы просто выпрыгиваем из моей сразу в func1 минуя func2. Я так понял в __asm вставке принципиально не должно быть returnoв ? Странно это. ![]() |
|
Создано: 01 июня 2007 16:37 · Личное сообщение · #4 |
|
Создано: 03 июня 2007 10:13 · Личное сообщение · #5 Народ, главный вопрос осталься без ответа. Нежоли никто не знает как добавить функции своей dll,ки в основную прогу, ну что бы твоя dll грузилась сразу же без loadlibrarya и чтобы в таблице иморта адреса всех функций своей dllки правились в зависимости от области куда она загрузилась так же как они правятся для всех api и функций dll которые изначально прога использует. Можно самому черех LoadlibrayA а потом getprocadress и перезаписать где надо но это не эстетично! Где спецы по таблицам импорта и pe форматам? АУ. ![]() |
|
Создано: 03 июня 2007 12:00 · Личное сообщение · #6 |
|
Создано: 04 июня 2007 14:17 · Личное сообщение · #7 Ага, берешь и добавляешь... ![]() 1. LordPE - добавлять можно только по одной и нужно полностью писать название функции, не просто func1 а ?func1@@YXXZ... 2. PeTools - вобще не горит опция контекстного меню add imports. Ни на одном файле не горит. 3. Pe_Stud/IIKing - после добавления функций Olly почему-то перестает находить собственные функции EXEшника (Library функции)... Не везет Ж) Кто-нибудь по поводу 2. и 3. что-нибудь знает? ![]() |
|
Создано: 04 июня 2007 14:23 · Личное сообщение · #8 |
|
Создано: 04 июня 2007 14:57 · Личное сообщение · #9 На счёт 2 DrFits уже всё сказал. На счёт 3 - ты что хочешь? Готовый код увидеть? Если поверхностно - берёшь таблицы импорта - и перетаскиваешь их куда-нибудь, где посвободнее. Остальные записи(имена ф-ий, библиотек и т.д.) трогать не надо. Так же не надо менять ничего в самих таблицах. Потом добавляешь ещё 1 запись о своей dll. Формат этой записи - в доках по пе. Есть и на русском. Потом меняешь указатель на таблицу импорта в заголовке. ![]() |
|
Создано: 04 июня 2007 15:37 · Личное сообщение · #10 |
|
Создано: 05 июня 2007 15:32 · Личное сообщение · #11 Опишу последнюю проблему подробнее. В проге есть функции с именами (видимо с каким-то ключом скомпилина чтобы имена остались), в Olly эти функции видно нажав CTRL+N среди остальных, тип у них Library. После того как я с помощью любой проги peLord/PeStud/IIDKing добавляю в прогу в таблицу импорта свою dll и соответствующие функции то Olly перестает находить эти Library функции, т.е жмешь CTRL+N а там только Import функции, хотя сами функции конечно остались и их имена находятся в exe hex редактором. У кого-нибудь есть хоть малейшая догадка или предположение с чем может быть связан этот БАГ? Имена Library функций необходимо сохранить в окне ctrl+n т.к с прогой еще очень долго работать.. ![]() |
![]() |
eXeL@B —› Вопросы новичков —› Пишу dll инjection. Есть Вопросы. |