Проблема с CsrClientCallServer
|
|
Волк-1024 | Дата: Вторник, 05.06.2012, 19:16 | Сообщение # 1 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Всем привет. В общем я делаю на основе статей с васма инжект образа в системный процесс. Сделал почти всё, кроме уведомления процесса csrss.exe с помощью недокументированной функции CsrClientCallServer.
Я создаю замороженный нативный поток с помощью функции RtlCreateUserThread. Сначало хотел с помощью NtCreateThread, но сней возникал большой гемор со стеком. Cоздаю удалённый поток:
Code NtStatus:=RtlCreateUserThread(hProcess, nil, true, 0, nil, nil, EntryPoint, ImageBase, @hThread, @ClientID); if NtStatus=NT_SUCCESS then begin .. Замороженный поток успешно содается. Далее делаю уведомление csrss.exe о его наличи. (В принципе это делать не обязательно т.к и без неё инжект происходит нормально, но я где-то прочёл, что если это не сделать, то могут возникнуть определённые проблемы так сказать: "Аномалии")
Вот:
Code ..
begin RtlZeroMemory(@BaseApiMsg, SizeOf(BaseApiMsg)); BaseApiMsg.u.BaseCreateThread.hThread:=hThread; BaseApiMsg.u.BaseCreateThread.ClientID.UniqueProcess:=ClientID.UniqueProcess; BaseApiMsg.u.BaseCreateThread.ClientID.UniqueThread:=ClientID.UniqueThread; CsrClientCallServer(@BaseApiMsg, nil, $10001, SizeOf(BaseApiMsg.u.BaseCreateThread)); if NtStatus=NT_SUCCESS then begin NtStatus:=NtResumeThread(hThread, nil); if NtStatus=NT_SUCCESS then Result:=hThread; Так вот CsrClientCallServer вернёт NT_SUCCESS только в том случае, если инжект будет произведён в юзерский процесс. Если инжектить, например, в svchost.exe то она вернёт: $C0000001 - STATUS_UNSUCCESSFUL. Т.е она не смогла оповестить csrss.exe о потоке. Я с начало подумал что опять со структурами накосячил т.к до этого она всегда возвращала эту ошибку пока я не нашел более-менее правильные структуры. И теперь я хз что делать может флаг какой нужно установить - хз. Всё бы ничего если инфы по ней в нете небыло почти ноль, а если и есть инфа, то она вся на C/C++. Единсвенное, что я нашел на Делфи это вот здесь: Доступно только для пользователей и то не то, что нужно. ПРеВаД код выложу позже, когда всё доделается.
Структуры были переписаны мной с С++ кода. Поэтому за правильность не ручаюсь
-----------------------
И еще один вопрос, что-бы не создавать новую тему. Почему при обращении к глобальной строковой переменной из инжектированного образа программа падает?. Если, например, создать обычный поток в программе и от туда обращаться, то все нормально. ?. И еще один У кого есть есть инфа насчет изменение релоков образа программы в чужой памяти? Инфы по релокам тоже ноль.
Сообщение отредактировал Волк-1024 - Вторник, 05.06.2012, 19:36 |
|
| |
Волк-1024 | Дата: Среда, 06.06.2012, 12:20 | Сообщение # 2 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Есть идеи?
|
|
| |
C@T | Дата: Среда, 06.06.2012, 17:29 | Сообщение # 3 |
Авторитетный
Зарегистрирован: 06.03.2010
Группа: Модераторы
Сообщений: 265
Статус: Offline
| По релокам инфы предостаточно http://www.insidepro.com/kk/019/019r.shtml , а что насчет обращения к переменным, это все из-за того что переменные в твоей проге при компиляции пробиты по уже заведомо известным адрессам, а в чужем процессе по этим адрессам будет либо мусор, либо просто запрещенная(не инициализированная) область памяти, для этого существует дельта смещение(да и вообще код желательно делать в виде шелл кода, чтобы не возникало подобных проблем(там и релокейшены пропадут))
P.S винда не разрешает создавать потоки в системном процессе из юзермодного, но зато позволяет там инициализировать память и изменять ее
|
|
| |
Волк-1024 | Дата: Среда, 06.06.2012, 17:50 | Сообщение # 4 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Quote при компиляции пробиты по уже заведомо известным адрессам, а в чужем процессе по этим адрессам будет либо мусор, либо просто запрещенная Но я инжектирую полный образ своей программы например по адресу 14500000 т.е туда, где память не занята, а если занята, то освобождаю её: Code NtStatus:=NtFreeVirtualMemory(hProcess, @ImageBase, @Size, MEM_RELEASE); И компилирую свой файл с таким же адресом загрузки Code {$IMAGEBASE $14500000} По идее всё должно быть нормально.
Quote винда не разрешает создавать потоки в системном процессе из юзермодного Странно в свхост.exe создаёт поток. В другие крит. процессы почему-то нет...
Quote да и вообще код желательно делать в виде шелл кода Не вариант. Проще застрелиться...
Сообщение отредактировал Волк-1024 - Среда, 06.06.2012, 17:53 |
|
| |
C@T | Дата: Среда, 06.06.2012, 19:00 | Сообщение # 5 |
Авторитетный
Зарегистрирован: 06.03.2010
Группа: Модераторы
Сообщений: 265
Статус: Offline
| Волк-1024, а ты одну секцию или же все грузишь ?
|
|
| |
Волк-1024 | Дата: Среда, 06.06.2012, 19:24 | Сообщение # 6 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Все.
P.S. что бы было всё понятно:
Сообщение отредактировал Волк-1024 - Среда, 06.06.2012, 19:30 |
|
| |
Волк-1024 | Дата: Пятница, 08.06.2012, 21:35 | Сообщение # 7 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Фух. Так ничего и не получилось
|
|
| |