Подскажите где я ошибься:с внедрением в чужой процесс

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 31 дек 2011.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Что то ни как не получаеться выполнить внедренный код
    Код (Text):
    1. int noncrt_strcmpW(wchar_t *s1,wchar_t *s2)
    2. {
    3.     while ( *s1 && *s2 && *s1 == *s2 )
    4.                 ++s1, ++s2;
    5.         return *s1 - *s2;
    6. }
    7. DWORD GetKernel32Base()
    8. {
    9.     DWORD k32b=0;
    10.     DWORD PEBadr=0;
    11.     __asm
    12.     {
    13.         mov ecx,FS:[30h]
    14.         mov PEBadr,ecx
    15.     }
    16.     PEB *peb=(PEB*)PEBadr;
    17.     PEB_LDR_DATA *ldr=(PEB_LDR_DATA*)peb->LoaderData;
    18.     LDR_MODULE *mod=(LDR_MODULE *)ldr->InInitializationOrderModuleList.Flink;
    19.     for(;;)
    20.     {
    21.         if(mod->BaseDllName.Buffer==NULL){break;}
    22.         if(noncrt_strcmpW(L"kernel32.dll",mod->BaseDllName.Buffer)==0 || noncrt_strcmpW(L"KERNEL32.dll",mod->BaseDllName.Buffer)==0)
    23.         {
    24.             k32b=(DWORD)mod->BaseAddress;  
    25.         }
    26.         mod=(LDR_MODULE *)mod->ModuleList.Flink;
    27.     }
    28.     return(k32b);
    29. }
    30. struct Rem
    31. {
    32.     DWORD LoadLibraryRVA;
    33.     DWORD GetProcAddressRVA;
    34.     DWORD Base;
    35. };
    36. typedef int (WINAPI *_MessageBoxW)(
    37.     __in_opt HWND hWnd,
    38.     __in_opt LPCWSTR lpText,
    39.     __in_opt LPCWSTR lpCaption,
    40.     __in UINT uType);
    41.  
    42. __declspec(dllexport) DWORD __stdcall OutSider(LPVOID lParam)
    43. {
    44.     Rem *rem=(Rem*)lParam;
    45.     DWORD kernel=GetKernel32Base();
    46.     if(kernel!=0)
    47.     {
    48.     _LoadLibrary LoadL=(_LoadLibrary)(kernel+rem->LoadLibraryRVA);
    49.     _GetProcAddress GetP=(_GetProcAddress)(kernel+rem->GetProcAddressRVA);
    50.     HMODULE user32=LoadL("user32.dll");
    51.     _MessageBoxW MsgB=(_MessageBoxW)GetP(user32,"MessageBoxW");
    52.     MsgB(0,L"Hello world!!!",L"",MB_OK);
    53.     }
    54.     return 0;
    55. }
    56. DWORD WINAPI StartThr(LPVOID lParam)
    57. {
    58.     wchar_t *patch=(wchar_t *)lParam;
    59.     STARTUPINFO si={0};
    60.     PROCESS_INFORMATION pi={0};
    61.     BOOL success=FALSE;
    62.     si.cb = sizeof(si);
    63.     si.dwFlags = STARTF_USESHOWWINDOW;
    64.     si.wShowWindow = SW_SHOW;
    65.     success = CreateProcess( NULL, patch, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
    66.     DWORD sbase=(DWORD)GetModuleHandle(NULL);
    67.     IMAGE_NT_HEADERS *nt= (IMAGE_NT_HEADERS *) ( ((IMAGE_DOS_HEADER*)sbase)->e_lfanew+sbase);
    68.     DWORD Inside=(DWORD)VirtualAllocEx(pi.hProcess,0,nt->OptionalHeader.SizeOfImage,MEM_COMMIT | MEM_RESERVE | MEM_TOP_DOWN, PAGE_EXECUTE_READWRITE);
    69.     void* image=(void*)CreateBuffedImaged(Inside,nt);
    70.     DWORD w=0;
    71.     WriteProcessMemory(pi.hProcess,(void*)Inside,(char*)image,nt->OptionalHeader.SizeOfImage,&w);
    72.     HMODULE kernel=GetModuleHandle(L"kernel32.dll");
    73.     Rem rem={0};
    74.     rem.Base=Inside;
    75.     rem.GetProcAddressRVA=((DWORD)GetProcAddress(kernel,"GetProcAddress"))-(DWORD)kernel;
    76.     rem.LoadLibraryRVA=((DWORD)GetProcAddress(kernel,"LoadLibraryA"))-(DWORD)kernel;
    77.     void *RemInside=VirtualAllocEx(pi.hProcess,0,1024*4,MEM_COMMIT | MEM_RESERVE | MEM_TOP_DOWN,PAGE_READWRITE);
    78.     w=0;
    79.     WriteProcessMemory(pi.hProcess,RemInside,&rem,sizeof(rem),&w);
    80.     DWORD insideFunc=( ((DWORD)&OutSider)-sbase )+Inside;
    81.     CreateRemoteThread(pi.hProcess,NULL,0,(LPTHREAD_START_ROUTINE)insideFunc,RemInside,0,0);
    82.     return 0;
    83. }
    PrepareImage.h
    Код (Text):
    1. DWORD BuffedImage=0;
    2. DWORD deltaBase=0;
    3. IMAGE_NT_HEADERS *NT;
    4.  
    5. void fixrelocs(DWORD deltabase,DWORD sizerel,char *exebody,char *relocsec,IMAGE_SECTION_HEADER *stabs,DWORD secnum)
    6.     {
    7.         IMAGE_BASE_RELOCATION *ir;
    8.         WORD val=0;
    9.         DWORD sm=0;
    10.         DWORD ptfix=0,ptsec=0;
    11.         for(;;)
    12.         {
    13.             ir=(IMAGE_BASE_RELOCATION *)relocsec;
    14.             relocsec+=sizeof(IMAGE_BASE_RELOCATION);
    15.             for(int j=0;j<secnum;j++)
    16.             {
    17.                 if(ir->VirtualAddress>=stabs[j].VirtualAddress &&  ir->VirtualAddress<stabs[j+1].VirtualAddress)
    18.                 {
    19.                     ptfix=(ir->VirtualAddress-stabs[j].VirtualAddress)+stabs[j].PointerToRawData;
    20.                     break;
    21.                 }
    22.             }
    23.             for(int i=0;i<(ir->SizeOfBlock-sizeof(IMAGE_BASE_RELOCATION))/sizeof(WORD);i++)
    24.             {
    25.                 val=( (WORD*)relocsec)[i];
    26.                 exebody+=ptfix+(val & 0x0fff);
    27.                 if((val & 0x0fff)!=0)
    28.                 {
    29.                     *(DWORD*)exebody=(*(DWORD*)exebody)+deltabase;
    30.                 }
    31.                 exebody-=ptfix+(val & 0x0fff);
    32.             }
    33.             relocsec-=sizeof(IMAGE_BASE_RELOCATION);
    34.             if(ir->SizeOfBlock==0)
    35.             {
    36.                 relocsec+=sizeof(IMAGE_BASE_RELOCATION);
    37.                 sm=sm+sizeof(IMAGE_BASE_RELOCATION);
    38.             }
    39.             else
    40.             {
    41.                 relocsec+=ir->SizeOfBlock;
    42.                 sm=sm+ir->SizeOfBlock;
    43.             }
    44.             if(sm==sizerel)
    45.             {
    46.                 relocsec-=sizerel;
    47.                 break;
    48.             }
    49.         }
    50.  
    51.     }
    52. DWORD BuildImage()
    53. {
    54.     DWORD adr;
    55.     wchar_t imgpatch[256];
    56.     GetModuleFileName(NULL,imgpatch,256);
    57.     adr=(DWORD)VirtualAlloc(0,NT->OptionalHeader.SizeOfImage,MEM_COMMIT | MEM_RESERVE | MEM_TOP_DOWN, PAGE_EXECUTE_READWRITE);
    58.     HANDLE f=CreateFile(imgpatch,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    59.     if(f!=INVALID_HANDLE_VALUE)
    60.     {
    61.         LARGE_INTEGER sz={0};
    62.         GetFileSizeEx(f,&sz);
    63.         char *buf=new char[sz.QuadPart];
    64.         DWORD r=0;
    65.         ReadFile(f,buf,sz.QuadPart,&r,0);
    66.         IMAGE_SECTION_HEADER *sec=(IMAGE_SECTION_HEADER *) ( ((DWORD)NT)+sizeof(IMAGE_NT_HEADERS));
    67.         memcpy((void*)adr,buf,NT->FileHeader.SizeOfOptionalHeader);
    68.         char *relocs;
    69.         for(int i=0;i<NT->FileHeader.NumberOfSections;i++)
    70.         {
    71.             buf+=sec[i].PointerToRawData;
    72.             memcpy((void*)(adr+sec[i].VirtualAddress),buf,sec[i].Misc.VirtualSize);
    73.             if(NT->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress==sec[i].VirtualAddress)
    74.             {
    75.                 relocs=buf;
    76.             }
    77.             buf-=sec[i].PointerToRawData;
    78.         }
    79.         if(deltaBase!=0)
    80.         {
    81.             fixrelocs(deltaBase,NT->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size,(char*)adr,relocs,sec,NT->FileHeader.NumberOfSections);
    82.         }
    83.         delete []buf;
    84.     }
    85.     CloseHandle(f);
    86.     return adr;
    87. }
    88.  
    89. DWORD CreateBuffedImaged(DWORD InsaderBase,IMAGE_NT_HEADERS *nt)
    90. {
    91.     NT=nt;
    92.     BuffedImage=BuildImage();
    93.     deltaBase=InsaderBase-nt->OptionalHeader.ImageBase;
    94.     return BuffedImage;
    95. }
    1.Внутри чужого процесса почему то неполучаеться получить базу kernel32
    2.Если передавать тупо адреса LoadLibrary и GetProcAddress.То адрес в коде MsgB всеравно остаеться равным 0.Хотя и вызова по адресам LoadLibrary и GetProcAddress,из родительского приложения не приводят вк икслючениям.
    Что я упустил?
     
  2. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Не хочу никого тут обижать,НО!!!
    То ли на васме осталось только одно школие,и тролли.
    Или я слишком много ТЕКСТА написал((((((((((((
    ЗЫ:судя по данным с гугла.
     
  3. Kaimi

    Kaimi Андрей

    Публикаций:
    0
    Регистрация:
    15 апр 2010
    Сообщения:
    120
    А что ты ждешь? Оформление кода так себе, читать неприятно, комментариев в коде нет.
    Статей по теме можно найти приличное количество, да и в книгах описано вроде как.
    Если все как будто правильно, но не работает, то имеет смысл переписать код с нуля (я так иногда поступаю).
     
  4. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    да вот к примеру:
    Код (Text):
    1. DWORD GetKernel32Base()
    2. {
    3.     DWORD k32b=0;
    4.     DWORD PEBadr=0;
    5.     __asm
    6.     {
    7.         mov ecx,FS:[30h]
    8.         mov PEBadr,ecx
    9.     }
    10.     PEB *peb=(PEB*)PEBadr;
    11.     PEB_LDR_DATA *ldr=(PEB_LDR_DATA*)peb->LoaderData;
    12.     LDR_MODULE *mod=(LDR_MODULE *)ldr->InInitializationOrderModuleList.Flink;
    13.     for(;;)
    14.     {
    15.         if(mod->BaseDllName.Buffer==NULL){break;}
    16.         if(noncrt_strcmpW(L"kernel32.dll",mod->BaseDllName.Buffer)==0 || noncrt_strcmpW(L"KERNEL32.dll",mod->BaseDllName.Buffer)==0)
    17.         {
    18.             k32b=(DWORD)mod->BaseAddress;    
    19.         }
    20.         mod=(LDR_MODULE *)mod->ModuleList.Flink;
    21.     }
    22.     return(k32b);
    Я вот не вьезжаю почему этот код заинжекченный в дочерний процесс не работает.Кто то может обьяснить в теории почему не работает?
     
  5. Kaimi

    Kaimi Андрей

    Публикаций:
    0
    Регистрация:
    15 апр 2010
    Сообщения:
    120
    А кто мешает взять OllyDbg, скачать плагин StrongOD, загрузить в Olly какую-нибудь программку, с помощью StrongOD инжектнуть длл в процесс и потрассировать?
    Впадлу отладчиком пользоваться - поставь мессаджбоксы в коде и выводи всякие полезные вещи.
    Или хотя бы структуры выложи, которыми пользуешься.
     
  6. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Немогу я мессаджбоксы использовать, импорт еще не настроен.
    1.Прога внедряет свой образ,а не длл.
    2.Запускаеться дочерний процесс.
    3.В нем выдкляеться память под образ.
    4.Сосздаеться образ,настраиваються релоки под "базу" в АП дочернего процесса.
    5.Образ записываеться в выделенное место.
    6.Высчитываеться адрес ф-ции на которую будет переданно управление.
    7.Заполняеться структура с RVA LoadLibrary, GetProcAddress и "базой" в АП дочернего процесса.
    8.Выделяеться место в АП дочернего процесса,и записываеться в него вышеназванная структура.

    А вот внутри ф-ции нихрена неработает.Может у кого то есть идеи почему?

    Вобщем вот проект,кому интересно будет, http://rghost.ru/35703063
     
  7. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Загрузчик не инициализирован.
     
  8. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Что конкретно в образе нада инициализировать?
     
  9. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    В образе - ничего. Но ознакомится с работой загрузчика стоит. Тем более что я тут весьма много описал этого, специально чтобы таких дурацких вопросов небыло.
     
  10. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Причем тут вообще загрузчик???
     
  11. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    _nic
    Я думал что у вас процесс создаётся с остановленным тредом, судя по сурсу это не так. Вообще чтение этого кодеса вызывает блевотные спазмы. Хотя бы для начала проверять возвращаемые значения стоит. А в общем работоспособность этого кода зависит от фазы луны. Тут без отладчика ничего не будет.