Что то ни как не получаеться выполнить внедренный код Код (Text): int noncrt_strcmpW(wchar_t *s1,wchar_t *s2) { while ( *s1 && *s2 && *s1 == *s2 ) ++s1, ++s2; return *s1 - *s2; } DWORD GetKernel32Base() { DWORD k32b=0; DWORD PEBadr=0; __asm { mov ecx,FS:[30h] mov PEBadr,ecx } PEB *peb=(PEB*)PEBadr; PEB_LDR_DATA *ldr=(PEB_LDR_DATA*)peb->LoaderData; LDR_MODULE *mod=(LDR_MODULE *)ldr->InInitializationOrderModuleList.Flink; for(;;) { if(mod->BaseDllName.Buffer==NULL){break;} if(noncrt_strcmpW(L"kernel32.dll",mod->BaseDllName.Buffer)==0 || noncrt_strcmpW(L"KERNEL32.dll",mod->BaseDllName.Buffer)==0) { k32b=(DWORD)mod->BaseAddress; } mod=(LDR_MODULE *)mod->ModuleList.Flink; } return(k32b); } struct Rem { DWORD LoadLibraryRVA; DWORD GetProcAddressRVA; DWORD Base; }; typedef int (WINAPI *_MessageBoxW)( __in_opt HWND hWnd, __in_opt LPCWSTR lpText, __in_opt LPCWSTR lpCaption, __in UINT uType); __declspec(dllexport) DWORD __stdcall OutSider(LPVOID lParam) { Rem *rem=(Rem*)lParam; DWORD kernel=GetKernel32Base(); if(kernel!=0) { _LoadLibrary LoadL=(_LoadLibrary)(kernel+rem->LoadLibraryRVA); _GetProcAddress GetP=(_GetProcAddress)(kernel+rem->GetProcAddressRVA); HMODULE user32=LoadL("user32.dll"); _MessageBoxW MsgB=(_MessageBoxW)GetP(user32,"MessageBoxW"); MsgB(0,L"Hello world!!!",L"",MB_OK); } return 0; } DWORD WINAPI StartThr(LPVOID lParam) { wchar_t *patch=(wchar_t *)lParam; STARTUPINFO si={0}; PROCESS_INFORMATION pi={0}; BOOL success=FALSE; si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOW; success = CreateProcess( NULL, patch, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); DWORD sbase=(DWORD)GetModuleHandle(NULL); IMAGE_NT_HEADERS *nt= (IMAGE_NT_HEADERS *) ( ((IMAGE_DOS_HEADER*)sbase)->e_lfanew+sbase); DWORD Inside=(DWORD)VirtualAllocEx(pi.hProcess,0,nt->OptionalHeader.SizeOfImage,MEM_COMMIT | MEM_RESERVE | MEM_TOP_DOWN, PAGE_EXECUTE_READWRITE); void* image=(void*)CreateBuffedImaged(Inside,nt); DWORD w=0; WriteProcessMemory(pi.hProcess,(void*)Inside,(char*)image,nt->OptionalHeader.SizeOfImage,&w); HMODULE kernel=GetModuleHandle(L"kernel32.dll"); Rem rem={0}; rem.Base=Inside; rem.GetProcAddressRVA=((DWORD)GetProcAddress(kernel,"GetProcAddress"))-(DWORD)kernel; rem.LoadLibraryRVA=((DWORD)GetProcAddress(kernel,"LoadLibraryA"))-(DWORD)kernel; void *RemInside=VirtualAllocEx(pi.hProcess,0,1024*4,MEM_COMMIT | MEM_RESERVE | MEM_TOP_DOWN,PAGE_READWRITE); w=0; WriteProcessMemory(pi.hProcess,RemInside,&rem,sizeof(rem),&w); DWORD insideFunc=( ((DWORD)&OutSider)-sbase )+Inside; CreateRemoteThread(pi.hProcess,NULL,0,(LPTHREAD_START_ROUTINE)insideFunc,RemInside,0,0); return 0; } PrepareImage.h Код (Text): DWORD BuffedImage=0; DWORD deltaBase=0; IMAGE_NT_HEADERS *NT; void fixrelocs(DWORD deltabase,DWORD sizerel,char *exebody,char *relocsec,IMAGE_SECTION_HEADER *stabs,DWORD secnum) { IMAGE_BASE_RELOCATION *ir; WORD val=0; DWORD sm=0; DWORD ptfix=0,ptsec=0; for(;;) { ir=(IMAGE_BASE_RELOCATION *)relocsec; relocsec+=sizeof(IMAGE_BASE_RELOCATION); for(int j=0;j<secnum;j++) { if(ir->VirtualAddress>=stabs[j].VirtualAddress && ir->VirtualAddress<stabs[j+1].VirtualAddress) { ptfix=(ir->VirtualAddress-stabs[j].VirtualAddress)+stabs[j].PointerToRawData; break; } } for(int i=0;i<(ir->SizeOfBlock-sizeof(IMAGE_BASE_RELOCATION))/sizeof(WORD);i++) { val=( (WORD*)relocsec)[i]; exebody+=ptfix+(val & 0x0fff); if((val & 0x0fff)!=0) { *(DWORD*)exebody=(*(DWORD*)exebody)+deltabase; } exebody-=ptfix+(val & 0x0fff); } relocsec-=sizeof(IMAGE_BASE_RELOCATION); if(ir->SizeOfBlock==0) { relocsec+=sizeof(IMAGE_BASE_RELOCATION); sm=sm+sizeof(IMAGE_BASE_RELOCATION); } else { relocsec+=ir->SizeOfBlock; sm=sm+ir->SizeOfBlock; } if(sm==sizerel) { relocsec-=sizerel; break; } } } DWORD BuildImage() { DWORD adr; wchar_t imgpatch[256]; GetModuleFileName(NULL,imgpatch,256); adr=(DWORD)VirtualAlloc(0,NT->OptionalHeader.SizeOfImage,MEM_COMMIT | MEM_RESERVE | MEM_TOP_DOWN, PAGE_EXECUTE_READWRITE); HANDLE f=CreateFile(imgpatch,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); if(f!=INVALID_HANDLE_VALUE) { LARGE_INTEGER sz={0}; GetFileSizeEx(f,&sz); char *buf=new char[sz.QuadPart]; DWORD r=0; ReadFile(f,buf,sz.QuadPart,&r,0); IMAGE_SECTION_HEADER *sec=(IMAGE_SECTION_HEADER *) ( ((DWORD)NT)+sizeof(IMAGE_NT_HEADERS)); memcpy((void*)adr,buf,NT->FileHeader.SizeOfOptionalHeader); char *relocs; for(int i=0;i<NT->FileHeader.NumberOfSections;i++) { buf+=sec[i].PointerToRawData; memcpy((void*)(adr+sec[i].VirtualAddress),buf,sec[i].Misc.VirtualSize); if(NT->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress==sec[i].VirtualAddress) { relocs=buf; } buf-=sec[i].PointerToRawData; } if(deltaBase!=0) { fixrelocs(deltaBase,NT->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size,(char*)adr,relocs,sec,NT->FileHeader.NumberOfSections); } delete []buf; } CloseHandle(f); return adr; } DWORD CreateBuffedImaged(DWORD InsaderBase,IMAGE_NT_HEADERS *nt) { NT=nt; BuffedImage=BuildImage(); deltaBase=InsaderBase-nt->OptionalHeader.ImageBase; return BuffedImage; } 1.Внутри чужого процесса почему то неполучаеться получить базу kernel32 2.Если передавать тупо адреса LoadLibrary и GetProcAddress.То адрес в коде MsgB всеравно остаеться равным 0.Хотя и вызова по адресам LoadLibrary и GetProcAddress,из родительского приложения не приводят вк икслючениям. Что я упустил?
Не хочу никого тут обижать,НО!!! То ли на васме осталось только одно школие,и тролли. Или я слишком много ТЕКСТА написал(((((((((((( ЗЫ:судя по данным с гугла.
А что ты ждешь? Оформление кода так себе, читать неприятно, комментариев в коде нет. Статей по теме можно найти приличное количество, да и в книгах описано вроде как. Если все как будто правильно, но не работает, то имеет смысл переписать код с нуля (я так иногда поступаю).
да вот к примеру: Код (Text): DWORD GetKernel32Base() { DWORD k32b=0; DWORD PEBadr=0; __asm { mov ecx,FS:[30h] mov PEBadr,ecx } PEB *peb=(PEB*)PEBadr; PEB_LDR_DATA *ldr=(PEB_LDR_DATA*)peb->LoaderData; LDR_MODULE *mod=(LDR_MODULE *)ldr->InInitializationOrderModuleList.Flink; for(;;) { if(mod->BaseDllName.Buffer==NULL){break;} if(noncrt_strcmpW(L"kernel32.dll",mod->BaseDllName.Buffer)==0 || noncrt_strcmpW(L"KERNEL32.dll",mod->BaseDllName.Buffer)==0) { k32b=(DWORD)mod->BaseAddress; } mod=(LDR_MODULE *)mod->ModuleList.Flink; } return(k32b); Я вот не вьезжаю почему этот код заинжекченный в дочерний процесс не работает.Кто то может обьяснить в теории почему не работает?
А кто мешает взять OllyDbg, скачать плагин StrongOD, загрузить в Olly какую-нибудь программку, с помощью StrongOD инжектнуть длл в процесс и потрассировать? Впадлу отладчиком пользоваться - поставь мессаджбоксы в коде и выводи всякие полезные вещи. Или хотя бы структуры выложи, которыми пользуешься.
Немогу я мессаджбоксы использовать, импорт еще не настроен. 1.Прога внедряет свой образ,а не длл. 2.Запускаеться дочерний процесс. 3.В нем выдкляеться память под образ. 4.Сосздаеться образ,настраиваються релоки под "базу" в АП дочернего процесса. 5.Образ записываеться в выделенное место. 6.Высчитываеться адрес ф-ции на которую будет переданно управление. 7.Заполняеться структура с RVA LoadLibrary, GetProcAddress и "базой" в АП дочернего процесса. 8.Выделяеться место в АП дочернего процесса,и записываеться в него вышеназванная структура. А вот внутри ф-ции нихрена неработает.Может у кого то есть идеи почему? Вобщем вот проект,кому интересно будет, http://rghost.ru/35703063
В образе - ничего. Но ознакомится с работой загрузчика стоит. Тем более что я тут весьма много описал этого, специально чтобы таких дурацких вопросов небыло.
_nic Я думал что у вас процесс создаётся с остановленным тредом, судя по сурсу это не так. Вообще чтение этого кодеса вызывает блевотные спазмы. Хотя бы для начала проверять возвращаемые значения стоит. А в общем работоспособность этого кода зависит от фазы луны. Тут без отладчика ничего не будет.