Компьютерный форум NoWa.cc Здесь может быть Ваша реклама
Правила Форума
редакция от 22.06.2020
Форум .::NoWa.cc::.
Вернуться   Компьютерный форум NoWa.cc > В помощь вебмастеру > Программирование > Visual C++ / С/C++

Уважаемые пользователи nowa.cc. Мы работаем для вас более 20 лет и сейчас вынуждены просить о финансовой помощи по оплате за сервер.
Окажите посильную поддержку, мы очень надеемся на вас. Реквизиты для переводов ниже.
Webmoney Webmoney WMZ: Z021474945171 Webmoney WME: E159284508897 Webmoney WMUSDT: T206853643180
Кошелёк для вашей помощи YooMoney 4100117770549562
YooMoney Спасибо за поддержку!

Ответ
 
Опции темы Опции просмотра Language
Старый 28.09.2008, 03:18   #1
Постоялец
 
Аватар для Ivan_32
 
Регистрация: 23.12.2007
Адрес: FFFF:64E9
Сообщений: 221
Репутация: 64
Question В Remote Thread не исполняется WinAPI код.

Имеется следущий код

Код:
#include <windows.h>
#include "stdafx.h"
DWORD WINAPI func(LPVOID lparam)
{
	HWND hwn;
	return 0;
}
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
DWORD myPID=4644;//Это PID уже запущенного процесса, я его ввожу вручную
HANDLE process=OpenProcess(PROCESS_ALL_ACCESS,0,myPID);
LPVOID lpBuffer=&func;
DWORD NumberOfBytesWritten;
LPVOID lpMemory=VirtualAllocEx(process, NULL, 100000, MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE);
WriteProcessMemory(process,lpMemory,lpBuffer,100000,&NumberOfBytesWritten);
DWORD tID=1000;//Это для надежности)
CreateRemoteThread(process,NULL,NULL,(LPTHREAD_START_ROUTINE)lpMemory,0,0,&tID);
while(true){};
return 0;
}
Так вот если func содержит WinAPI код , например вызов MessageBox , программа в которую иньектится код, падает.
Какой код может содержать иньектируемая функция ? И второй вопрос.
Можно ли как то определить точно , нужный функции обьем памяти ? 100кб это по моему многовато...
PS: ОС Vista

Заранее благодарен.
__________________
Проблема есть следствие ее решения...
Чем больше я узнаю, тем больше чувствую себя дураком.

Последний раз редактировалось Ivan_32; 28.09.2008 в 03:30..
Ivan_32 вне форума
 
Ответить с цитированием Вверх
Здесь может быть Ваша реклама
Здесь может быть Ваша реклама


Реклама:


Старый 28.09.2008, 12:11   #2
xelos
Неактивный пользователь
 
Пол:Мужской
Регистрация: 01.05.2008
Сообщений: 18
Репутация: 4
По умолчанию Re: В Remote Thread не исполняется WinAPI код.

ты handle процесса не проверяешь? а то вдруг он нулевой.
плюс, этот процесс должен иметь PROCESS_VM_OPERATION статус, иначе VirtualAllocEx неизвестно что вернет

плюс у меня сомнения по поводу что функцию записать в процесс можно только простым копированием памяти. процесс имеет свой контекст, в котором определены контексты потоков и для каждого потока также есть своя таблица контекста. Если прога падает при вызове функции, то, скорее всего, создалась какая-то путаница с адресами (адреса в контексте твоего потока не соответствуют адресам в потоке, в который пытаешься писать).

можешь стоит попробовать скопировать память всего потока?
xelos вне форума
 
Ответить с цитированием Вверх
Старый 28.09.2008, 12:26   #3
zss
Постоялец
 
Пол:Мужской
Регистрация: 05.02.2007
Адрес: Москва
Сообщений: 662
Репутация: 271
По умолчанию Re: В Remote Thread не исполняется WinAPI код.

Я пробовал использовать WinApi при создании процесса с помощью
CreateThread(). Все работало. К тому же в этом случае никакой
специальной памяти выделять не надо.
__________________
Сергей Сергеевич
zss вне форума
 
Ответить с цитированием Вверх
Старый 28.09.2008, 12:32   #4
xelos
Неактивный пользователь
 
Пол:Мужской
Регистрация: 01.05.2008
Сообщений: 18
Репутация: 4
По умолчанию Re: В Remote Thread не исполняется WinAPI код.

согласен c zss, CreateThread - создает новый полный контекст потока, а при копировании памяти неизвестно что и неизвестно куда копируется.
xelos вне форума
 
Ответить с цитированием Вверх
Старый 29.09.2008, 00:54   #5
Baller
Неактивный пользователь
 
Пол:Мужской
Регистрация: 28.01.2008
Сообщений: 26
Репутация: 5
По умолчанию Re: В Remote Thread не исполняется WinAPI код.

Автору срочно изучать:
- основы ассемблера
- читать про то, что происходит когда экзешник (а вернее код в нем) грузится в память для запуска

Наивно надеяться что функцию можно перенести в другое место простым копированием.
Baller вне форума
 
Ответить с цитированием Вверх
Старый 01.10.2008, 06:00   #6
Ivan_32
Постоялец
 
Аватар для Ivan_32
 
Регистрация: 23.12.2007
Адрес: FFFF:64E9
Сообщений: 221
Репутация: 64
По умолчанию Re: В Remote Thread не исполняется WinAPI код.

Baller, а литературу по второй теме не порекомендуете ? Я только документацию на PE нашел и то 97 года...
__________________
Проблема есть следствие ее решения...
Чем больше я узнаю, тем больше чувствую себя дураком.
Ivan_32 вне форума
 
Ответить с цитированием Вверх
Старый 01.10.2008, 06:49   #7
Baller
Неактивный пользователь
 
Пол:Мужской
Регистрация: 28.01.2008
Сообщений: 26
Репутация: 5
По умолчанию Re: В Remote Thread не исполняется WinAPI код.

Хм... дока по PE -- вполне... Как насчет MSDNа? Там все есть, только искать иногда трудно. Рекомендую локальную версию -- так быстрее. По-моему у Рихтера был пример с Remote Thread.
Baller вне форума
 
Ответить с цитированием Вверх
Старый 06.10.2008, 00:29   #8
Ivan_32
Постоялец
 
Аватар для Ivan_32
 
Регистрация: 23.12.2007
Адрес: FFFF:64E9
Сообщений: 221
Репутация: 64
По умолчанию Re: В Remote Thread не исполняется WinAPI код.

Код:
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	DWORD PID=4156;
	HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
	char*libname="mylib.dll";
	int nBytes=sizeof(libname);
	PSTR plibn=(PSTR)VirtualAllocEx(hProcess,0,nBytes,MEM_COMMIT,PAGE_READWRITE);
    PTHREAD_START_ROUTINE lpr=(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA");
	WriteProcessMemory(hProcess,plibn,(LPVOID)libname,nBytes,0);
	CreateRemoteThread(hProcess,0,0,lpr,plibn,0,0);
	return 0;
}
В mylib.dll вызывается MessageBoxA
Компиляция проходит без ошибок и возражений, запуск тоже вот только код не работает... При запуске ничего не происходит.
__________________
Проблема есть следствие ее решения...
Чем больше я узнаю, тем больше чувствую себя дураком.
Ivan_32 вне форума
 
Ответить с цитированием Вверх
Старый 06.10.2008, 01:24   #9
Baller
Неактивный пользователь
 
Пол:Мужской
Регистрация: 28.01.2008
Сообщений: 26
Репутация: 5
По умолчанию Re: В Remote Thread не исполняется WinAPI код.

теплее... таперича проверь:
- что адрес функции LoadLibraryA() одинаков в твоем процессе и процессе, в который ты пытаешься влезть (что может быть и не так). Когда я интересоваля этими вещами самым правильным решением было иметь свою dll, у которой прописано грузится только по определенному адресу (чтобы заранее знать адреса функций). Эта dll должна грузится в каждый процесс -- это достигалось ее регистрацией в windows shell где-то (убей не помню где). Ищи Рихтера, в общем -- отличная вещь.
- что соглашения по вызову у LoadLibraryA() и ThreadProc те же (так и есть вобщем-то)
- что процесс, куда ты лезешь, приаттачен к твоему десктопу (вполне возможно, что все работает, только диаложка выскакивает там, где ты ее не видишь). Я надеюсь MessageBox() вызов в DllMain (PROCESS_ATTACH) (я предполагаю, что это обычная dll, слинкованная с CRT)?

вообще рекомендую начать проверять на ошибки -- станет яснее почему не работает (см. GetLastError() & FormatMessage()).

Вот линки:
http://msdn.microsoft.com/en-us/libr...37(VS.85).aspx
http://msdn.microsoft.com/en-us/libr...74(VS.85).aspx
http://msdn.microsoft.com/en-us/libr...60(VS.85).aspx
http://msdn.microsoft.com/en-us/libr...90(VS.85).aspx
Baller вне форума
 
Ответить с цитированием Вверх
Старый 06.10.2008, 21:10   #10
Ivan_32
Постоялец
 
Аватар для Ivan_32
 
Регистрация: 23.12.2007
Адрес: FFFF:64E9
Сообщений: 221
Репутация: 64
По умолчанию Re: В Remote Thread не исполняется WinAPI код.

Это смешно но ошибка была в том что нужно было строку адреса во первых представить полностью во вторых статическим массивом. Иными словами
char mylib[]="C:\\mylib.dll"
Всем спасибо, код работает
__________________
Проблема есть следствие ее решения...
Чем больше я узнаю, тем больше чувствую себя дураком.
Ivan_32 вне форума
 
Ответить с цитированием Вверх
Старый 07.10.2008, 03:19   #11
Baller
Неактивный пользователь
 
Пол:Мужской
Регистрация: 28.01.2008
Сообщений: 26
Репутация: 5
По умолчанию Re: В Remote Thread не исполняется WinAPI код.

мда... старею, не заметил :-)
можно еще sizeof() на strlen()+1 заменить

А работает оно у тебя потому, что kernel32.dll загружен в обоих процессах по одному базовому адресу, что не гарантировано.
Baller вне форума
 
Ответить с цитированием Вверх
Старый 08.10.2008, 07:53   #12
Ivan_32
Постоялец
 
Аватар для Ivan_32
 
Регистрация: 23.12.2007
Адрес: FFFF:64E9
Сообщений: 221
Репутация: 64
По умолчанию Виды манипуляций с процессом, из DLL

"Проблему я решил , теперь буду думать зачем."
Что можно делать из такой DLL , с процессом ? Мне бы очень не помешала книжечка по такому виду вирусов.
PS: Как снять дамп памяти процесса ? Как найти в памяти процесса переменную? По этим вопросам тоже требуется ответ..
__________________
Проблема есть следствие ее решения...
Чем больше я узнаю, тем больше чувствую себя дураком.
Ivan_32 вне форума
 
Ответить с цитированием Вверх
Старый 11.10.2008, 02:01   #13
Ivan_32
Постоялец
 
Аватар для Ivan_32
 
Регистрация: 23.12.2007
Адрес: FFFF:64E9
Сообщений: 221
Репутация: 64
По умолчанию Re: В Remote Thread не исполняется WinAPI код.

Код:
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	MEMORY_BASIC_INFORMATION mbi;
	if(!VirtualQuery((LPVOID)0x00010000,&mbi,sizeof(mbi)))MessageBoxA(0,"Querying not sucess",0,0);
	if(VirtualProtect((LPVOID)0x00010000,4096,PAGE_READWRITE,&mbi.Protect)==NULL)MessageBoxA(0,"Protect Not Sucess",0,0);
	char ch[4097];
	ReadProcessMemory(GetCurrentProcess(),(LPVOID)0x00010000,ch,4096,0);
	MessageBoxA(0,ch,0,0);
	return 0;
}
К какому адресу обратится что бы получить скажем тот участок памяти в котором распологается код ? В этом случае всего 5 байт не равны нулям... как то мало верится всетаки, память процесса никак не 65кб....
__________________
Проблема есть следствие ее решения...
Чем больше я узнаю, тем больше чувствую себя дураком.

Последний раз редактировалось Ivan_32; 11.10.2008 в 03:38..
Ivan_32 вне форума
 
Ответить с цитированием Вверх
Ответ

Опции темы
Опции просмотра

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Word и WinAPI bssergy Скорая помощь 1 05.08.2009 11:57
Thread(поток) в DLL Vo1t Delphi 9 18.12.2008 19:53
Гражданской авиации России исполняется 85 лет рапид Архив Флейма 0 09.02.2008 23:36
WinAPI Rimmato Visual C++ / С/C++ 4 21.11.2007 14:58

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 23:40. Часовой пояс GMT +3.


Copyright ©2004 - 2025 NoWa.cc

Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2026, vBulletin Solutions, Inc. Перевод: zCarot
Время генерации страницы 0.08166 секунды с 13 запросами