Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| |
У Рихтера написанно, что соответствует ; ) 30.10.02 16:50 Число просмотров: 1015
Автор: PS <PS> Статус: Elderman Отредактировано 30.10.02 16:53 Количество правок: 1
|
И не только у него. Проверил - соответсвует.
Чую я не правильно ф-ию копирую... но понять не могу... пока.
|
<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 и геморороя ;-) > Удачи!
Поздравляю :)) А я просто развлекаюсь... :)
|
|
|