Сейчас на форуме: tyns777 (+5 невидимых)

 eXeL@B —› Программирование —› lpParameter для Thread
Посл.ответ Сообщение

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

Создано: 11 марта 2011 11:24
· Личное сообщение · #1

Подскажите пожалуйста, есть ли какой нибудь метод указать lpParameter для уже созданного удаленного потока (CreateRemoteThread)?

Обычно мы его указывает когда создаем поток, а есть ли какой нибудь способ указать его когда поток уже создан, но еще не выполнен (создан SUSPENDED)? Кроме махинаций с GetThreadContext, получением rEsp и записыванием параметра напрямую в стек...




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 11 марта 2011 12:51
· Личное сообщение · #2

Какова цель? Если требуется множественные параметры , то можно сделать предварительно коллгэйт и передать все сразу, а потом уже запускать CreateRemoteThread с указателем на шеллкод ...

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




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

Создано: 11 марта 2011 13:13
· Личное сообщение · #3

mak пишет:
Какова цель?


Цель - простая, передать параметры другому процессу, во время инжекта... Только сделать это красиво, и без лишнего кода.. Ты прав, создать еще один CreateRemoteThread и передать параметры из него - это выход, но хотелось бы все сделать без дополнительного потока.

Кстати, вот тут что нарыл. Когда поток создан с помощью CreateRemoteThread, по умолчанию, Eip у этого потока стоит на RtlUserThreadStart, которая (на вин 7 по крайней мере, для x32 процесса) принимает два параметра, но принимает их не через stdcall/стек, а через регистры EAX и EBX.
EAX - код с которого надо начать выполнение потока (твой код)
EBX - как раз тот параметр, который передается твоему коду.

Получается то что я спрашивал, можно сделать, установив необходимые значение регистров EAX и EBX контекста этого потока...
Но проблема в том что на XP функции RtlUserThreadStart нет.. надо будет разбираться...




Еще одна проблема... после создания процесса по ZwCreateUserProcess, до отпускания его основного потока по ZwResumeThread никак нельзя узнать все модули загруженные в этот процесс, CreateToolHelp32SnapShot возвращает ошибку PARTIAL_COPY... нет какого нибудь решения узнать список модулей...? Или хотя бы ImageBase от ntdll.dll?




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

Создано: 11 марта 2011 13:21
· Личное сообщение · #4

Хытрые манипуляции с контекстом суспенженого потока могут не быть совместимыми с разными защитами, типа аверов/фаеров, не рекомендуется так делать.
ntdll не релоцируется, бери локальную базу.




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 11 марта 2011 13:39
· Личное сообщение · #5

Может поможет приложение внизу по мульти параметрам.

Enigma пишет:
Еще одна проблема... после создания процесса по ZwCreateUserProcess, до отпускания его основного потока по ZwResumeThread никак нельзя узнать все модули загруженные в этот процесс, CreateToolHelp32SnapShot возвращает ошибку PARTIAL_COPY... нет какого нибудь решения узнать список модулей...? Или хотя бы ImageBase от ntdll.dll?


На какой винде тест? 64 или 32? Пеб Лодер лист может?


4a07_11.03.2011_CRACKLAB.rU.tgz - createremotethreadex.zip

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





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

Создано: 11 марта 2011 13:45
· Личное сообщение · #6

Список модулей в пеб не поможет, до инициализации первого потока он не заполнен.



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

Создано: 11 марта 2011 13:54
· Личное сообщение · #7

Archer пишет:
Хытрые манипуляции с контекстом суспенженого потока могут не быть совместимыми с разными защитами, типа аверов/фаеров, не рекомендуется так делать.


Так а че же делать... если не манипулировать контекстом, то придется создавать свой удаленный поток. А для фаеров мне кажется пофиг, что ты контекстом манипулируешь, что удаленный поток создаешь, все равно как бы опасность и то и другое..

Как же тогда вообще в процесс инжектится, чтобы аверов не рассердить?

Archer пишет:
ntdll не релоцируется, бери локальную базу


Вообще в ntdll.dll есть релоки, Relocations are stripped не установлено, так что фактически, она может быть загружена куда угодно...

mak пишет:
Может поможет приложение внизу по мульти параметрам.


Это как бы не особо универсально

mak пишет:
На какой винде тест? 64 или 32?


x64

mak пишет:
Пеб Лодер лист может?


Точно, вот это в точку, спасибо!




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 11 марта 2011 14:06 · Поправил: mak
· Личное сообщение · #8

Перечисление страниц памяти тогда ? И гетмодулфайлнэйм ?

Enigma пишет:
mak пишет:
На какой винде тест? 64 или 32?

x64


ууу , тогда так и чувствовал , там есть замут какой то с CreateToolHelp32SnapShot и партиал копи , это описано в МСДНе , нужно полистать .. хз тогда

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




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

Создано: 11 марта 2011 14:13
· Личное сообщение · #9

mak пишет:
Перечисление страниц памяти тогда ? И гетмодулфайлнэйм ?


Да, получается что без перечисления никуда... про CreateToolHelp32SnapShot и x64 тоже читал, но думал это происходит только когда вызываешь CreateToolHelp32SnapShot из x86 процесса для x64.

Хотя заметил одну итересную штуку, если после ZwCreateUserProcess приаттачится к новому процессу со второй олькой (первая даже процесса на этой стадии не видит), Alt + M - показывает все модули. Там наверное как раз и идет перечисление страниц.




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

Создано: 11 марта 2011 14:15
· Личное сообщение · #10

Дело не в том, что фаерам/аверам не понравится твой код, это само собой. А в том, что некоторые сами так делают, и твой код тупо не будет работать, если игрища с контекстом будут.
Ты плохо слушаешь, нтдлл НЕ релоцируется. И не в релоках дело, а в концепте ос, туда коллбеки из ядра приходят.
З.Ы. гетмодулфайлнэйм, который тут посоветовали, тоже ходит по пебу, тогда уж GetMappedFileName

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


Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 11 марта 2011 14:22
· Личное сообщение · #11

Enigma вот я сорс выкладывал с поиском модуля через перечисление страниц

https://ssl.cracklab.ru/f/action=vthread&forum=6&topic=17825&page=0#30

как бы для основы.

-----
Yann Tiersen best and do not fuck





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 11 марта 2011 15:49
· Личное сообщение · #12

Enigma
При создании потока адрес, с которого каждый поток начинает выполнение, заносится в структуру ETHREAD, точные смещения для конкретной версии ОС можно из отладочных символов узнать, так вот подменив его, можно не выполнять игры с контекстом и (в теории) добиться желаемого. Но сам я этого не проверял. Эти поля описаны у Руссиновича, под рукой щас инфы нет, если есть интерес, то позже могу глянуть.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 11 марта 2011 17:11
· Личное сообщение · #13

Это информационные поля, которые можно получить либо изменить через NtSetInformationThread. На выполнение они дальше после KeInitThread влияния не оказывают.

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

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

Создано: 12 марта 2011 19:12
· Личное сообщение · #14

Alchemistry пишет:
Это информационные поля, которые можно получить либо изменить через NtSetInformationThread. На выполнение они дальше после KeInitThread влияния не оказывают.


А какой именно класс для NtSetInformationThread? Я пролазил, но вроде ничего такого не нашел...?



Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 12 марта 2011 19:18 · Поправил: Alchemistry
· Личное сообщение · #15

ThreadQuerySetWin32StartAddress

соотв. NtQueryInformationThread для получения и
NtSetInformationThread для установки

Поле ETHREAD->Win32StartAddress, см в отладчике.
Опять же ничего кроме информации из этого вытянуть врядли выйдет.

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

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

Создано: 12 марта 2011 19:23
· Личное сообщение · #16

Alchemistry пишет:
ThreadQuerySetWin32StartAddressсоотв. NtQueryInformationThread для получения и NtSetInformationThread для установки


Но это все равно малость не то. Тут мы можем поменять адрес с которого поток начнется (хотя мне и это тоже надо, спасибо), а мне бы хотелось поменять еще и парамерт, который передается функции обработки потока...




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 13 марта 2011 03:58
· Личное сообщение · #17

Enigma По поводу lpParameter , а что если использовать указатель на структуру с параметрами?!
Мутили еще с передачей параметров над RtlRemoteCall , там тоже есть ограничение на параметры вроде , но эту функцию рипали и переделывали ...

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 13 марта 2011 09:38 · Поправил: Alchemistry
· Личное сообщение · #18

Все что делает ваша RtlRemoteCall это последовательность NtSuspendThread->NtGetThreadContext->NtWriteVirtualMemory->NtSetThreadContext->NtResumeThread.

Предварительно поток и процесс еще надо открыть с правами на суспенд и запись в память.
Сосредоточьтесь



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

Создано: 02 апреля 2011 14:12
· Личное сообщение · #19

Хотелось бы подвести точку в этой теме, может кому пригодится...

Поменять парамерт для потока (удаленного), после того как он создан, одной простой функцией нельзя. Да и адрес с которого начнется выполнение в удаленного потоке просто так поменять тоже нельзя.

Единственное как можно все это сделать, перехватить ZwResumeThread для этого потока и поменять регистры контекста Eax и Ebx.
Eax - должен содержать адрес обработчика потока
Ebx - как раз тот парамерт для потока

Но тут тоже не все гладко.. в Виндовз 2000, парамерт Ebx игнорируется, и его (парамерт для потока) установить нельзя...



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

Создано: 02 апреля 2011 14:18
· Личное сообщение · #20

Может кто еще подскажет, надо выполнить инжект exe файла в другой процесс, при это образ
оригинального файла надо удалить... Процесс выглядит так:

1. создаем процесс ZwCreateUserProcess('process.exe');
2. удаляем образ process.exe в процессе через ZwUnmapViewOfSection
3. делаем инжект своего inject.exe
4. корректируем PEB.ImageBase в удаленном процессе
5. перехватом ZwResumeThread корректируем начало исполнения кода на свой inject.exe

но вот потом, при вызове ZwResumeThread этот процесс падает с ошибкой... Если не делать #2 то все нормально, наш процесс запускается нормально.. В чем тут может быть дело...?




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 02 апреля 2011 14:23
· Личное сообщение · #21

Для DLL надо еще править EntryPoint в списке модулей в PEB, возможно в данном случае это тоже нужно делать.

-----
Yann Tiersen best and do not fuck




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

Создано: 02 апреля 2011 14:29
· Личное сообщение · #22

PE_Kill пишет:
Для DLL надо еще править EntryPoint в списке модулей в PEB, возможно в данном случае это тоже нужно делать.


Для длл - понятно, а вот если инжектить не длл а главный образ exe...?

Тем более что тут задача еще усложняется тем что:
1. списки всех модулей в пеб еще не инициализированы, они просто пустые.. Они заполняются только после ZwResumeThread а там надо до него все сделать..
2. Оля не аттачится к процессу после его создания с ZwCreateUserProcess.. вываливает ошибку.. аттачится только после ZwResumeThread.. т.е. тяжко отследить где именно падает..



Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 02 апреля 2011 16:01
· Личное сообщение · #23

Enigma пишет:
1. списки всех модулей в пеб еще не инициализированы, они просто пустые.. Они заполняются только после ZwResumeThread а там надо до него все сделать..

-- на сколько помнится про сам exe + ntdll + kernel(base) там уже есть инфо.
Enigma
- вообще по запуску exe из памяти куча примеров в сети.
1. создаем процесс ZwCreateUserProcess('process.exe');
-suspend + читаем контекст осн. потока
2. удаляем образ process.exe в процессе через ZwUnmapViewOfSection
-- после чего выделяем память по адресу ep, если возможно
3. делаем инжект своего inject.exe
--пишем в выделенную память
4. корректируем PEB.ImageBase в удаленном процессе
--не надо, если по EP память удалось выделить, если нет - релоки обрабатываем
5. перехватом ZwResumeThread корректируем начало исполнения кода на свой inject.exe
-- просто пишем контекст и resume

-----
продавец резиновых утёнков





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 02 апреля 2011 21:15
· Личное сообщение · #24

HiEndsoft пишет:
-- на сколько помнится про сам exe + ntdll + kernel(base) там уже есть инфо.

В разных виндах по разному, но в основном указатель на список модулей на тот момент вообще равен нулю.

-----
Yann Tiersen best and do not fuck




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

Создано: 03 апреля 2011 13:47 · Поправил: Enigma
· Личное сообщение · #25

HiEndsoft пишет:
4. корректируем PEB.ImageBase в удаленном процессе--не надо, если по EP память удалось выделить, если нет - релоки обрабатываем


Если удалось выделить - то конечно не надо, а во всех остальных случаях - обязательно. Потому что GetModuleHandle(nil) берет значение как раз из пеб..

HiEndsoft пишет:
5. перехватом ZwResumeThread корректируем начало исполнения кода на свой inject.exe-- просто пишем контекст и resume


И процесс вываливается с ошибкой...

Делая все тоже самое, но без ZwUnmapViewOfSection - все работает как часы, если с ZwUnmapViewOfSection - то валимся в ошибке черт знает где и никак эту гадость не отладить, дебагеры не аттачатся к процессу в это время...




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

Создано: 03 апреля 2011 14:19
· Личное сообщение · #26

Отлаживай через ринг0. Или попробуй 2 ольку, она пораньше цепляться к процессу может, вроде.



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

Создано: 03 апреля 2011 14:33
· Личное сообщение · #27

Archer пишет:
Отлаживай через ринг0.


Так и придется через неудобный WinDbg...


Archer пишет:
Или попробуй 2 ольку, она пораньше цепляться к процессу может, вроде.


Она тоже не аттачится. Первая олька даже процесса не видит, созданного после ZwCreateUserProcess, вторая процесс видит, а приаттачится не может.


 eXeL@B —› Программирование —› lpParameter для Thread
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати