3PPC.net
Старый 24.10.2007, 12:00 #1
-QwertY- -QwertY- вне форума
Застенчивый
 
Регистрация: 23.06.2007
Сообщений: 18
Репутация: 1
-QwertY- -QwertY- вне форума
Застенчивый
 
Регистрация: 23.06.2007
Сообщений: 18
Устройство: нет кпк
Подгрузка своей dll резидентом в чужую программу.

Собственно интересует именно универсальный способ, так как неохото для всех операционок юзать кучу exe файлов отличающихся только способом внедрения. Для примера приведу пару исходников.

Вот так оное на WM2003 и WM2003SE можно сделать. Спасибо mamaich в своё время накопал оное.
Цитата:
Сообщение от код внедрения своей dll в чужой процесс
/*
typedef struct _CALLBACKINFO {
HANDLE hProc;
FARPROC pfn;
PVOID pvArg0;
} CALLBACKINFO;
typedef CALLBACKINFO *PCALLBACKINFO;

extern"C" DWORD PerformCallBack4(CALLBACKINFO *pcbi,...);
extern"C" LPVOID MapPtrToProcess(LPVOID lpv, HANDLE hProc);

...

HWND Hp=0;
do
{
Hp=FindWindow(L"Dialog",L"Phone");
if(!Hp)
Hp=FindWindow(L"Dialog",L"Телефон");
Sleep(100);
} while(Hp==0);
DWORD Pid;

GetWindowThreadProcessId(Hp,&Pid);
HANDLE Proc=OpenProcess(0,0,Pid);

void *Ptr=MapPtrToProcess(L"phonehook.dll",GetCurrentProcess());
CALLBACKINFO ci;
ci.hProc=Proc;
void *t=GetProcAddress(GetModuleHandle(L"coredll.dll"),L"LoadLibraryW");
ci.pfn=(FARPROC)MapPtrToProcess(t,Proc);
ci.pvArg0=Ptr;
PerformCallBack4(&ci);

CloseHandle(Proc);
Как видно тут используются неафишируемые функции. Ну да ладно. Идём далее.

Цитата:
Сообщение от Собственно код работающий на некоторых WM5 устройствах, на некоторых других подругому. Кому надо - тот разберётся.

extern "C"
{
BOOL SetKMode(BOOL fMode);
DWORD SetProcPermissions(DWORD);

HLOCAL LocalAllocInProcess(DWORD, DWORD, HPROCESS);
VOID LocalFreeInProcess(HLOCAL, HPROCESS);

LPVOID MapPtrToProcess(LPVOID lpv, HANDLE hProc);
}

typedef unsigned long AWORD;

AWORD scode[] = {
0xE3510001,
0x159FF004,
0x028F0008,
0x059FF000,
0x0 ,
0x0 ,
0x00680070,
0x006E006F,
0x00680065,
0x006F006F,
0x002E006B,
0x006C0064,
0x0000006C
};

...

HWND Hp=0;
do
{
Hp=FindWindow(L"Dialog",L"Phone");
if(!Hp)
Hp=FindWindow(L"Dialog",L"Телефон");
Sleep(100);
} while(Hp==0);

BOOL kmode = SetKMode(TRUE);
DWORD perms = SetProcPermissions(0xFFFFFFFF);

DWORD Pid;

GetWindowThreadProcessId(Hp,&Pid);
HANDLE Proc=OpenProcess(0,0,Pid);

HMODULE coredll = GetModuleHandle(L"coredll.dll");
AWORD * trap = (AWORD *)LocalAllocInProcess(LMEM_FIXED, (64 * sizeof(AWORD)) ,(void*) Pid);

memcpy(trap, scode, sizeof(scode));
trap[5] = (AWORD)MapPtrToProcess(GetProcAddress(coredll, L"LoadLibraryW"), (void*)Pid);
trap[4] = (AWORD)SetWindowLong(Hp, GWL_WNDPROC, (long)trap);
SendMessage(Hp, WM_CREATE, 0, 0);

SetWindowLong(Hp, GWL_WNDPROC, (long)trap[4]);
LocalFreeInProcess(trap, (void*)Pid);

SetProcPermissions(perms);
SetKMode(kmode);

CloseHandle(Proc);
Для WM6 почти так-же, но есть тоже свои подводные камни. Приводить не буду, в связи с ненадобностью оного.

Так вот меня интересует более универсальный способ. Естьли такой вообще? Если нету - давайте искать. Тема уж больно интересна...
-QwertY- вне форума   Ответить с цитированием Цитировать выделенное
Старый 05.03.2008, 15:55 #2
Аватар для Getorix
Getorix Getorix вне форума
Застенчивый
 
Регистрация: 05.03.2008
Сообщений: 15
Репутация: 2
Getorix Getorix вне форума
Застенчивый
Аватар для Getorix
 
Регистрация: 05.03.2008
Сообщений: 15
Репутация: 2
Устройство: Qtek S100
-QwertY-,
тоже копал этот вопрос, но кажись универсального способа не найти, микрософт от версии к версии банит функции этого уровня (неафишируемые) и добавляет какие-то новые.

Когда у меня встала проблема работы без пересборки со структурами ядра для wm2003 и wm5 в DisARM я сварганил универсальный класс который пользует нужную структуру в зависимости от версии винды а само приложение уже пользует промежуточный универсальный класс.

Собсно думаю тут можно пойти тем же путем, сделать класс с некоторым количеством рабочих способов для разных версий винды и некий универсальный интерфейс снаружи.

Вобщем, держи мну в курсе разработки, мне эта тема тож интересна.
__________________
[SIGPIC][/SIGPIC]

Последний раз редактировалось Getorix; 06.03.2008 в 06:38.
Getorix вне форума   Ответить с цитированием Цитировать выделенное
Старый 13.03.2008, 15:52 #3
GreateVK GreateVK вне форума
Новичок
 
Регистрация: 18.12.2007
Сообщений: 1
Репутация: 0
GreateVK GreateVK вне форума
Новичок
 
Регистрация: 18.12.2007
Сообщений: 1
Репутация: 0
Устройство: нет кпк
нафиг?

PerformCallBack4 всегда везде работает в системах до Windows CE 5.0 включая.
конечно если правильно пользоваться )

используя PerformCallBack4 нельзя загружать dll в NK.EXE, для загрузки туда следует использовать LoadKernelLibrary или LoadIntChainHandler.
dll загружаемая в NK не может иметь импортов.
GreateVK вне форума   Ответить с цитированием Цитировать выделенное
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ищу программу! olimo Программы для Symbian OS 111 24.05.2012 19:52
Миф о сложности WinAPI или как написать программу своими руками tz-lom Программирование под Windows Mobile 12 12.04.2011 20:09
Как удалить программу из прошивки ivon11 Перепрошивка HTC Artemis & HTC Love 9 15.11.2009 16:37
Нужно написать программу gorodok123 Программирование под Windows Mobile 2 25.08.2009 06:02
За бортом по своей воле Merlin Историко-документальная литература 0 18.05.2007 20:41

 


Текущее время: 01:40. Часовой пояс GMT +3.


Powered by vBulletin®
Copyright ©2000 - 2017, vBulletin Solutions, Inc.