![]() |
|
| Правила Форума редакция от 22.06.2020 |
|
|||||||
|
|
Окажите посильную поддержку, мы очень надеемся на вас. Реквизиты для переводов ниже. |
|
![]() |
|
|
Опции темы | Опции просмотра |
Language
|
|
|
#1
|
|
Имеется следущий код
Код:
#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;
}
Какой код может содержать иньектируемая функция ? И второй вопрос. Можно ли как то определить точно , нужный функции обьем памяти ? 100кб это по моему многовато... PS: ОС Vista Заранее благодарен.
__________________
Проблема есть следствие ее решения... Чем больше я узнаю, тем больше чувствую себя дураком. Последний раз редактировалось Ivan_32; 28.09.2008 в 03:30.. |
|
|
|
|
| Реклама: |
|
|
#2
|
|
Неактивный пользователь
Пол:
Регистрация: 01.05.2008
Сообщений: 18
Репутация: 4
|
ты handle процесса не проверяешь? а то вдруг он нулевой.
плюс, этот процесс должен иметь PROCESS_VM_OPERATION статус, иначе VirtualAllocEx неизвестно что вернет ![]() плюс у меня сомнения по поводу что функцию записать в процесс можно только простым копированием памяти. процесс имеет свой контекст, в котором определены контексты потоков и для каждого потока также есть своя таблица контекста. Если прога падает при вызове функции, то, скорее всего, создалась какая-то путаница с адресами (адреса в контексте твоего потока не соответствуют адресам в потоке, в который пытаешься писать). можешь стоит попробовать скопировать память всего потока? |
|
|
|
| Сказали спасибо: |
|
|
#3
|
|
Постоялец
![]() ![]() ![]() ![]() ![]() Пол:
Регистрация: 05.02.2007
Адрес: Москва
Сообщений: 662
Репутация: 271
|
Я пробовал использовать WinApi при создании процесса с помощью
CreateThread(). Все работало. К тому же в этом случае никакой специальной памяти выделять не надо.
__________________
Сергей Сергеевич |
|
|
|
|
|
#4
|
|
Неактивный пользователь
Пол:
Регистрация: 01.05.2008
Сообщений: 18
Репутация: 4
|
согласен c zss, CreateThread - создает новый полный контекст потока, а при копировании памяти неизвестно что и неизвестно куда копируется.
|
|
|
|
|
|
#5
|
|
Неактивный пользователь
Пол:
Регистрация: 28.01.2008
Сообщений: 26
Репутация: 5
|
Автору срочно изучать:
- основы ассемблера - читать про то, что происходит когда экзешник (а вернее код в нем) грузится в память для запуска Наивно надеяться что функцию можно перенести в другое место простым копированием. |
|
|
|
| Сказали спасибо: |
|
|
#6
|
|
Baller, а литературу по второй теме не порекомендуете ? Я только документацию на PE нашел и то 97 года...
__________________
Проблема есть следствие ее решения... Чем больше я узнаю, тем больше чувствую себя дураком. |
|
|
|
|
|
|
#7
|
|
Неактивный пользователь
Пол:
Регистрация: 28.01.2008
Сообщений: 26
Репутация: 5
|
Хм... дока по PE -- вполне... Как насчет MSDNа? Там все есть, только искать иногда трудно. Рекомендую локальную версию -- так быстрее. По-моему у Рихтера был пример с Remote Thread.
|
|
|
|
| Сказали спасибо: |
|
|
#8
|
|
Код:
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;
}
Компиляция проходит без ошибок и возражений, запуск тоже вот только код не работает... При запуске ничего не происходит.
__________________
Проблема есть следствие ее решения... Чем больше я узнаю, тем больше чувствую себя дураком. |
|
|
|
|
|
|
#9
|
|
Неактивный пользователь
Пол:
Регистрация: 28.01.2008
Сообщений: 26
Репутация: 5
|
теплее... таперича проверь:
- что адрес функции 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 |
|
|
|
| Сказали спасибо: |
|
|
#10
|
|
Это смешно но ошибка была в том что нужно было строку адреса во первых представить полностью во вторых статическим массивом. Иными словами
char mylib[]="C:\\mylib.dll" Всем спасибо, код работает ![]()
__________________
Проблема есть следствие ее решения... Чем больше я узнаю, тем больше чувствую себя дураком. |
|
|
|
|
|
|
#11
|
|
Неактивный пользователь
Пол:
Регистрация: 28.01.2008
Сообщений: 26
Репутация: 5
|
мда... старею, не заметил :-)
можно еще sizeof() на strlen()+1 заменить А работает оно у тебя потому, что kernel32.dll загружен в обоих процессах по одному базовому адресу, что не гарантировано. |
|
|
|
|
|
#12
|
|
"Проблему я решил , теперь буду думать зачем."
Что можно делать из такой DLL , с процессом ? Мне бы очень не помешала книжечка по такому виду вирусов. PS: Как снять дамп памяти процесса ? Как найти в памяти процесса переменную? По этим вопросам тоже требуется ответ..
__________________
Проблема есть следствие ее решения... Чем больше я узнаю, тем больше чувствую себя дураком. |
|
|
|
|
|
|
#13
|
|
Код:
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;
}
__________________
Проблема есть следствие ее решения... Чем больше я узнаю, тем больше чувствую себя дураком. Последний раз редактировалось Ivan_32; 11.10.2008 в 03:38.. |
|
|
|
|
![]() |
Похожие темы
|
||||
| Тема | Автор | Раздел | Ответов | Последнее сообщение |
| 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 |
|
|