Сейчас на форуме: Rio, tyns777, zombi-vadim (+7 невидимых)

 eXeL@B —› Программирование —› Полная инициализация процесса
Посл.ответ Сообщение


Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 11 августа 2014 12:59
· Личное сообщение · #1

В общем написал лодырь...
Цель, запустить процесс дождаться полной инициализации, заморозить, пропатчить в памяти.. и отпустить..
Вопрос, как поймать момент полной инициализации без запуска процесса?

WaitForInputIdle(pi.hProcess, INFINITE) не канает.. т.к. запускает процесс и патчить уже поздно.
WaitForSingleObject(pi.hProcess, INFINITE) срабатывает только если процесс завершен, тоже не канает.

Дрова не предлагать, нужен вариант из под юзермода...

Использую сейчас вариант

Code:
  1.                  invoke CreateProcess,NULL,chr$("proc.exe"),NULL,NULL,NULL,NORMAL_PRIORITY_CLASS,NULL,NULL,addr startInfo,addr processInfo
  2.                  .if eax == NULL
  3.                         call LastError
  4.                  .endif
  5.                  invoke Sleep,20
  6.                  invoke SuspendThread,processInfo.hThread
  7.                  .if eax == INVALID_HANDLE_VALUE
  8.                         call LastError
  9.                  .endif


Но Sleep крайне не надежен...

В общем, подскажите вариант... плиз..

-----
aLL rIGHTS rEVERSED!





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 11 августа 2014 13:09
· Личное сообщение · #2

И что мешает воткнуть eb fe на точку входа или бряк, если на дебаг апи?

| Сообщение посчитали полезным: Vovan666, OnLyOnE


Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 11 августа 2014 13:13
· Личное сообщение · #3

Archer

Умница) Ну тупанул.. щас спробую)

-----
aLL rIGHTS rEVERSED!




Ранг: 53.9 (постоянный), 33thx
Активность: 0.050
Статус: Участник

Создано: 11 августа 2014 13:20 · Поправил: deniskore
· Личное сообщение · #4

В своем лоадере использую следующую схему.
1) Беру адрес EntryPoint из PE header-a, далее CreateProcess (SUSPENDED | DEBUG)
2) Нахожу базовый адрес по которому загрузился.
3) Пишу привилегированные интсрукции на TLS и EP.
4) Отпускаю процесс, ловлю в дебаг ивенте свои инструкции, патчу нужные данные по оффсету от базы или поиском, восстанавливаю оригинальные байты на TLS или EP.
5) Отпускаю процесс.
При желании сюда же можно воткнуть анти-анти-дебаг




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 11 августа 2014 13:31
· Личное сообщение · #5

Archer
deniskore
Аналогично! Действеннее, проще и универсальнее ничего пока не находил. )

Ещё как вариант - перехватить выход из KiUserApcDispatcher. Перехват будет до NtSetInformationThread и тут можно сделать свои настройки. А можно перехватить NtSetInformationThread

-----
IZ.RU





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 11 августа 2014 13:32
· Личное сообщение · #6

Archer пишет:
И что мешает воткнуть eb fe на точку входа или бряк, если на дебаг апи?


Бро..(( такая тема.. дело в том, что мой ехе имеет релоки.. и их не вырезать.. т.к. чекается CRC.. под вин7 ехе может грузиться куда угодно..
Для того чтобы найти его в памяти... использую комбинацию из 3 пальцев))

Code:
  1.                  xor ebx,ebx
  2.                  mov me32.dwSize,sizeof MODULEENTRY32
  3.                  mov pe32.dwSize,sizeof PROCESSENTRY32
  4.  
  5.                  mov hProcess,FUNC(CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,NULL)
  6.                  _search_process_:
  7.                  .if  ebx != 1
  8.                  invoke Process32First,hProcess,addr pe32
  9.                  inc ebx
  10.                  jmp @F
  11.                  .endif
  12.                  invoke Process32Next,hProcess,addr pe32
  13.                  .if eax == NULL
  14.                         call LastError                  
  15.                  .endif          
  16.                  @@:
  17.                  invoke CharLower,addr pe32.szExeFile
  18.                  invoke lstrcmpi,addr pe32.szExeFile,chr$("proc.exe")
  19.                  .if eax != NULL
  20.                         jmp _search_process_
  21.                  .endif
  22.  
  23.                  mov hModule,FUNC(CreateToolhelp32Snapshot,TH32CS_SNAPMODULE,pe32.th32ProcessID)
  24.                  invoke Module32First,hModule,addr me32
  25.  
  26.                  invoke CloseHandle,hModule
  27.                  .if eax == NULL
  28.                         call LastError
  29.                  .endif
  30.                  invoke CloseHandle,hProcess
  31.                  .if eax == NULL
  32.                         call LastError
  33.                  .endif


только после этого смогу найти реальный адрес OEP ... но это после инициализации только..
т.к. не инициализированный процесс Module32First посылает нахер... ERROR_PARTIAL_COPY((

-----
aLL rIGHTS rEVERSED!





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 11 августа 2014 13:35
· Личное сообщение · #7

Указатель на PEB лежит в одном из регистров в контексте на CREATE_SUSPENDED, откуда можно выцепить базу. В х86 и х64 разные регистры, сходу не помню, ebx и rcx, что ли. А в eax на х86 сразу точка входа лежит. Да и было это всё на форуме уже.




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 11 августа 2014 13:37 · Поправил: DenCoder
· Личное сообщение · #8

OnLyOnE пишет:
но это после инициализации только

прочитай регистр eax у усыплённого процесса, и на 7ке он указывает на адрес OEP ))

Archer пишет:
В х86 и х64 разные регистры

Да, на x64 может быть другой, не rax. Не помню какой...

-----
IZ.RU





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 11 августа 2014 13:44
· Личное сообщение · #9

DenCoder пишет:
прочитай регистр eax у усыплённого процесса, и на 7ке он указывает на адрес OEP ))

у в какой момент читать? креатпроцесс возвращает 1 в еах)

-----
aLL rIGHTS rEVERSED!





Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 11 августа 2014 13:59 · Поправил: DenCoder
· Личное сообщение · #10

не креатпроцесс, а геттредконтекст!

Берёшь хендл потока из известной структуры для креатпроцесса твоего, берёшь геттредконтекст'ом значения регистров, смотришь eax )))

-----
IZ.RU


| Сообщение посчитали полезным: OnLyOnE


Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 11 августа 2014 14:04
· Личное сообщение · #11

ок сенкс. щас проверим

-----
aLL rIGHTS rEVERSED!




Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 11 августа 2014 14:21 · Поправил: Vovan666
· Личное сообщение · #12

OnLyOnE пишет:
под вин7 ехе может грузиться куда угодно..

при создания процесс CREATE_SUSPENDED
[EBX+8]=ImageBase




Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 11 августа 2014 14:28 · Поправил: ajax
· Личное сообщение · #13

DenCoder пишет:
берёшь геттредконтекст'ом значения регистров, смотришь eax

под x64 фуфло будет. хз почему - не копался
Vovan666
зная оффсет, или вычисляя по хеадеру - все относительно...
ps: --> http://code.google.com/p/injector/ <--

-----
От многой мудрости много скорби, и умножающий знание умножает печаль





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 11 августа 2014 14:36 · Поправил: OnLyOnE
· Личное сообщение · #14

Vovan666 пишет:
при создания процесс CREATE_SUSPENDED
[EBX+8]=ImageBase

Это я видел.

DenCoder пишет:
Берёшь хендл потока из известной структуры для креатпроцесса твоего, берёшь геттредконтекст'ом значения регистров, смотришь eax )))


GetThreadContext в еах == 1
а структура контекста обнуляется полностью..

-----
aLL rIGHTS rEVERSED!




Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 11 августа 2014 15:10 · Поправил: Vovan666
· Личное сообщение · #15

В общем как-то так
Code:
  1. .const
  2. hookbytes                 dw 0FEEBh
  3.  
  4. .data?
  5. pinfo                   PROCESS_INFORMATION <>
  6. sinfo          STARTUPINFO <>
  7.  
  8. .data?
  9. align dword
  10. threadcontext  CONTEXT <>
  11. backupb      db 2 dup(?)
  12.  
  13.  
  14. invoke CreateProcess,"target.exe","",0,0,0,CREATE_SUSPENDED,0,0,offset sinfo,offset pinfo
  15. invoke RtlZeroMemory,addr threadcontext,sizeof threadcontext
  16. mov threadcontext.ContextFlags,CONTEXT_FULL
  17. invoke GetThreadContext,pinfo.hThread,addr threadcontext
  18. mov eax,threadcontext.regEax
  19. add eax,38h
  20. invoke ReadProcessMemory,pinfo.hProcess,eax,addr oep,4h,0
  21. invoke ReadProcessMemory,pinfo.hProcess,[oep],addr backupb,2h,0
  22. invoke WriteProcessMemory,pinfo.hProcess,[oep],offset hookbytes,2h,0
  23. invoke ResumeThread,pinfo.hThread
  24. @@:
  25. invoke GetThreadContext,pinfo.hThread,addr threadcontext
  26. mov eax,[oep]
  27. cmp eax,threadcontext.regEip
  28. jnz @B
  29. invoke SuspendThread,pinfo.hThread
  30. invoke WriteProcessMemory,pinfo.hProcess,[oep],addr backupb,2h,0





Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 11 августа 2014 18:42 · Поправил: DenCoder
· Личное сообщение · #16

OnLyOnE пишет:
GetThreadContext в еах == 1

Не eax на выходе функции, ё-маё ))) А в структуре контекст поле DWORD Eax;

А то, что 1 возращает эта функция - это значит успех )

Код на Си
Code:
  1.          CONTEXT ctx;
  2.          ctx.ContextFlags = CONTEXT_INTEGER;
  3.          GetThreadContext(pi.hThread, &ctx);
  4.          DWORD dwOEP = ctx.Eax;


Vovan666
А что такое
Code:
  1. mov eax,threadcontext.regEax
  2. add eax,38h
? )

Смещение от EP к OEP ? Для какого-то хитрого пакера? )

-----
IZ.RU




Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 11 августа 2014 21:58
· Личное сообщение · #17

DenCoder пишет:
Смещение от EP к OEP ? Для какого-то хитрого пакера? )

х.з. но если CREATE_SUSPENDED = System breakpoint в ольке, то именно там оеп, а не просто в еах. писал от балды без проверке на жертве, т.к. всегда юзаю что-то типа
mov eax,threadcontext.regEbx
add eax,8h
invoke ReadProcessMemory,pinfo.hProcess,eax,addr oep,4h,0
add,[oep],EP




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 12 августа 2014 13:36
· Личное сообщение · #18

Vovan666
System breakpoint в ольке != CREATE_SUSPENDED.
1) Когда создаётся процесс с флагом CREATE_SUSPENDED, мы находимся на месте ещё перед стартом APC, который делает все необходимые инициализации, в том числе и импорт, и релоки, и TLS, если в хидере нет ошибок. )

2) Когда в ольке брякаешься на System breakpoint, часть инициализации в APC уже отработало.

В первом случае (забыл уже, где именно, но либо в ntdll создающего процесса, либо в ntoskrnl - давно реверсил) устанавливается контекст в создаваемом процессе, который сохраняется APC-рутиной для того, чтобы после инициализации установить его заново. И как раз на XP и 7ке x86 на этапе присваивания контекста в eax заносится EP программы (он же и OEP, если прога ничем не накрыта).

В общем, --> тут <-- я уже описывал, как найти EP созданного, пока спящего процесса.

-----
IZ.RU





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 12 августа 2014 13:50
· Личное сообщение · #19

Ну ЕP данного процесса мне и не надо было, имиджбазы более чем достаточно)

Code:
  1. mov eax,threadcontext.regEbx
  2. add eax,8h
  3. invoke ReadProcessMemory,pinfo.hProcess,eax,addr ImageBase,4h,0


Сделал так .. все заработало) 30% кода вырезал нахер)
Спасибо всем) Вопрос решен)

-----
aLL rIGHTS rEVERSED!



 eXeL@B —› Программирование —› Полная инициализация процесса
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати