информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медСтрашный баг в WindowsАтака на Internet
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Блокировка российских аккаунтов... 
 Отзыв сертификатов ЦБ РФ, ПСБ,... 
 Памятка мирным людям во время информационной... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Продолжаем валять дурака: не могу вызвать MessageBox 30.10.02 16:46  Число просмотров: 985
Автор: Sandy <Alexander Stepanov> Статус: Elderman
<"чистая" ссылка>
> FARPROC mbPtr = GetProcAddress( userDll,
> "MessageBoxA" );

Может адрес, который ты здесь получаешь, не соответствует адресу этой процедуры в другом процессе?
<programming>
Продолжаем валять дурака: не могу вызвать MessageBox 30.10.02 15:08  
Автор: PS <PS> Статус: Elderman
<"чистая" ссылка>
Итак есть две программы.
Программа B создает в программе A поток, в этом потоке должна вызваться MessageBox. Вместо этого получам access violation.
Программу A не привожу: обычное консольное приложение (правда должна пользоваться хоть одной user32 ф-ей).
Код программы B: (смотреть только тем у кого есть свободное время, и нечего делать ;) )

#include <windows.h>
#include <process.h>
#include <winerror.h>
#include <stdio.h>

typedef int (FAR WINAPI *FARPROC2)( void*, char*, char*, int );

void empty()
{
	MessageBox( 0, 0, 0, MB_OK );
}

int WINAPI test( void* ptr )
{		
	((FARPROC2)ptr)( 0, 0, 0, MB_OK );		
	return 0;
}

int main( int argc, char** argv )
{	
	char pidStr[1024];
	printf( "Enter remote pid: " );
	gets( pidStr );
	DWORD rPid = atol( pidStr );

	HANDLE rProc = OpenProcess( PROCESS_ALL_ACCESS, TRUE, rPid );
	if( !rProc )
	{
		printf( "Error OpenProcess: %ld\n", GetLastError() );	
		return -1;
	}

	LPVOID rPtr = VirtualAllocEx( rProc, NULL, 1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE );
	if( !rPtr )
	{
		printf( "Error VirtualAllocEx: %ld\n", GetLastError() );
		return -1;
	}

	printf( "Remote ptr: 0x%.X\n", rPtr );

	if( !WriteProcessMemory( rProc, rPtr, test, 100, NULL ) )
	{
		printf( "Error WriteProcessMemory: %ld\n", GetLastError() );
		return -1;
	}

	unsigned char *bfr = (unsigned char*)test;
	for( int i = 0; i < 100; i++ )
	{
		printf( "%.2X ", bfr[i] );
		if( (i % 8) == 0 )
			printf( "\n" );
	}
	printf( "\n" );

	HMODULE userDll = GetModuleHandle( "user32.dll" );
	if( !userDll )
	{
		printf( "Error GetModuleHandle: %ld\n", GetLastError() );
		return -1;
	}

	FARPROC mbPtr = GetProcAddress( userDll, "MessageBoxA" );
	if( !mbPtr )
	{
		printf( "Error GetProcAddress: %ld\n", GetLastError() );
		return -1;
	}		
	
	DWORD rThreadId;
	HANDLE rThread = CreateRemoteThread( rProc, NULL, 0, (LPTHREAD_START_ROUTINE)rPtr, mbPtr, 0, &rThreadId );
	if( !rThread )
	{
		printf( "Error CreateRemoteThread: %ld\n", GetLastError() );
		return -1;
	}

	printf( "Remote Thread ID: %ld\n", rThreadId );

	int a = 6;
	a++;
	if( a == 6 )
		empty();
	return 0;
}

---
Yes ! Получилось :) 30.10.02 17:09  
Автор: PS <PS> Статус: Elderman
<"чистая" ссылка>
Сказал же что "чую не правильно ф-ию копирую". Так оно и оказалась. 100 байт - мало. Сделал 500 и все заработало...
Продолжаем валять дурака: не могу вызвать MessageBox 30.10.02 16:46  
Автор: Sandy <Alexander Stepanov> Статус: Elderman
<"чистая" ссылка>
> FARPROC mbPtr = GetProcAddress( userDll,
> "MessageBoxA" );

Может адрес, который ты здесь получаешь, не соответствует адресу этой процедуры в другом процессе?
У Рихтера написанно, что соответствует ; ) 30.10.02 16:50  
Автор: PS <PS> Статус: Elderman
Отредактировано 30.10.02 16:53  Количество правок: 1
<"чистая" ссылка>
И не только у него. Проверил - соответсвует.
Чую я не правильно ф-ию копирую... но понять не могу... пока.
Я тоже RemoteThread'ами баловался недавно... Всё получалось и пикало в спикер, и показывало боксы, причём под Delphi ;-) Впечатления внутри 31.10.02 22:48  
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
Нитка валяется где-то в программинг.
Кстати, у тебя процесс, в котором создаёшь поток падал\зависал? У меня DrWatson читал отходную процессу в виде логов на диске, дык я по ним определял, что там не то. А ещё можно запустить процесс под каким-нибудь дебуггером, создать поток с флагом CREATE_SUSPENDED, и поставить бряк по адресу, куда поток скопировал. Потом, если возабновить поток, отладить можно и доконать пошагово.
Коллективный разум мне посоветовал делать этот поток как можно меньше, и грузить в нём DLL, в которой чувствуешь себя гораздо вольготнее. Как я понял на собственных муках, закомпилить что-либо и исполнить ЭТО в чужом процессе, всё равно, что собрать кораблик в бутылке ;-)

Ну, и знаешь, я в конце концов сделал что мне надо без удалённого потока. Я хотел, чтобы регедит виндовый открывал мне нужный ключ — прям почти так, как сделано в RegMon Руссиновичем ;-) Там мне нужно было в сообщения, что я кидал в окно TreeView, вставлять указатели на структуры. А они должны быть в процессе, создавшем окно. И я кидал сообщения из своей софтины, структуры копировал в чужой процесс, ну и указатели были соответствующие. Получилось быстрее, без DLL и геморороя ;-)
Удачи!
У кого там мысли одновременно сходятся ? :) 01.11.02 01:12  
Автор: PS <PS> Статус: Elderman
<"чистая" ссылка>
> Нитка валяется где-то в программинг.

Увидел, после того как эту создал :)
Кстати там тебе посоветовали размер ф-ий вычитанием адресов определять - не выходит так. Любой размер получается равным 5ти. Почему так - еще не понял.

> Кстати, у тебя процесс, в котором создаёшь поток
> падал\зависал?

После того как нажимаешь OK в messageBox'е процесс действительно падает. Но мне это не важно. Если исполнять не месадж боксы, а обычную логику - то все работает и завершается нормально. Это еще тема для иследования, но заниматся ей нет ни времени ни желания.

> У меня DrWatson читал отходную процессу в
> виде логов на диске, дык я по ним определял, что там не то.
> А ещё можно запустить процесс под каким-нибудь дебуггером,
> создать поток с флагом CREATE_SUSPENDED, и поставить бряк
> по адресу, куда поток скопировал. Потом, если возабновить
> поток, отладить можно и доконать пошагово.

А как ты код видишь ? По идеи дебагер будет показывать только asm. Разве не так ?

> Коллективный разум мне посоветовал делать этот поток как
> можно меньше, и грузить в нём DLL, в которой чувствуешь
> себя гораздо вольготнее.

Это не интересно, как раз по той причине что легче :) Тем более описанно у Рихтера, а значит вдвойне не интересно ;)


>Как я понял на собственных муках,
> закомпилить что-либо и исполнить ЭТО в чужом процессе, всё
> равно, что собрать кораблик в бутылке ;-)

Точно. Зато какое удовольствие :)

> Ну, и знаешь, я в конце концов сделал что мне надо без
> удалённого потока. Я хотел, чтобы регедит виндовый открывал
> мне нужный ключ — прям почти так, как сделано в RegMon
> Руссиновичем ;-) Там мне нужно было в сообщения, что я
> кидал в окно TreeView, вставлять указатели на структуры. А
> они должны быть в процессе, создавшем окно. И я кидал
> сообщения из своей софтины, структуры копировал в чужой
> процесс, ну и указатели были соответствующие. Получилось
> быстрее, без DLL и геморороя ;-)
> Удачи!

Поздравляю :)) А я просто развлекаюсь... :)
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2022 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach