· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Интересная фишка(?баг?) в 9х

. 1 . 2 . >>

Посл.отвђт Сообщен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(ну в смысле не дебаг, а просто релокэйшены разрешить).

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.072