информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Продолжаем валять дурака: не могу вызвать 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-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach