Воскресенье, 22.12.2024, 12:00 Приветствую вас Гость | Группа "Гости" 
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: xXxSh@dowxXx, Anton93, Волк-1024  
Проблема с 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++. cry
Единсвенное, что я нашел на Делфи это вот здесь: Доступно только для пользователей и то не то, что нужно. ПРеВаД код выложу позже, когда всё доделается. biggrin

Структуры были переписаны мной с С++ кода. Поэтому за правильность не ручаюсь biggrin


-----------------------

И еще один вопрос, что-бы не создавать новую тему. Почему при обращении к глобальной строковой переменной из инжектированного образа программа падает?. Если, например, создать обычный поток в программе и от туда обращаться, то все нормально. ?. И еще один biggrin У кого есть есть инфа насчет изменение релоков образа программы в чужой памяти? Инфы по релокам тоже ноль. sad


Сообщение отредактировал Волк-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
Фух. Так ничего и не получилось sad
 
  • Страница 1 из 1
  • 1
Поиск:

delphicode.ru © 2008 - 2024 Хостинг от uCoz