Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Инжект кода в процесс


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

#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;
}



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

адрес процедуры не в твоем процессе, а в удаленном. lpMemory-hModule+Code

Автор: 586 6.4.2008, 06:33
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");

Автор: asd 7.4.2008, 06:41
G0L1a7h
Вам сюда http://rootkits.ru/viewtopic.php?id=181&words=

Автор: G0L1a7h 7.4.2008, 09:39
Блин.. ребят незнаю =\

Цитата

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")

Почему?

Автор: asd 7.4.2008, 09:51
G0L1a7h
тыб тему то прочитал. там есть код, для релокации образов.

Автор: 586 7.4.2008, 12:38
Цитата(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);

Автор: BreakPoint 30.4.2010, 22:29
Может эта статья помжет:
http://blog.f5soft.com/внедрение-кода-в-сторонний-процесс/

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

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

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

Автор: EvilsInterrupt 2.5.2010, 20:01
Цитата

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

 smile  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)