Сейчас на форуме: hgdagon (+5 невидимых)

 eXeL@B —› Программирование —› Как правильно вызвать из чужой проги функцию из своей ДЛЛ
<< . 1 . 2 .
Посл.ответ Сообщение

Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 31 июля 2007 18:53 · Поправил: rmzvoid
· Личное сообщение · #1

Начал осваивать увеличение функциональности программы, надо вобщем пропатчить несколько переменных и вставить пару хуков в прогу. Начал с простого, написал простую прогу:

#include <stdio.h>

int i = 1;
int j = 2;
int k = 3;

int main()
{
k = i + j;
printf("%i",k);
return 0;
}


эту прогу и буду патчить

затем написал ДЛЛ:

// DLL.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include <stdio.h>

#define DllExport __declspec( dllexport )

void Hello();

DllExport BOOL WINAPI DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH:
{
DWORD dwProcessId = GetCurrentProcessId();
HANDLE hMainInst = OpenProcess(PROCESS_ALL_ACCESS,NULL,dwProcessId);
DWORD oldProtect = NULL;


if (!hMainInst)
{
MessageBoxA(NULL,"OpenProcess failed. Error Code: " + GetLastError(),"DLL",MB_OK);
}
else
{
if (VirtualProtect((LPVOID)(0x00401018), 6, PAGE_EXECUTE_READWRITE, &oldProtect)!=0)
{
memcpy((BYTE *)(0x0040101A), Hello, sizeof(DWORD));
// MessageBoxA(NULL,"Changed variable","DLL",MB_OK);
}
else
MessageBoxA(NULL,"Failed to change variable","DLL",MB_OK);
}

}
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
default:
break;
}

return TRUE;
}


void Hello()
{
printf("Hello from DLL\n");
}


прога падает.

Кусок Проги дизасеблерованый:

.text:00401000 _main proc near ; CODE XREF: start+13Ep
.text:00401000 mov eax, dword_403010
.text:00401005 mov ecx, dword_403014
.text:0040100B add eax, ecx
.text:0040100D push eax
.text:0040100E push offset unk_40207C
.text:00401013 mov dword_403018, eax
.text:00401018 call ds:printf
.text:0040101E add esp, 8
.text:00401021 xor eax, eax
.text:00401023 retn
.text:00401023 _main endp


после пропатчивания кода моей ДЛЛ-кой:

00401000 mov eax,dword ptr ds:[00403010h]
00401005 mov ecx,dword ptr ds:[00403014h]
0040100B add eax,ecx
0040100D push eax
0040100E push 40207Ch
00401013 mov dword ptr ds:[00403018h],eax
00401018 call dword ptr ds:[00812C68h]
0040101E add esp,8
00401021 xor eax,eax
00401023 ret


до пропатчивания ИДА показывает что принтф находица тут:
.rdata:00402050 printf dd ? ; DATA XREF: _main+18r

откуда береца адрес 00812C68h и почему программа крешится, судя по дебагеру адрес 00812C68h указывает кудато далеко и совсем не в ту степь

Дизасемблируя ДЛЛ посмотрел что адрес Hello() = 0x10001000

Пропатчивание переменных получается на ура, а вот call не могу




Ранг: 120.9 (ветеран), 5thx
Активность: 0.080
Статус: Участник
Programmer and reverser

Создано: 01 августа 2007 12:09
· Личное сообщение · #2

sotona пишет:
как заставляешь чужую прогу загрузить твою DLL ?

Как вариант - добавить секцию, и в ней загрузить либу, но тогда в нее можно и остальные функции дописать)

Кстати, почитай М. П. ЛЮБУШКИН "Hook Development Kit". Там очень хорошо написано про хуки и про внедрение DLL в чужое адресное пространство.

-----
Уважайте других и пишите грамотно.




Ранг: 51.0 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 02 августа 2007 08:28
· Личное сообщение · #3

Executioner пишет:
Кстати, почитай М. П. ЛЮБУШКИН "Hook Development Kit". Там очень хорошо написано про хуки и про внедрение DLL в чужое адресное пространство.

неинтересно. тема-то тривиальная на самом деле.




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 02 августа 2007 12:29
· Личное сообщение · #4

sotona пишет:
неинтересно. тема-то тривиальная на самом деле.


пускай почитает =) для общего развития, знания лишними не бывают...

-----
[nice coder and reverser]





Ранг: 120.9 (ветеран), 5thx
Активность: 0.080
Статус: Участник
Programmer and reverser

Создано: 02 августа 2007 13:20
· Личное сообщение · #5

Hellspawn пишет:
для общего развития, знания лишними не бывают...

+1
Может тебе не так это интересно, а мне было интересно почитать даже тогда, когда я все это и так уже знаю.

-----
Уважайте других и пишите грамотно.



<< . 1 . 2 .
 eXeL@B —› Программирование —› Как правильно вызвать из чужой проги функцию из своей ДЛЛ
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати