|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 17, 2003 11:44:27 Я тут на С написал интересный код, который позволяет установить локальный хук без использования библиотек. Но когда я попытался переписать его на masm, то ничего не получилось :(. Вот код на асме:
include c:\masm32\include\windows.inc ; Много для чего :)
include c:\masm32\include\user32.inc ; Для MessageBox()'ов
include c:\masm32\include\kernel32.inc ; Тоже много для чего :)))
; include c:\masm32\include\seh.inc ; Structured Exception Handler
include c:\masm32\macros\macros.asm ; Макросы
includelib c:\masm32\include\user32.lib
includelib c:\masm32\include\kernel32.lib
.data
HookH dd 0
MsgProc PROTO : DWORD, : WPARAM, : LPARAM
.code
MsgProc proc STDCALL USES ebx esi edi code: DWORD, wparam: WPARAM, lparam: LPARAM
invoke MessageBox,0,SADD("df"),SADD("fgd"),MB_OK
.if code==HC_ACTION
assume edi: PTR MSG
lea edi, lparam
.if [edi].message==WM_USER+50
invoke MessageBox, 0, SADD("GOTCHA!!!"), SADD("That's Works"), MB_OK
.endif
assume edi: nothing
.endif
invoke CallNextHookEx, HookH, code, wparam, lparam
retn 0Ch
MsgProc endp
start:
main proc
local hWind : HANDLE
local ThreadID: DWORD
invoke FindWindow, NULL, SADD("EFDOK")
mov hWind, eax
.if hWind==NULL
invoke MessageBox, 0, SADD("Can't find window"), SADD("Injecing Error"), MB_OK
.endif
invoke GetWindowThreadProcessId, hWind, NULL
mov ThreadID, eax
.if ThreadID==NULL
invoke MessageBox, 0, SADD("Can't get ThreadID"), SADD("Injecing Error"), MB_OK
.endif
invoke GetModuleHandle, NULL
mov ebx, eax
invoke SetWindowsHookEx, WH_GETMESSAGE, ADDR MsgProc, ebx, ThreadID
mov HookH, eax
.if HookH==NULL
invoke MessageBox, 0, SADD("Can't set hook"), SADD("Injecing Error"), MB_OK
.endif
invoke PostMessage, hWind, WM_USER+50, 0, 0
invoke Sleep, 10
invoke UnhookWindowsHookEx, HookH
invoke ExitProcess, 0
ret
main endp
end start
Вот код на С:
#include <windows.h>
HHOOK HookH;
long __stdcall MsgProc(int code,UINT wParam, long lParam)
{
if (code==HC_ACTION)
{
if(((MSG*)lParam)->message==WM_USER+50)
{
MessageBox(0,"GOTCHA!!!","Thats works",MB_OK);
}
}
return CallNextHookEx(HookH, code, wParam, lParam);
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HWND HandleOfBrows = FindWindow(NULL, "EFDOK");
DWORD ThreadOfEx = GetWindowThreadProcessId(HandleOfBrows,NULL);
HookH = SetWindowsHookEx(WH_GETMESSAGE,&MsgProc,GetModuleHandle(0),ThreadOfEx);
PostMessage(HandleOfBrows,WM_USER+50,0,0);
Sleep(10);
UnhookWindowsHookEx(HookH);
return 0;
}
Почему не работает? |
|
|
Дата: Авг 17, 2003 16:26:49 А твой сишный код тоже не может работать, т.к. ты пытаешься поставить локальный хук на поток другого процесса! В твоем процессе ведь нет окна "EFDOK". Т.е. хук срабатывает в удаленом процессе, а хуковая функция находится в твоем. Так что "без использования библиотек" тут не обойтись. ЗЫ: и вот еще: lea edi, lparam mov edi, lparam |
|
|
Дата: Авг 17, 2003 18:32:18 Дык в том-то и баг, что РАБОТАЕТ!!! Да, я вот че подумал - чушь может быть, но может это зависит от того, что мое приложение на асме занимает меньше 4Кб, то бишь не может быть адресованно? ЗЫ: Я так и знал :). Но все равно не работает :( |
|
|
Дата: Авг 17, 2003 19:23:16 Да, я вот че подумал - чушь может быть, но может это зависит от того, что мое приложение на асме занимает меньше 4Кб, то бишь не может быть адресованно? Неа, пробовал db 4000 dup(90h) добавлять - все равно не пашет. Да, вот еще что - почему-то на С работает только debug версия, хотя я может чего-нибудь напутал в настройках компилятора, но все же... может попробовать добавить debug информацию в асм код... |
|
|
Дата: Авг 18, 2003 13:18:44 · Поправил: Four-F [ R4DX: Дык в том-то и баг, что РАБОТАЕТ!!! ] Да не может оно работать! Щас у мя сишного компилера нету - завтра попробую. Только чтоб я зря не парился, скажи, это полный исходный код? И окно "EFDOK", которое ты ищешь в другом процессе. Правильно? Возможно будет интересно: Хуки в Win32 |
|
|
Дата: Авг 18, 2003 14:15:00 · Поправил: R4DX 2Four-F: !!!ПОЛУЧИЛОСЬ!!! :). Надо было добавить отладочную информацию. См. полный исходник на асме:
; ###################################################################### ###########################
; ############################ Injecting code bug 9x###################################################
; ###################################################################### ###########################
; ############################ About ###############################################################
; ###################################################################### ###########################
; Баг в Win9x(Я тестировал в 98 и ME), позволяющий выполнять произвольный код
; "от лица" любого приложения без использования библиотек. Выполяется только при
; наличии отладочной инфы, поэтому ОБЯЗАТЕЛЬНО в параметрах ml указывать /Zd(а желательно еще и /Zi /Zf
; с ними вроде стабильней, а размер у ехе все тот же), а в параметрах link указывать /DEBUG.
; Обратите внимание на размер - он непомерно большой(у меня 12,3 Кб).
; Компилятор - тестировал на MASM v8.0
; Компилировать: вот фаил MakeIt.bat:
;--------------------------------------- Start of MakeIt.bat ----------------------------------
; @echo off
;
; if exist 1.obj del 1.obj
; if exist 1.exe del 1.exe
;
; c:\masm32\bin\ml /Zd /c /coff /nologo 1.asm
; c:\masm32\bin\Link /DEBUG /SUBSYSTEM:WINDOWS /MERGE:.rdata=.text 1.obj
;
; dir 1.*
;
; pause
;---------------------------------------- End of MakeIt.bat -----------------------------------
; ###################################################################### ###########################
; ############################ Copyrighted by R4D][, team [HALT] #######################################
; ###################################################################### ###########################
; ###################################################################### ###########################
; ############################ Directives ############################################################
; ###################################################################### ###########################
.386 ; Используем команды 80386 процессора
.model flat, stdcall ; плоская модель памяти
option casemap :none ; Убираем чувствительность к регистру
; ###################################################################### ###########################
; ###################################################################### ###########################
; ############################ Includes and Libs #####################################################
; ###################################################################### ###########################
include c:\masm32\include\windows.inc ; Много для чего :)
include c:\masm32\include\user32.inc ; Для MessageBox()'ов
include c:\masm32\include\kernel32.inc ; Тоже много для чего :)))
; include c:\masm32\include\seh.inc ; Structured Exception Handler
include c:\masm32\macros\macros.asm ; Макросы
; include c:\masm32\include\debug.inc
includelib c:\masm32\include\user32.lib
includelib c:\masm32\include\kernel32.lib
; includelib c:\masm32\lib\debug.lib
; ###################################################################### ###########################
; ###################################################################### ###########################
; ############################ Const segment #######################################################
; ###################################################################### ###########################
; ###################################################################### ###########################
; ###################################################################### ###########################
; ############################ Data segment ########################################################
; ###################################################################### ###########################
.data
HookH dd 0
; ###################################################################### ###########################
; ###################################################################### ###########################
; ############################ Data? segment #######################################################
; ###################################################################### ###########################
; ###################################################################### ###########################
; ###################################################################### ###########################
; ############################ Func Prototypes ######################################################
; ###################################################################### ###########################
MsgProc PROTO : DWORD, : WPARAM, : LPARAM
; ###################################################################### ###########################
; ###################################################################### ###########################
; ############################ Macroses ############################################################
; ###################################################################### ###########################
; ###################################################################### ###########################
; ###################################################################### ###########################
; ############################ Code segment ########################################################
; ###################################################################### ###########################
.code
MsgProc proc STDCALL USES ebx esi edi code: DWORD, wparam: WPARAM, lparam: LPARAM
.if code==HC_ACTION
assume edi: PTR MSG
mov edi, lparam
.if [edi].message==WM_USER+50
invoke MessageBox, 0, SADD("GOTCHA!!!"), SADD("That's Works"), MB_OK
.endif
assume edi: nothing
.endif
invoke CallNextHookEx, HookH, code, wparam, lparam
ret
MsgProc endp
start:
main proc
local hWind : HANDLE
local ThreadID: DWORD
invoke FindWindow, NULL, SADD("EFDOK")
mov hWind, eax
.if hWind==NULL
invoke MessageBox, 0, SADD("Can't find window"), SADD("Injecing Error"), MB_OK
ret
.endif
invoke GetWindowThreadProcessId, hWind, NULL
mov ThreadID, eax
.if ThreadID==NULL
invoke MessageBox, 0, SADD("Can't get ThreadID"), SADD("Injecing Error"), MB_OK
ret
.endif
invoke GetModuleHandle, NULL
mov ebx, eax
invoke SetWindowsHookEx, WH_GETMESSAGE, ADDR MsgProc, ebx, ThreadID
mov HookH, eax
.if HookH==NULL
invoke MessageBox, 0, SADD("Can't set hook"), SADD("Injecing Error"), MB_OK
ret
.endif
invoke PostMessage, hWind, WM_USER+50, 0, 0
invoke Sleep, 10
invoke UnhookWindowsHookEx, HookH
invoke ExitProcess, 0
ret
main endp
end start
; #################################################################################################
Да, EFDOK - это окно explorer'a(я сделал просто RB->Новая папка и назвал ее EFDOK, потом открыл в новом окне). Другое дело в том, что я так и не понял почему все это счастье работает... :(. |
|
|
Дата: Авг 18, 2003 16:04:53 Хмм... Под NT, как и полагается, не работает. 9х щас под руками нет - может завтра попробую. |
|
|
Дата: Авг 20, 2003 12:40:39 · Поправил: Four-F Да. Дебужная версия действительно работает, а почему мне, к сожалению, не интересно разбираться. Похоже, что это баг или недокументированная фича. Попробуй по сети порыться - вряд ли ты ее первый нашел. |
|
|
Дата: Авг 22, 2003 14:06:59 Я допер почему оно работает. Все очень просто и дебужная сборка тут как таковая ни при чем. Если екзешник собирается как дебаг, то кроме всего прочего в него добавляются релоки. Это собственно и есть ответ на вопрос. Если подробнее, то... Когда срабатывает хук в удаленном процессе, система должна загрузить туда модуль, в котором находится хуковая функция. Т.к. в этом процессе стандартный адрес 400000h уже занят, то модулю с хуковой функцией нужно делать релок. Если это длл, то релоки там есть по умолчанию. Если екзе, то релоков нет. Если их добавить принудительно, прописав линкеру /FIXED:NO, и собрав даже релиз версию, то хук тоже будет работать под 9х. Но самое удивительное, что работает он и в 2000 (после некоторых манипуляций). Манипуляции заключаются в том, чтобы сделать хуковую функцию независимой от базы. Независимость нужна потому, что при загрузке модуля в похученный процесс релоки не делаются. Парадокс! для того чтобы заставить систему загрузить екзе в удаленный процесс, нужны релоки, а сами релоки при этом не используются :-). В общем, скрестил я код, который выше и kernel by Y0da. То что получилось в аттаче. У меня под 2000 прекрасно работает - натравливать на калькулятор. Под 98 я его еще не проверял, но должен работать. Что это: баг или фича, я так и не понял. Если баг, то тогда должна вызываться точка входа екзе в удаленном процессе как если бы это была DllMain, но этого не происходит. Если это фича, то тогда почему не делаются релоки? Код довольно грязный, сорри, не мой стиль, но детально разбираться мне в этом неохота, т.к. не ясен практический смысл. Кому интересно копайте дальше. 1147811758__HookCalc.zip |
|
|
Дата: Авг 23, 2003 11:29:00 · Поправил: R4DX Вот оно что 8)!!! Довольно интересно, спасибо, что копался в этом :). но детально разбираться мне в этом неохота Ты и так уже очень много накопал, за что тебе огромное спасибо! т.к. не ясен практический смысл Енто ты зря - возможность выполнить свой код в другом процессе при этом не использую никаких dll с ранних лет будоражит умы троянописателей :). |
|
|
Дата: Авг 23, 2003 17:04:34 [ rst: ...с ранних лет будоражит умы троянописателей :). ] Ну да, для любителей насекомых оно наверное пригодится. |
|
|
Дата: Авг 23, 2003 17:22:26 Не знаю как оно у вас работает, у меня не работает ни один пример, тот что в аттаче у Four-F пишет "программа выполнила недопустимую ошибку". У меня win98.. |
|
|
Дата: Авг 23, 2003 18:43:54 Тот код, что в посте (второй) у меня под 98 SE работает. А мой приатаченный под 98 я еще не проверял, но под 2000 работает. Под ХР тоже работает, но иногда как-то странно - после второго запуска HookCalc.exe. |
|
|
Дата: Авг 23, 2003 19:08:09 [ Four-F: include \masm32\macros\Strings.mac] А де воно? Де його взять? |
|
|
Дата: Авг 23, 2003 19:53:09 Four-F Да, у меня такие же глюки, как ты говорил в ХР, а под МЕ не пашет. Asterix А что, у меня мой пример(Дата: Авг 18, 2003 14:15:00 · Поправил: R4DX) под МЕ пашет вроде нормально. Хотя там и /DEBUG, но зато работает. Кстати, надо бы попробовать подкорректировать Makeit.bat, как советовал Four-F(ну в смысле не дебаг, а просто релокэйшены разрешить). |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.072 |