Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
1

Запуск программы с системным именем

28.12.2015, 18:02. Показов 1904. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет.
Наткнулся на одну программу..
Интересует реализация некой функции, которую она использует.
А именно: при запуске самой программы exe, она запускает сама себя, но уже неизвестно где!
То есть тот exe уже полностью свободен и изменяем (программа иногда загружает обновления на место старого exeшника).
А в процессах он висит как системный.
Тоесть считывает файлы в C\Windows\System32 и ставит себя вместо системных файлов, но не заменяет!
Только в процессах висит как файл из системы, но если открыть расположение файла, это будет действительно системный файл, а не тот exe.
Лично для меня это очень интересная фишка и хорошая защита от дебага, реверсинга.
Как-то смотрел к чему обращается программа и наблюдал переполнение буфера в реестре. Где именно не помню.

Файл прикрепляю. (прога упакована vmprotect'ом)
Вложения
Тип файла: rar hUBg7xAEnK2.rar (2.28 Мб, 9 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.12.2015, 18:02
Ответы с готовыми решениями:

Запуск скрипта под системным пользователем на всех компьютерах домена
Нужно запустить скрипт: в гпо автозагрузку он добавлен, но многие свои компьютеры не перезагружают,...

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

Пример программы для работы с системным реестром (установить в автозагрузку)
нид код проги которая роботает из системным реестром

Запуск студией и запуск самой виндой. Разница работы программы
Итак, проблема такова: есть проект, который замечательно работает при нажатии F5 в студии. При...

21
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
28.12.2015, 18:23 2
Цитата Сообщение от ziqp Посмотреть сообщение
А именно: при запуске самой программы exe, она запускает сама себя, но уже неизвестно где!
"Неизвестно где" - так не бывает. Exe-файл откуда-то да запущен.
Узнать можно через GetModuleFileNameEx (программно) или через "открыть
расположение файла" (диспетчер задач).

Цитата Сообщение от ziqp Посмотреть сообщение
А в процессах он висит как системный.
Регистрируем службу, запускаем ее и передаем ей параметры для работы.
PsExec так делает, к примеру.

Цитата Сообщение от ziqp Посмотреть сообщение
Тоесть считывает файлы в C\Windows\System32 и ставит себя вместо системных файлов, но не заменяет!
Только в процессах висит как файл из системы, но если открыть расположение файла, это будет действительно системный файл, а не тот exe.
Ничего не понятно.
Ставит себя вместо системных файлов, но не заменяет - это как?
Это будет действительно системный файл, а не тот exe - это как?

Цитата Сообщение от ziqp Посмотреть сообщение
Лично для меня это очень интересная фишка и хорошая защита от дебага, реверсинга.
Никак это ни от дебага, ни от реверсинга не защищает. Максимум может
вызвать легкое недоумение.
3
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
29.12.2015, 06:59  [ТС] 3
Неизвестно где - значит пользователь не знает где он запущен.
Узнать можно через GetModuleFileNameEx (программно) или через "открыть
расположение файла" (диспетчер задач).
В том то и дело. Если попытаться открыть расположение файла, то он выведет на один их системных, но не на сам оригинальный exe. Он спуфит процесс в диспетчере так, что это как бы и есть этот процесс, но он ведет на системный файл при открытии расположения.
Он не запускается как системный, а вместо системного файла, не заменяя его.
Почему это он не защищает от дебага? Как его вообще читать если он обходит тот же ollydbg, но открывается!?
0
управление сложностью
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
29.12.2015, 08:55 4
Цитата Сообщение от ziqp Посмотреть сообщение
Почему это он не защищает от дебага? Как его вообще читать если он обходит тот же ollydbg, но открывается!?
Но вы же должны разбираться в архитектуре ОС ? Как можно подменить адрес в памяти, тем более что это все происходит на нижнем уровне ? Вы либо не отдупляете что вам пишут, либо не совсем корректно выражаете свою мысль по этому поводу.
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
29.12.2015, 14:00 5
Цитата Сообщение от ziqp Посмотреть сообщение
Если попытаться открыть расположение файла, то он выведет на один их системных, но не на сам оригинальный exe. Он спуфит процесс в диспетчере так, что это как бы и есть этот процесс, но он ведет на системный файл при открытии расположения.
А, ну это известный хак. Можно в PEB поменять путь к процессу или вообще
понаписать туда неизвестно чего, тогда другие программы будут обламываться.
Но у любого процесса все равно остается связанная с его exe объект-секция,
вот ее уже никуда не спрячешь (хотя переименовать или переместить можно).

Цитата Сообщение от ziqp Посмотреть сообщение
Почему это он не защищает от дебага? Как его вообще читать если он обходит тот же ollydbg, но открывается!?
Потому что на Olly свет клином не сошелся. Я могу запустить этот файл на виртуалке с
подключенным отладчиком ядра и ковырять его так, как мне вздумается. А если у него
будет защита и от этого, я сделаю дамп виртуалки и все равно смогу посмотреть
внутренности запущенного файла, пусть и в статике. А если у него защита от запуска на
виртуальных машинах, тогда я включу для VMware твик monitor_control.restrict_backdoor
и снова окажусь в дамках. И т.д. Потому что 100% скрыть то, что запускается локально
на компьютере пользователя, невозможно в принципе.
3
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
29.12.2015, 14:55  [ТС] 6
Про дебаг понял. Как реализовать данный хак? Или хотябы его название чтобы погуглить
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
29.12.2015, 15:02 7
Ищи инфу по структурам процессов и потоков - PEB, TEB, NT_TIB, PEB_LDR_DATA и т.д.
Вот здесь есть очень много полезного:

NirSoft
http://www.nirsoft.net/about_nirsoft_freeware.html

Часть структур документирована в MSDN, но, как правило, не полностью.
Я обычно вбиваю в гугл примерно так: "PEB nirsoft" или "PEB undocumented"
и выхожу на нужную страницу NirSoft-а с описанием этой структуры.

Почти все структуры можно раскопать через отладчик, при условии, что ты
подключил PDB-символы Microsoft. Например, вот такая команда в WinDBG
показывает структуру PEB:

dt ntdll!_PEB (и далее адрес, если нужно)

В PEB хранится три связных списка загруженных модулей, командная строка
процесса, полный путь к его exe, еще номер версии Windows, причем не
искаженный виртуализацией и compatibility shims, там же LoaderLock
(критическая секция, которая захватывается при загрузке-выгрузке dll, а
также при создании и уничтожении потоков), переменные окружения, и вообще
еще куча всего интересного.

Многие функции Windows берут данные именно из PEB, а не откуда-то еще.
0
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
29.12.2015, 15:09  [ТС] 8
Небольшое просвещение...
можно сделать в юзермоде это добраться через NtQueryInformationProcess до Peb.ProcessParameters и изменить имя в самом процессе через WriteProcessMemory
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
29.12.2015, 15:12 9
Да.
Если ты делаешь это для своего процесса, WriteProcessMemory не нужен.
0
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
29.12.2015, 18:14  [ТС] 10
Вот нашел такой код.
Буду благодарен если поможете разобраться с вызовом NtQueryInformationProcess:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//I load and call
typedef DWORD (WINAPI *PNtQueryInformationProcess)( HANDLE,PROCESSINFOCLASS, PVOID, ULONG, PULONG);
PNtQueryInformationProcess NtQueryInformationProcess;
 
HMODULE NtDllMod;
HMODULE kernelDllMod;
NtDllMod=LoadLibrary("ntdll.dll");
if (NtDllMod==NULL)
{
//Do error
}
//get NtQueryInformationProcess address from NTDLL
*NtQueryInformationProcess=(PNtQueryInformationProcess)GetProcAddress(NtDllMod,"NtQueryInformationProcess");
//if we failed
if (NtQueryInformationProcess==0)
{
//Do Error
 
}
 
UCHAR* m_pBuffer;   //Buffer for ProcessInformation
HANDLE hProcess;    //HANDLE for the process
ULONG retBytes=0;   //return bytes from ProcessQueryInfo
 
//Here we are going to open the process and read the memory to get the 
//process creation parameters inside the Process Environment Block
//the parameter we are wanting is the Process Name
 
//allocate a buffer for reading PROCESS_BASIC_INFORMATION memory of process
m_pBuffer=(UCHAR*)VirtualAlloc((void*)0x100000,sizeof(PROCESS_BASIC_INFORMATION),MEM_COMMIT,PAGE_READWRITE);
 
//Open the process for Reading
hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,(unsigned long)appProcessID);
    
//if we failed
if (hProcess==NULL)
{
//Do error
}
            
//calll ntqueryprocess to get the ProcessInformation
if (NtQueryInformationProcess(hProcess,ProcessBasicInformation,m_pBuffer,sizeof(PROCESS_BASIC_INFORMATION),&retBytes)!=0)
{
//Do error 
}
    
//cast buffer
PROCESS_BASIC_INFORMATION* pSysProcess=(PROCESS_BASIC_INFORMATION*)m_pBuffer;
 
PEB pProcPEB;
//read the process's memory to get the Process Environment Block's address
RetP=ReadProcessMemory(hProcess,pSysProcess->PebBaseAddress,&pProcPEB,sizeof(PEB),&retBytes);
    
RTL_USER_PROCESS_PARAMETERS pProcParam;
//read the process memory's parameter block
RetP=ReadProcessMemory(hProcess,pProcPEB.ProcessParameters,&pProcParam,sizeof(RTL_USER_PROCESS_PARAMETERS),&retBytes);
RTL_USER_PROCESS_PARAMETERS* pProcParam2=(RTL_USER_PROCESS_PARAMETERS*)pProcPEB.ProcessParameters;
 
 
 
//SNIP!
 
FreeLibrary(NtDllMod);
Что указывать в параметрах NtQueryInformationProcess(****);?

Добавлено через 3 минуты
блин запутался. уже не могу понять та ли это команда
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
29.12.2015, 18:22 11
Для начала попробуй вытянуть нужные данные из PEB своего процесса.
Это проще и не требует лазить по чужому адресному пространству.
0
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
30.12.2015, 07:50  [ТС] 12
Как это сделать? Никак не могу найти подобные исходники в нете. И если нахожу, они часто не по теме (по другой части PEB)

Добавлено через 2 минуты
Так же чаще нахожу примеры для студии
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
30.12.2015, 15:23 13
Цитата Сообщение от ziqp Посмотреть сообщение
Как это сделать?
1. Находишь PEB с помощью NtQueryInformationProcess. Или другим способом.

2. Читаешь из PEB интересующие тебя поля.
Некоторые поля лежат по фиксированному смещению на всех версиях Windows,
другие "плавают".

Цитата Сообщение от ziqp Посмотреть сообщение
Никак не могу найти подобные исходники в нете.
Исходники Process Hacker могу порекомендовать, там много интересного есть.
2
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
31.12.2015, 07:41  [ТС] 14
Исходники Process Hacker могу порекомендовать, там много интересного есть.
Да, будет полезно

Добавлено через 16 часов 12 минут
Нашел некий пример, который достает данные о процессе через NtQueryInformationProcess и ReadProcessMemory().
Я так понимаю мне нужно достать Path of Process Image File и перезаписать его?
0
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
13.05.2017, 07:42  [ТС] 15
Небольшой вопрос.. адресное пространство PEB находится в адресном пространстве самого процесса?
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
13.05.2017, 08:11 16
PEB - это структура, которая расположена в адресном пространстве процесса.
Кстати, у 32-битного процесса на 64-битной Винде два PEB-а, один 32-битный, второй 64-битный...
0
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
19.05.2017, 18:35  [ТС] 17
Все, дошел я до PEB. Но до ProcessParameters дойти не смог.
Пробовал через Cheat engine найти стоки в памяти "Имя файла.exe" чтобы понять, по какому адресу в памяти находится информация. Поменял все это, но в диспетчере как было старое имя, так и осталось.
Также смотрел по структуре начиная с адреса 7EFDF000 (узнал его через тулзу ProcessPEBFinder) где посмотрел по каким смещениям что находится (здесь: https://www.aldeid.com/wiki/PE... ment-Block). И все же нужной информации там нет. Почитал ниже на этом сайте можно найти тот самый блок памяти через windbg командой dt ntdll!_PEB, но мой windbg такую команду не принял и сказал, что что-то не хватает. Через ollydbg не догадываюсь как искать.
Параметры разрядности которые всегда выполняются: OS Windows x64, процесс x32.
Далее здесь нашел информацию https://github.com/sochka/Proc... onitor.cpp как можно найти на c++, но там я начал догадываться, что смещение зависит от архитектуры процессора по этим строкам
C++
1
2
3
// use WinDbg "dt ntdll!_PEB" command and search for ProcessParameters offset to find the truth out
    DWORD ProcessParametersOffset = si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ? 0x20 : 0x10;
    DWORD CommandLineOffset = si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ? 0x70 : 0x40;
И все же там тоже пишут использовать dt ntdll!_PEB.
Как наконец можно узнать адрес параметров процесса? Не важно, будет он меняться с каждым запуском или нет, т. к. найти указатель не составит труда
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
19.05.2017, 18:43 18
Цитата Сообщение от ziqp Посмотреть сообщение
Поменял все это, но в диспетчере как было старое имя, так и осталось.
А диспетчер не обязан читать адресное пространство и/или PEB процесса для получения его имени.
Он может, например, запросить название процесса через системные функции NtQueryXxx.
А они вообще дергают ядро...

Цитата Сообщение от ziqp Посмотреть сообщение
И все же нужной информации там нет.
Она есть. Как минимум, в двух местах - в списке модулей и в RTL_USER_PROCESS_PARAMETERS.

Цитата Сообщение от ziqp Посмотреть сообщение
Почитал ниже на этом сайте можно найти тот самый блок памяти через windbg командой dt ntdll!_PEB, но мой windbg такую команду не принял и сказал, что что-то не хватает.
Возможно, не хватает отладочных символов. Они точно настроены?

Кстати, еще проще так:
Код
!peb
Только надо учитывать, что у WOW64-процессов два PEB: один 64-битный, второй 32-битный.

Цитата Сообщение от ziqp Посмотреть сообщение
Как наконец можно узнать адрес параметров процесса?
Каких параметров? Командную строку? Так она тоже хранится в RTL_USER_PROCESS_PARAMETERS.
0
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
19.05.2017, 21:27  [ТС] 19
Так, вроде бы понял.
У меня есть адрес PEB(7EFDF000).
Залез через windbg и увидел:
+0x020 ProcessParameters : Ptr64 _RTL_USER_PROCESS_PARAMETERS
Это значит, что то что мне нужно, находится здесь? 7EFDF020
Далее через cheat engine можно посмотреть, что идет переадресация.
Если превратить данные из 7EFDF020 в текст, можно получить "p4" (ранее было p20 и т д, только что это..)
Если перейти на указатель, то 4 байта памяти выдает число 5154 (это точно не pid). Текст выдает бессмыслицу.
Вот только если это те данные, то где проверять, работает это или нет? Через PidByName пробовать искать (не работает)?

Добавлено через 1 час 31 минуту
И еще, та программа меняла свое расположение, что было видно именно в диспетчере задач. И когда я нажимал открыть дирректорию файла, он именно открывал фейковую, а не свою
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
19.05.2017, 21:47 20
Не надо это делать "вслепую". Структуры PEB, RTL_USER_PROCESS_PARAMS и др.
частично документированы:

struct PEB
https://www.nirsoft.net/kernel... a/PEB.html

struct RTL_USER_PROCESS_PARAMETERS
https://www.nirsoft.net/kernel... ETERS.html

В PEB хранится указатель на RTL_USER_PROCESS_PARAMETERS.
В RTL_USER_PROCESS_PARAMETERS есть поля ImagePathName и CommandLine,
там UNICODE_STRING (может, кстати, не завершаться нулем).

И, кстати, какова конечная цель всех этих манипуляций?
Допустим, нашли PEB, вытащили командную строку и т.д., а что дальше?
0
19.05.2017, 21:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.05.2017, 21:47
Помогаю со студенческими работами здесь

Поиск и запуск файлов с определённым именем
Здравствуйте. Помогите реализовать батник. Требуется следующее: Есть много файлов с одним и тем...

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

Запуск из программы с админскими привилегиями внешней программы без прав админа
Нужно в программе которая запущенна под амином запустить другую программу без прав админа.

Как удалить ссылку на запуск программы при удалении программы
Всем привет! Для установки - удаления программ использую такие пакеты как InstallShield и Advanced...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru