Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2008, 22:01   #1
Д'якон
Форумчанин
 
Регистрация: 05.12.2007
Сообщений: 236
По умолчанию Thread32First

Пишу эмулятор для HASPа. Подгружаю свою библиотеку в процесс, по имени окна и запускаю ее через CreateRemoteThread. Далее хочу выполнить перехват АПИ методом сплайсинга. Но перед этим нужно остановить все треды процесса жертвы, кроме того в котором выполняется библиотека. Решил проверить действие библиотеки остановив все треды и тем самым убив процесс, но через Thread32First не нахожу ни одного треда. Подскажите пожалуйста.

Вот код
Код:
.486P
.model flat, stdcall
option casemap:none

StopThread proto

include c:\masm32\include\windows.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc
include c:\masm32\include\advapi32.inc
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
includelib c:\masm32\lib\advapi32.lib

.data
	CaptionError db 'Error',0
	TextErrorTool db 'Error CreateToolhelp32Snapshot',0
	
.data?
	idCurProc dd ?
	idCurThread dd ?
	hSnap dd ?
	ThreadEntry THREADENTRY32 <>
	hThread dd ?
.code

DllEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
    mov  eax,TRUE      
    ret
DllEntry endp
    
    
HookProc proc export	
invoke StopThread
ret
	
HookProc endp


StopThread proc export
	invoke GetCurrentProcessId
	mov idCurProc,eax
	invoke GetCurrentThreadId
	mov idCurThread,eax
	invoke CreateToolhelp32Snapshot,TH32CS_SNAPTHREAD,NULL
	.if eax==INVALID_HANDLE_VALUE
		invoke MessageBox,NULL,addr TextErrorTool,addr CaptionError,MB_OK
	.else
		mov hSnap,eax	
		mov ThreadEntry.dwSize,sizeof ThreadEntry		
		invoke Thread32First,hSnap,offset ThreadEntry
	loopThread:
		mov eax,idCurThread
		mov ebx,idCurProc
		.if ThreadEntry.th32ThreadID!=eax
			.if ThreadEntry.th32OwnerProcessID==ebx
				invoke OpenThread,THREAD_SUSPEND_RESUME,FALSE,ThreadEntry.th32ThreadID
				mov hThread,eax	
				.if hThread>0
					invoke SuspendThread,hThread
					invoke CloseHandle,hThread
					invoke Thread32Next,hSnap,offset ThreadEntry
					.if eax==TRUE
						jmp loopThread
					.else
						invoke CloseHandle,hSnap
					.endif
				.endif
			.endif
		.endif
	.endif
	ret
StopThread endp		

RunThread proc export
	invoke GetCurrentProcessId
	mov idCurProc,eax
	invoke GetCurrentThreadId
	mov idCurThread,eax
	invoke CreateToolhelp32Snapshot,TH32CS_SNAPTHREAD,NULL
	.if eax==INVALID_HANDLE_VALUE
		invoke MessageBox,NULL,addr TextErrorTool,addr CaptionError,MB_OK
	.else
		mov hSnap,eax
		mov ThreadEntry.dwSize,sizeof ThreadEntry
		invoke Thread32First,hSnap,offset ThreadEntry
	loopThread:
		mov eax,idCurThread
		mov ebx,idCurProc
		.if ThreadEntry.th32ThreadID!=eax
			.if ThreadEntry.th32OwnerProcessID==ebx
				invoke OpenThread,THREAD_SUSPEND_RESUME,FALSE,ThreadEntry.th32ThreadID
				mov hThread,eax	
				.if hThread>0
					invoke ResumeThread,hThread
					invoke CloseHandle,hThread
					invoke Thread32Next,hSnap,offset ThreadEntry
					.if eax==TRUE
						jmp loopThread
					.else
						invoke CloseHandle,hSnap
					.endif
				.endif
			.endif
		.endif
	.endif
	ret	
RunThread endp	
end DllEntry
Функция Thread32First выполняется и возвращает TRUE, но структура THREADENTRY32 не заполняется и тредов не обнаруживается (((

Заранее спасибо
Д'якон вне форума Ответить с цитированием
Старый 02.12.2008, 11:55   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

а правильно ли заполняется поле ThreadEntry.dwSize ?
mov ThreadEntry.dwSize, sizeof ThreadEntry
попробуй так
mov ThreadEntry.dwSize, 28
rpy3uH вне форума Ответить с цитированием
Старый 02.12.2008, 18:45   #3
Д'якон
Форумчанин
 
Регистрация: 05.12.2007
Сообщений: 236
По умолчанию

Заполняется правильно. В принципе проблем с выполнением кода не было. Может он и правильно работает хз. Но на тестовой проге потоков не обнаружил.
Д'якон вне форума Ответить с цитированием
Старый 02.12.2008, 20:15   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Код:
.if ThreadEntry.th32ThreadID!=eax
			.if ThreadEntry.th32OwnerProcessID==ebx
здесь ты делаешь так чтобы остановить все потоки (кроме "себя") из текущего процесса, а какие там могут быть ещё потоки, если твоя программа однопоточная
rpy3uH вне форума Ответить с цитированием
Старый 02.12.2008, 22:12   #5
Д'якон
Форумчанин
 
Регистрация: 05.12.2007
Сообщений: 236
По умолчанию

У программы в которой я вызываю CreateRemoteThread имеется поток + мой поток. По идее поток программы должен остановиться, а после подгрузки библиотеки и вызова из нее функции мой поток уничтожается. Запущенных потоков нет, программа должна закрыться, но этого не происходит

Вот код подгрузки моей длл, чтоб понятно было, заодно может кому-то пригодится. Подгрузка библиотеки в процесс по имени окна программы
Код:
.486P
.model flat, stdcall
option casemap:none

HookDevIoContProc proto :dword, :dword, :dword, :dword

Inject struc
	NameLoadLib db 'HookApi.dll',0
	NameLoadProc db '_HookProc@0',0
	ComandPush db 68h
	AdrLib dd ? ; имя библиотеки
	ComandCall db 0E8h
	AdrOfLoadLib dd ? ; адрес LoadLibraryA	
	ComandPush2 db 68h
	AdrNameFunc dd ? ; имя вызываемой процедуры
	PuahEax db 50h
	ComandCall2 db 0E8h
	AdrGetProc dd ? ; адрес GetProcAddress
	CallEax dw 0D0FFh	
	ComandPush3 db 68h
	PushArg dd 0
	ComandCall3 db 0E8h
	AdrOfExit dd ? ; адрес ExitThread
Inject ends	

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\advapi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\advapi32.lib

.data
	TextWindowName db 'Hook Api Dialog',0
	NamePrivilege db 'SeDebugPrivilege',0
	TextErrorFindWindow db 'Error FindWindow',0
	CaptionError db 'Error',0
	TextGetWProcId db 'Error GetWindowThreadProcessId',0
	TextErrorOpenProc db 'Error OpenProcess',0
	TextErrOpenPrTok db 'Error OpenProcessToken',0
	TextErLookPriv db 'Error LookupPrivilegeValue',0
	TextErAdjTokPriv db 'Error AdjustTokenPrivileges',0
	TextErrVirtualAll db 'Error VirtualAllocEx',0
	NameDialog db 'DiallHook',0
	TextErrWriteMemm db 'Error WriteProcessMemory',0
	TextSucces db 'Operation Sucsesfull',0
	CaptionSucces db 'Sucses',0	
	kernel32 db 'kernel32.dll',0
	ProcLoadLib db 'LoadLibraryA',0
	ProcGetAdr db 'GetProcAddress',0
	ProcExitThr db 'ExitThread',0
	InjectOfCode Inject <>
	TextErrorThread db 'Error CreateRemouteThread',0	
	
.data?
	HandleProcFind dd ?
	hToken dd ?
	LuidPrivilege dd ?
	RetLen dd ?
	tkpu TOKEN_PRIVILEGES <>
	hProc dd ?
	NumOfByte dd ?
	hModuleWindows dd ?	
	hVirtualMem dd ?
	hKernel dd ?
			
.const
	IDD_DIALOGHOOK equ 1000
	IDC_STATIC equ 1001
	IDC_EDITHANDLE equ 1002
	IDC_SETHOOK equ 1003

.code
start:
	invoke GetModuleHandle,NULL
	mov hModuleWindows,eax
	invoke DialogBoxParam,hModuleWindows,addr NameDialog,NULL,addr HookDevIoContProc,NULL
	invoke ExitProcess,NULL

Последний раз редактировалось rpy3uH; 03.12.2008 в 09:43.
Д'якон вне форума Ответить с цитированием
Старый 02.12.2008, 22:16   #6
Д'якон
Форумчанин
 
Регистрация: 05.12.2007
Сообщений: 236
По умолчанию

Код:
HookDevIoContProc proc hWndHook,uMsg,wParam,lParam
		.if uMsg==WM_INITDIALOG
			invoke GetDlgItem,hWndHook,IDC_EDITHANDLE
			invoke SetFocus,eax
			
		.elseif uMsg==WM_COMMAND
			mov eax,wParam
			.if eax==IDC_SETHOOK
				invoke FindWindow,NULL,addr TextWindowName
				.if eax==NULL
					invoke MessageBox,hWndHook,addr TextErrorFindWindow,addr CaptionError,MB_OK
				.else 
					invoke GetWindowThreadProcessId,eax,addr HandleProcFind
					.if eax==NULL
						invoke MessageBox,hWndHook,addr TextGetWProcId,addr CaptionError,MB_OK
					.else
						invoke OpenProcess,PROCESS_QUERY_INFORMATION or PROCESS_VM_OPERATION or PROCESS_VM_WRITE or PROCESS_CREATE_THREAD,NULL,HandleProcFind
						.if eax==NULL
							invoke MessageBox,hWndHook,addr TextErrorOpenProc,addr CaptionError,MB_OK
						.else
							mov hProc,eax
							invoke OpenProcessToken,eax,TOKEN_QUERY or TOKEN_ADJUST_PRIVILEGES,addr hToken
							.if eax==NULL
								invoke MessageBox,hWndHook,addr TextErrOpenPrTok,addr CaptionError,MB_OK	
							.else
								invoke LookupPrivilegeValue,NULL,addr NamePrivilege,addr LuidPrivilege
								.if eax==NULL
									invoke MessageBox,hWndHook,addr TextErLookPriv,addr CaptionError,MB_OK	
								.else
									mov tkpu.PrivilegeCount,1
									mov eax,LuidPrivilege
									mov tkpu.Privileges.Luid.LowPart,eax
									mov eax,SE_PRIVILEGE_ENABLED
									mov tkpu.Privileges.Attributes,eax
									invoke AdjustTokenPrivileges,hToken,0,addr tkpu,sizeof tkpu,addr tkpu,addr RetLen
									.if eax==NULL
										invoke MessageBox,hWndHook,addr TextErAdjTokPriv,addr CaptionError,MB_OK
									.else
										invoke VirtualAllocEx,hProc,NULL,sizeof InjectOfCode,MEM_COMMIT,PAGE_EXECUTE
										.if eax==NULL
											invoke MessageBox,hWndHook,addr TextErrVirtualAll,addr CaptionError,MB_OK
										.else
											mov hVirtualMem,eax	
										; инициализация внедряемого кода
											mov InjectOfCode.AdrLib, eax
											invoke GetModuleHandle,offset kernel32
											mov hKernel,eax
											invoke GetProcAddress,eax,offset ProcLoadLib
											mov ebx,hVirtualMem
											add ebx,sizeof InjectOfCode.NameLoadLib
											add ebx,sizeof InjectOfCode.NameLoadProc
											add ebx,sizeof InjectOfCode.ComandPush
											add ebx,sizeof InjectOfCode.AdrLib
											add ebx,5
											sub eax,ebx											
											mov InjectOfCode.AdrOfLoadLib,eax
											mov eax,hVirtualMem
											add eax,sizeof InjectOfCode.NameLoadLib
											mov InjectOfCode.AdrNameFunc,eax
											invoke GetProcAddress,hKernel,offset ProcGetAdr
											add ebx,sizeof InjectOfCode.ComandCall
											add ebx,sizeof InjectOfCode.AdrOfLoadLib
											add ebx,sizeof InjectOfCode.PuahEax
											add ebx,sizeof InjectOfCode.ComandPush2
											add ebx,sizeof InjectOfCode.AdrNameFunc
											sub eax,ebx
											mov InjectOfCode.AdrGetProc,eax
											invoke GetProcAddress,hKernel,offset ProcExitThr
											add ebx,sizeof InjectOfCode.ComandCall2
											add ebx,sizeof InjectOfCode.AdrGetProc
											add ebx,sizeof InjectOfCode.CallEax
											add ebx,sizeof InjectOfCode.ComandPush3
											add ebx,sizeof InjectOfCode.PushArg
											sub eax,ebx
											mov InjectOfCode.AdrOfExit,eax											
										; внедрение кода	
											invoke WriteProcessMemory,hProc,hVirtualMem,addr InjectOfCode,sizeof InjectOfCode,addr NumOfByte
											.if NumOfByte<sizeof InjectOfCode
												invoke MessageBox,hWndHook,addr TextErrWriteMemm,addr CaptionError,MB_OK
											.else
												mov eax,hVirtualMem
												add eax,sizeof InjectOfCode.NameLoadLib
												add eax,sizeof InjectOfCode.NameLoadProc
												invoke CreateRemoteThread,hProc,NULL,NULL,eax,NULL,NULL,NULL
												.if eax==NULL
													invoke MessageBox,hWndHook,addr TextErrorThread,addr CaptionError,MB_OK
												.else
													invoke CloseHandle,eax	
													invoke MessageBox,hWndHook,addr TextSucces,addr CaptionSucces,MB_OK
												.endif		
											.endif
										.endif
									.endif
								.endif
							.endif
						.endif
					.endif
				.endif
			.endif
		.elseif uMsg==WM_CLOSE
			invoke EndDialog,hWndHook,NULL
		.else
			mov eax,FALSE
			ret
		.endif
			mov eax,TRUE
			ret
HookDevIoContProc endp
end start
Д'якон вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц