Внедрение в чужой процесс, проблема с call

Тема в разделе "WASM.RESEARCH", создана пользователем furang, 22 окт 2009.

  1. furang

    furang New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2006
    Сообщения:
    11
    Здравствуйте!
    Вот столкнулся с проблемой. Необходимо внедрится в чужой процесс, записать туда шеллкод, записать аргумент и выполнить свой код в чужом процессе со своим аргументом. Вот код
    Код (Text):
    1. int ololol(char *str)
    2. {
    3.         FILE* f;
    4.         int res;
    5.         char olo1[50];
    6.         char olo2[50];
    7.         void* strmem;
    8.         DWORD codemem,dwExitCode=0;
    9.         char shellcode[]=
    10.         "\x60\x9C\xBA\xB0\x05\x27\x01\x8B\x12\x8B\x92\x94\x2D\x00\x00"// pusshad; pushfd; mov edx, 12705B0; mov edx,[edx]; mov edx,[edx+2D94]
    11.         "\x64\xA1\x2C\x00\x00\x00\x8B\x00\x89\x50\x08\x6A\x00"// mov eax,FS:[2C]; mov eax,[eax]; mov [eax+8],edx; push 0;
    12.         "\xB8\x78\x56\x34\x12\x50\x50\xE8\x88\xF6\x7C\x00\x83\xC4\x0C"//mov eax,12345678; push eax; push eax; call 7CF6B0; add esp, C
    13.         "\x9D\x61\xC3\x90";//popfd; popad; retn; nop;
    14.         f=fopen("D:\\crack\\hiew\\code.txt","wb");// для отладки
    15.         ReadProcessMemory( hProc, (LPVOID)(0x0133D5B0), (LPVOID)&res, sizeof(res), NULL );
    16.         while (res!=0)
    17.         {
    18.         ReadProcessMemory( hProc, (LPVOID)(0x0133D5B0), (LPVOID)&res, sizeof(res), NULL );
    19.         Sleep(0);
    20.         }
    21.         SuspendThread(mThread);//тормозим удаленный поток
    22.         strmem=VirtualAllocEx(hProc,NULL,1024,MEM_COMMIT,PAGE_READWRITE);//выделяем память под аргумент
    23.         if (strmem==NULL)
    24.         ShowMessage("Can't alloc some mem1");
    25.         ShowMessage(HexToStr((DWORD)strmem));// showing me str addr
    26.         WriteProcessMemory(hProc, strmem,&str[0],100,NULL);
    27.    
    28.         codemem=(DWORD)VirtualAllocEx(hProc,NULL,1024,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
    29.         if (codemem==NULL)
    30.         ShowMessage("Can't alloc some mem2");
    31.         ShowMessage(HexToStr((DWORD)codemem));
    32.         WriteProcessMemory(hProc, (LPVOID)codemem,&shellcode[0],sizeof(shellcode),NULL);
    33.         WriteProcessMemory(hProc, (LPVOID)(codemem+29),&strmem,sizeof(codemem),NULL);// корректируем адресс аргумента
    34.        
    35.         ReadProcessMemory( hProc, (LPVOID)(codemem), (LPVOID)&olo1[0], 50, NULL );//для отладки
    36.         ReadProcessMemory( hProc, (LPVOID)(strmem), (LPVOID)&olo2[0], 50, NULL );// для отладки
    37.  
    38.         fwrite(&olo1[0],1,50,f);//для отладки
    39.         fwrite(&olo2[0],1,50,f);//для отладки
    40.         ShowMessage("Пристегнуть ремни. Создаем поток!");
    41.         HANDLE rThread=CreateRemoteThread(hProc,NULL,0,(LPTHREAD_START_ROUTINE)codemem,NULL,0,NULL);
    42.         if (rThread==NULL) ShowMessage("Не удалось создать поток!");
    43.         if (WaitForSingleObject(rThread, 10000) == WAIT_OBJECT_0)
    44.         if (!GetExitCodeThread(rThread, &dwExitCode)) ShowMessage("Не получен код завершения");
    45.         CloseHandle(rThread);
    46.        
    47.         ResumeThread(mThread);
    48.         if(!VirtualFreeEx(hProc,(LPVOID)strmem,0,MEM_RELEASE)) ShowMessage ("Can't free mem");
    49.         if(!VirtualFreeEx(hProc,(LPVOID)codemem,0,MEM_RELEASE)) ShowMessage ("Can't free mem");
    50.         fclose(f);
    51.         return 0;
    52. }
    Код отрабатывает, но вешает чужой процесс. При чем ошибки совершенно разные. То ILLEGAL_INSTRUCTION, то ACCESS_VIOLATION. В шеллкоде есть call (CALL 007CF6B0). Без него все нормально работает, поток создается, шеллкод отрабатывает, поток завершается. Это меня заставляет думать что все проблема в нем.
    Как я понял опкод call - E8XXXXXXXX, где XXXXXXXX=физ адресс функции в удаленном файле - физ адресс след оператора. Но шеллкод постоянно внедряется по новому адрессу.
    Подскажите пожалуйсто кто знает как на лету скорректировать этот адресс. Виртуальный адресс шеллкода найти можно. по смещению 38 к нему этот адресс. Это надо получить физ адресс следующей за call команды и от физ адресса вызываемой функции отнять его? Или я где-то ошибаюсь? Поправьте если что. Уже 2 недели маюсь.
     
  2. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    furang
    У тебя не правильно собирается инструкция CALL

    Код (Text):
    1. xxx: CALL Func
    xxx- адрес инструкции
    Func- адрес кого надо вызвать
    должно быть представлено как E8, delta
    где delta=Func-xxx-5

    Взял бы отладчик и посмотрел
     
  3. furang

    furang New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2006
    Сообщения:
    11
    Значит все-таки я был прав что call всему виной.
    Все немного осложнено тем, что "буяню" я в чужом процессе.
    Func - известен ее физический адресс
    xxx - мжно найти виртуальный адресс
    Вот что меня смущает. Если отнимать от физ адресса виртуальный или наоборот, то получится каша не хуже моей.
    Как я понимаю чтоб получить физ адресс xxx от него надо отнять 0x00400000?
     
  4. loginrl_103

    loginrl_103 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2008
    Сообщения:
    271
    база смещения вроде описывается в формате pe?
     
  5. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Какие еще физические адреса о_0 ?
    Статьи читал ?))
    Там везде виртуальные адреса. Тебе Rustem все написал.
    Если не хочешь считать дельту делай mov eax, Func; call eax. Тогда это будет абсолютный адрес.
    Смотри формат команды call...
     
  6. furang

    furang New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2006
    Сообщения:
    11
    Этот физ адресс я получил когда в IDA дизасемблил.
    Я понял что везде виртуальные. Посему и спросил как правильно поступить... За совет спасибо. уже чувствую что это именно то, что мне надо))
     
  7. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
     
  8. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Не знаю как вы, но я под физическим адресом понимаю адрес в оперативке)
     
  9. furang

    furang New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2006
    Сообщения:
    11
    Всем спасибо. Под чутким руководством dead_body и не без помощи этого топа http://wasm.ru/forum/viewtopic.php?id=35004 все разрешилось. Пришлось вручную высчитывать и корректировать call (E8 XXXXXXXX).
     
  10. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    что там высчитывать то? два адреса, да константа! тебе Rustem всё расписал
     
  11. Ox8BFF55

    Ox8BFF55 New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2009
    Сообщения:
    181
    А бряку поставить??
    О посмотреть opcode???
    Дамп в конце концов......