Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Инжект кода в процесс 
:(
    Опции темы
G0L1a7h
Дата 6.4.2008, 06:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 1.3.2008

Репутация: нет
Всего: нет



Здравствуйте уважаемые форумчане!
Вот появилась проблема. С инжектом длл я разобрался, а вот с инжектом кода не могу.
Приложение в которое я пытаюсь заинжектить код вылетает. Подскажите пожалуйста, в чем моя ошибка?
Код

#include <windows.h>
#include <tlhelp32.h>

BOOL Inject(DWORD(WINAPI* Code)(LPVOID));
DWORD WINAPI Code (LPVOID);
DWORD GetProcessID(char* lpNameProcess);

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{

    Inject(Code);


return 0;
    
    }
BOOL Inject(DWORD(WINAPI* Code)(LPVOID)){

HANDLE hProcess;
HANDLE hModule;
LPVOID lpMemory;
DWORD NumberOfBytesWritten;

hModule = GetModuleHandle(NULL);
DWORD size=((PIMAGE_OPTIONAL_HEADER)((LPVOID)((BYTE*)(hModule)+((PIMAGE_DOS_HEADER)(hModule))->e_lfanew+sizeof(DWORD)+sizeof(IMAGE_FILE_HEADER))))->SizeOfImage;

hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetProcessID("notepad.exe"));
    if (!hProcess)
    {
       MessageBoxA(0,"OpenProcess","Fail",0);
       ExitProcess(0);
    }


lpMemory = VirtualAllocEx(hProcess, NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    if (!lpMemory)
    {
        
        MessageBoxA(0,"VirtualAllocEx","Fail",0);
        ExitProcess(0);
    }

if (!WriteProcessMemory(hProcess, lpMemory, hModule, size, NULL))
{
        MessageBoxA(0,"WriteProcessMemory","Fail",0);
        ExitProcess(0);
}

if (!CreateRemoteThread(hProcess, NULL, 0, LPTHREAD_START_ROUTINE)Code, NULL, 0, NULL))
{
        MessageBoxA(0,"CreateRemoteThread","Fail",0);
        ExitProcess(0);
}


    return 0;

}

DWORD WINAPI Code (LPVOID){

MessageBox(0,"Injected!","",0);


}


DWORD GetProcessID(char* lpNameProcess)
{
HANDLE snap;
PROCESSENTRY32 pentry32;
snap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(snap==INVALID_HANDLE_VALUE) return 0;
pentry32.dwSize=sizeof(PROCESSENTRY32);
if(!Process32First(snap,&pentry32)) {CloseHandle(snap);return 0;}
do
{
if(!lstrcmpi(lpNameProcess,&pentry32.szExeFile[0]))
{
CloseHandle(snap);
return pentry32.th32ProcessID;
}
}while(Process32Next(snap,&pentry32));
CloseHandle(snap);
return true;
}



PM MAIL   Вверх
dumb
Дата 6.4.2008, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



Цитата(G0L1a7h @  6.4.2008,  07:04 Найти цитируемый пост)
if (!CreateRemoteThread(hProcess, NULL, 0, LPTHREAD_START_ROUTINE)Code, NULL, 0, NULL))

адрес процедуры не в твоем процессе, а в удаленном. lpMemory-hModule+Code
PM MAIL   Вверх
586
Дата 6.4.2008, 06:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



G0L1a7h, нельзя вот так взять и инжектировать модуль, так ещё и по другому адресу. Всё довольно сложнее. К примеру, вот этот код, нужно переписать на ассемблерный, и желательно, чтобы код был независим от базового адреса, иначе код придётся править перед инжектированием:
Цитата(G0L1a7h @  6.4.2008,  07:04 Найти цитируемый пост)
DWORD WINAPI Code (LPVOID){
MessageBox(0,"Injected!","",0);
}


Код
code_base:
  push 0
  call loc_1
  db 0   ; строка 1
loc_1:
  call loc_2
  db "Injected!", 0
loc_2:
  push 0
  ;mov eax, xxxxxxxx
  db 0b8h
  pMsgBox dd ?
  call eax
  ret 4   ; если создаёшь поток
end_of_code:  ; метка, для того, чтобы вычислить размер кода (end_of_code - code_base)


Код
pMsgBox = GetProcAddress(GetModleHandle("user32.dll"), "MessageBoxA");

PM   Вверх
asd
  Дата 7.4.2008, 06:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 25.6.2006

Репутация: 1
Всего: 1



PM MAIL   Вверх
G0L1a7h
Дата 7.4.2008, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 1.3.2008

Репутация: нет
Всего: нет



Блин.. ребят незнаю =\

Цитата

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

Я видел примеры в которых код который инжектится не является базонезависимым.

Цитата

G0L1a7h, 
Вам сюда http://rootkits.ru/viewtopic.php?id=181&words= 

Спасибо за ссылку на базонезависимый код я писать умею =\

Короче заставил я это работать....

Код

BOOL Inject(DWORD(WINAPI* Code)(LPVOID));
DWORD WINAPI Code (LPVOID);
DWORD GetProcessID(char* lpNameProcess);
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
Inject(Code);
return 0;
    
}
BOOL Inject(DWORD(WINAPI* Code)(LPVOID)){
HANDLE hProcess;
HANDLE hModule;

hModule = GetModuleHandle(NULL);
DWORD size=((PIMAGE_OPTIONAL_HEADER)((LPVOID)((BYTE*)(hModule)+((PIMAGE_DOS_HEADER)(hModule))->e_lfanew+sizeof(DWORD)+sizeof(IMAGE_FILE_HEADER))))->SizeOfImage;
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetProcessID("taskmgr.exe"));
    if (!hProcess)
    {
       MessageBoxA(0,"OpenProcess","Fail",0);
       ExitProcess(0);
    }
char* lpMemory = (char*)VirtualAllocEx(hProcess, hModule, size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    if (!lpMemory)
    {
        
        MessageBoxA(0,"VirtualAllocEx","Fail",0);
        ExitProcess(0);
    }
if (!WriteProcessMemory(hProcess, lpMemory, hModule, size, NULL))
{
        MessageBoxA(0,"WriteProcessMemory","Fail",0);
        ExitProcess(0);
}
if (!CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)Code, NULL, 0, NULL))
{
        MessageBoxA(0,"CreateRemoteThread","Fail",0);
        ExitProcess(0);
}
    return 0;
}
DWORD WINAPI Code (LPVOID){
    MessageBox(0,"Injected!","",0);
    return 0;
}
DWORD GetProcessID(char* lpNameProcess)
{
HANDLE snap;
PROCESSENTRY32 pentry32;
snap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(snap==INVALID_HANDLE_VALUE) return 0;
pentry32.dwSize=sizeof(PROCESSENTRY32);
if(!Process32First(snap,&pentry32)) {CloseHandle(snap);return 0;}
do
{
if(!lstrcmpi(lpNameProcess,&pentry32.szExeFile[0]))
{
CloseHandle(snap);
return pentry32.th32ProcessID;
}
}while(Process32Next(snap,&pentry32));
CloseHandle(snap);
return true;
}


Работает только с.......
Код

#pragma comment(linker,"/BASE:0x13110000")

Почему?

Это сообщение отредактировал(а) G0L1a7h - 7.4.2008, 09:49
PM MAIL   Вверх
asd
Дата 7.4.2008, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 25.6.2006

Репутация: 1
Всего: 1



G0L1a7h
тыб тему то прочитал. там есть код, для релокации образов.
PM MAIL   Вверх
586
Дата 7.4.2008, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(G0L1a7h @  7.4.2008,  10:39 Найти цитируемый пост)
аботает только с.......
Код
#pragma comment(linker,"/BASE:0x13110000")

Потому, что ты выделяешь память по адресу, который не занят в другом процессе. Если адрес будет занят, то память будет выделена по другому адресу.
Цитата(G0L1a7h @  7.4.2008,  10:39 Найти цитируемый пост)
char* lpMemory = (char*)VirtualAllocEx(hProcess, hModule, size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);

PM   Вверх
BreakPoint
Дата 30.4.2010, 22:29 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 25.3.2010

Репутация: нет
Всего: нет



PM MAIL   Вверх
xvr
Дата 2.5.2010, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(BreakPoint @  30.4.2010,  22:29 Найти цитируемый пост)
Может эта статья помжет:
Если автор за прошедшие 2 года с открытия темы до сих пор не разобрался, ему уже ничего не поможет  smile 

PM MAIL   Вверх
Abyx
Дата 2.5.2010, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 2
Всего: 10



Цитата(BreakPoint @  30.4.2010,  22:29 Найти цитируемый пост)
Может эта статья помжет:
Байтовая инъекция. Внедрение кода в сторонний процесс. 

Там же Delphi, а тут форум по С\С++.
Напиши то же для С++.

PM MAIL   Вверх
EvilsInterrupt
Дата 2.5.2010, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 1
Всего: 9



Цитата

Если автор за прошедшие 2 года с открытия темы до сих пор не разобрался, ему уже ничего не поможет   

 smile  smile 
PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0756 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.