Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.99/76: Рейтинг темы: голосов - 76, средняя оценка - 4.99
2 / 2 / 0
Регистрация: 31.10.2013
Сообщений: 17

Оперативная память и WinAPI (поиск строки в памяти процесса)

22.04.2015, 09:53. Показов 15750. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравстуйте.
Работаю с оперативной памятью и WinApi. Пытаюсь найти строчку в памяти запущенного процесса.
Естественно не получается. Код скинул ниже.
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <windows.h>
#include <iostream>
#include <psapi.h>//информация о памяти процесса
#include <fstream>//для вывода в документ адресов и значений по ним
using namespace std;
#pragma comment(lib, "psapi.lib")
 
//имя программы
#define PROGRAMM_NAME "jon@debian: ~"
 
 
//получить базовый адрес процесса
LPVOID GetBaseAddress(HANDLE hProc)
{
    //структура с информацией о процессе
    MODULEINFO miInfo;
 
    //получаем базовый адрес процесса
    if (GetModuleInformation(hProc, NULL, &miInfo, sizeof(miInfo)))
        return miInfo.EntryPoint;
    else
        return NULL;
}
 
//получить размер используемой памяти приложения(в байтах)
DWORD GetMemorySize(HANDLE hProc)
{
    //структура с информацией о процессе
    PROCESS_MEMORY_COUNTERS pmcInfo;
 
    //получаем информацию о процессе
    if (GetProcessMemoryInfo(hProc, &pmcInfo, sizeof(pmcInfo)))
        return (DWORD)pmcInfo.WorkingSetSize;
    else
        return 0;
}
 
 
void main()
{
    setlocale(LC_ALL, "Russian");//устанавливаем русский язык для вывода
 
    //ищем окно
    HWND hWnd = FindWindow(NULL, TEXT(PROGRAMM_NAME));
    if (!hWnd)
    {
        cout << "Программа не запущена.";
        return;
    }
 
    //получаем ID процесса
    DWORD dwPID;
    GetWindowThreadProcessId(hWnd, &dwPID);
    if (!dwPID)
    {
        cout << "Невозможно получить ID процесса.";
        return;
    }
 
    //получаем хэндл процесса
    HANDLE hProc;
    hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwPID);
    if (!hProc)
    {
        cout << "Невозможно получить хэндл процесса.";
        return;
    }
 
    //получаем начальный адрес процесса
    LPVOID dwStart = GetBaseAddress(hProc);
 
    //получаем размер занимаемой памяти
    DWORD dwMemSize = GetMemorySize(hProc);
    if (!dwMemSize)
    {
        cout << "Невозможно получить размер памяти, занимаемой приложением.";
        return;
    }
 
 
    cout << "Программа: "                    << PROGRAMM_NAME        << "\n"        <<
            "Handle Window: "                << hWnd                    << "\n"        <<
            "ProcessId: "                    << dwPID                << "\n"        <<
            "Handle Process: "                << hProc                << "\n"        <<
            "Начальный адрес: "                << dwStart                << "\n"        <<
            "Размер занимаемой памяти: "    << (dwMemSize / 1024)    << " кБ\n"    <<
            "\n\n\n\n";
 
    const char * signature = "192.168.56.101";      // Последовательность которую будем искать
    size_t len_signature = strlen (signature); // Длина последовательности.
    DWORD start = (DWORD)dwStart;//счётчик для цикла
    SIZE_T lpRead = 0;
 
    while(start < ((DWORD)dwStart + dwMemSize))
     {
        MEMORY_BASIC_INFORMATION mbi;
        
 
        int sz = VirtualQueryEx(hProc, (void *)start, &mbi, sizeof(MEMORY_BASIC_INFORMATION));
 
        if(     (mbi.State == MEM_COMMIT)            //если регион в состоянии передачи памяти
                &&                                    //и
                (mbi.Protect != PAGE_READONLY)        //регион не только для чнения
                &&                                    //и
                (mbi.Protect != PAGE_EXECUTE_READ)    //регион не тролько с исполнением программного кода и чтением
                &&                                    //и
                (mbi.Protect != PAGE_GUARD)            //регион без сигнала доступа к странице
                &&                                    //и
                (mbi.Protect != PAGE_NOACCESS)        //регион не защищён доступом к нему
                )//то
        {
           
            if(mbi.RegionSize != lpRead)
            {
                BYTE* lpData = (BYTE*)malloc(mbi.RegionSize);//резервируем место для массива lpData, размером в регион
                
                if(ReadProcessMemory(hProc, (LPCVOID)start, lpData, mbi.RegionSize, &lpRead))
                {
                   cout << "Поиск в регионе размером " << mbi.RegionSize << " байт\n";//поиск строки в массиве
                
                      BYTE *p = lpData;
                      while((p = (BYTE*)memchr(p, signature[0], mbi.RegionSize - len_signature + 1 - (p - lpData))) != 0)
                      {
                         if ( 0 == memcmp(p+1, signature + 1, len_signature - 1))
                         {
                            // найдено!!! в (p) адрес нашего буфера, где обнаружена последовательность.
                            // соответственно адрес в приложении равен: Start + (p - lpData);
                             printf("%d\n",lpData);
                         }
                         ++p;
                      }
 
                }
            }
        }
 
        start += mbi.RegionSize;//переходим на следующий регион
    }
 
    cout << "\nГотово.";
 
    //закрываем хэндл процесса
    CloseHandle(hProc);
}
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.04.2015, 09:53
Ответы с готовыми решениями:

Поиск Строки в памяти процесса
Помогите нужно найти адресс по строке в процессе

Поиск строки в памяти другого процесса
привет доброго времени суток из едит.текст1 читал строку (как аррай ,тип FD CD 22 32 EE 33 этого) и показал его адрес в мемо1 (если их...

Поиск строки в памяти запущенного процесса и её изменение
Подскажи пожалуйста, что я делаю не так. Вот мой код. #include &quot;windows.h&quot; #include &lt;iostream&gt; using namespace std; int...

37
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
29.01.2016, 14:04
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DaVillka Посмотреть сообщение
но что то оно ищет слишком долго
Вместо Sleep(50) поставь Sleep(500) - будет еще дольше.


Цитата Сообщение от DaVillka Посмотреть сообщение
и дико жрет оперативку
malloc есть, а free нету - память не очищается.
0
 Аватар для DaVillka
-1 / 8 / 6
Регистрация: 31.10.2015
Сообщений: 151
29.01.2016, 19:05
Убежденный, просто без слипа, он за секунду жрал всю оперативку)) А ищу я правильно?

Добавлено через 4 часа 14 минут
Убежденный,
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <windows.h>
#include <iostream>
#include <psapi.h>//информация о памяти процесса
#include <fstream>//для вывода в документ адресов и значений по ним
using namespace std;
#pragma comment(lib, "psapi.lib")
 
//имя программы
#define PROGRAMM_NAME "L2PacketHack v3.5.34.176 by CoderX.ru Team"
 
 
//получить базовый адрес процесса
LPVOID GetBaseAddress(HANDLE hProc)
{
    //структура с информацией о процессе
    MODULEINFO miInfo;
 
    //получаем базовый адрес процесса
    if (GetModuleInformation(hProc, NULL, &miInfo, sizeof(miInfo)))
        return miInfo.EntryPoint;
    else
        return NULL;
}
 
//получить размер используемой памяти приложения(в байтах)
DWORD GetMemorySize(HANDLE hProc)
{
    //структура с информацией о процессе
    PROCESS_MEMORY_COUNTERS pmcInfo;
 
    //получаем информацию о процессе
    if (GetProcessMemoryInfo(hProc, &pmcInfo, sizeof(pmcInfo)))
        return (DWORD)pmcInfo.WorkingSetSize;
    else
        return 0;
}
 
 
void main()
{
    setlocale(LC_ALL, "Russian");//устанавливаем русский язык для вывода
 
    //ищем окно
    HWND hWnd = FindWindow(NULL, TEXT(PROGRAMM_NAME));
    if (!hWnd)
    {
        cout << "Программа не запущена.";
        return;
    }
 
    //получаем ID процесса
    DWORD dwPID;
    GetWindowThreadProcessId(hWnd, &dwPID);
    if (!dwPID)
    {
        cout << "Невозможно получить ID процесса.";
        return;
    }
 
    //получаем хэндл процесса
    HANDLE hProc;
    hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwPID);
    if (!hProc)
    {
        cout << "Невозможно получить хэндл процесса.";
        return;
    }
 
    SYSTEM_INFO msi;
    GetSystemInfo(&msi); //тут я получаю состояние системы.
 
    //получаем начальный адрес процесса
    DWORD_PTR dwStart = (DWORD)msi.lpMinimumApplicationAddress;
 
    //получаем размер занимаемой памяти
    DWORD_PTR dwMemSize = (DWORD)msi.lpMaximumApplicationAddress;
    DWORD_PTR PageSize = 4096;
    if (!dwMemSize)
    {
        cout << "Невозможно получить размер памяти, занимаемой приложением.";
        return;
    }
 
 
    cout << "Программа: "                    << PROGRAMM_NAME        << "\n"        <<
            "Handle Window: "                << hWnd                    << "\n"        <<
            "ProcessId: "                    << dwPID                << "\n"        <<
            "Handle Process: "                << hProc                << "\n"        <<
            "Начальный адрес: "                << dwStart                << "\n"        <<
            "Размер занимаемой памяти: "    << (dwMemSize / 1024)    << " кБ\n"    <<
            "\n\n\n\n";
 
    const WCHAR * signature = L"l2ph.exe";      // Последовательность которую будем искать
    size_t len_signature = lstrlenW(signature) * sizeof(WCHAR); // Длина последовательности.
 
    DWORD start = (DWORD)dwStart;//счётчик для цикла
    SIZE_T lpRead = 0;
 
    while(start < ((DWORD)dwStart + dwMemSize))
     {
        MEMORY_BASIC_INFORMATION mbi;
        
 
        int sz = VirtualQueryEx(hProc, (void *)start, &mbi, sizeof(MEMORY_BASIC_INFORMATION));
 
        if(     (mbi.State == MEM_COMMIT)&&(mbi.Protect != PAGE_READONLY))
        {
            if(mbi.RegionSize != lpRead)
            {
                BYTE* lpData = (BYTE*)malloc(mbi.RegionSize);//резервируем место для массива lpData, размером в регион
                
                if(ReadProcessMemory(hProc, (LPCVOID)start, lpData, mbi.RegionSize, &lpRead))
                {
                   cout << "Поиск в регионе размером " << mbi.RegionSize << " байт\n";//поиск строки в массиве
                
                      BYTE *p = lpData;
                      while((p = (BYTE*)memchr(p, signature[0], mbi.RegionSize - len_signature + 1 - (p - lpData))) != 0)
                      {
                         if ( 0 == memcmp(p+1, signature + 1, len_signature - 1))
                         {
                            // найдено!!! в (p) адрес нашего буфера, где обнаружена последовательность.
                            // соответственно адрес в приложении равен: Start + (p - lpData);
                             printf("%d\n",lpData);
                            
                         }
                         ++p;
                      }
                }
                free(lpData);
            }
        }
 
        start += PageSize ;//переходим на следующий регион
    }
 
    cout << "\nГотово.";
 
    //закрываем хэндл процесса
    CloseHandle(hProc);
    system("Pause");
}
Добавил free, убрал слип, но ничего не находит, просто по кругу перебирает одни и те же регионы
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
30.01.2016, 07:04
Убери работу с регионами, они для поиска в памяти не нужны и только запутывают код.
У тебя есть адресное пространство диапазоном примерно 0-0x7FFFFFFF, поделенное
на страницы размером в 4К, отсюда и нужно "плясать": берешь по порядку каждую
страницу, смотришь ее атрибуты (VirtualQueryEx), если подходит - выполняешь в
ней поиск, потом переходишь к следующей странице. Все. Дополнительно можно учесть
ситуацию, когда искомая строка попадает на границу двух страниц, но это детали.

P.S.
В любом случае такой поиск не будет быстрым, а в 64-битных процессах может
вообще занимать часы.
0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
30.01.2016, 10:44
Цитата Сообщение от Убежденный Посмотреть сообщение
Атрибуты защиты памяти могут устанавливаться для отдельных страниц,
поэтому двигаться лучше по страницам, а не по регионам.
Почему? Ведь регион это область с одинаковыми атрибутами.
Цитата Сообщение от Убежденный Посмотреть сообщение
Все, что нужно проверять - это то, что страница закоммичена и
доступна на чтение.
А флаги PAGE_NOACCESS и PAGE_GUARD разве не нужно проверять? Имхо проверка должна быть такая:

C
1
2
3
4
5
6
if(     (mbi.State == MEM_COMMIT)            //если регион в состоянии передачи памяти
                &&                                    //и
                (mbi.Protect != PAGE_GUARD)            //регион без сигнала доступа к странице
                &&                                    //и
                (mbi.Protect != PAGE_NOACCESS)        //регион не защищён доступом к нему
                )
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
30.01.2016, 15:31
Цитата Сообщение от jupman Посмотреть сообщение
Ведь регион это область с одинаковыми атрибутами.
Нет. Атрибуты защиты устанавливаются отдельно для каждой страницы.
0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
30.01.2016, 19:35
Убежденный, хмм, я видимо чтото не догоняю, смотрите вот набросал код:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    {
        PVOID pMem = NULL;
        DWORD OldProtect;
        MEMORY_BASIC_INFORMATION MBI;
 
        pMem = VirtualAlloc(NULL,0x3000,MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE);
        if (!pMem) {
            GLE(L"VirtualAlloc");
            goto Error;
        }
 
        if(!VirtualProtect((PVOID)((DWORD_PTR)pMem+0x2000),0x1000,PAGE_READONLY,&OldProtect)) {
            GLE(L"VirtualProtect");
            goto Error;
        }
 
        if(!VirtualQuery(pMem,&MBI,sizeof(MBI))) {
            GLE(L"VirtualQueryEx");
            goto Error;
        }
 
        INF(L"MBI.RegionSize: 0x%0.8X",MBI.RegionSize);
    }
Выделяю три страницы RW, затем последнюю делаю Readonly. В лог выводится следующее:

[INF] MBI.RegionSize: 0x00002000
Что как-бы и доказывает что регион это область с одинаковыми атрибутами.

Вот описание MBI из MSDN: MEMORY_BASIC_INFORMATION. Цитаты:
RegionSize

The size of the region beginning at the base address in which all pages have identical attributes, in bytes.
Protect

The access protection of the pages in the region. This member is one of the values listed for the AllocationProtect member.
Добавлено через 22 минуты
Вот более наглядный пример:
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
    {
        PVOID pMem = NULL;
        DWORD OldProtect;
        MEMORY_BASIC_INFORMATION MBI;
 
        pMem = VirtualAlloc(NULL,0x3000,MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE);
        if (!pMem) {
            GLE(L"VirtualAlloc");
            goto Error;
        }
 
        if(!VirtualProtect((PVOID)((DWORD_PTR)pMem+0x2000),0x1000,PAGE_READONLY,&OldProtect)) {
            GLE(L"VirtualProtect");
            goto Error;
        }
 
        if(!VirtualQuery(pMem,&MBI,sizeof(MBI))) {
            GLE(L"VirtualQueryEx");
            goto Error;
        }
 
        INF(L"MBI.RegionSize: 0x%0.8X",MBI.RegionSize);
        INF(L"MBI.Protect: 0x%0.8X",MBI.Protect);
 
        INF(L" ");
 
        if(!VirtualQuery((PVOID)((DWORD_PTR)pMem+MBI.RegionSize),&MBI,sizeof(MBI))) {
            GLE(L"VirtualQueryEx");
            goto Error;
        }
 
        INF(L"MBI.RegionSize: 0x%0.8X",MBI.RegionSize);
        INF(L"MBI.Protect: 0x%0.8X",MBI.Protect);
    }
Лог:

[INF] MBI.RegionSize: 0x00002000
[INF] MBI.Protect: 0x00000004
[INF]
[INF] MBI.RegionSize: 0x00001000
[INF] MBI.Protect: 0x00000002
1
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
30.01.2016, 20:16
jupman, да, ты совершенно прав!
А у меня, оказывается, серьезный пробел в понимании регионов виртуальной памяти:
я-то думал, что они описывают блок, выделенный ранее с помощью VirtualAlloc(Ex),
но атрибуты страниц внутри блока при этом якобы могут различаться, обычно в
результате VirtualProtect(Ex) или page fault на guard page. Был не прав, снимаю шляпу.


Подтверждение из MSDN:

VirtualQuery function
https://msdn.microsoft.com/en-... s.85).aspx
VirtualQuery provides information about a region of consecutive pages beginning at a
specified address that share the following attributes:

The state of all pages is the same (MEM_COMMIT, MEM_RESERVE, MEM_FREE,
MEM_PRIVATE, MEM_MAPPED, or MEM_IMAGE).

...
0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
30.01.2016, 21:19
Убежденный, я как вот это увидел:
Цитата Сообщение от Убежденный Посмотреть сообщение
P.S.
В любом случае такой поиск не будет быстрым, а в 64-битных процессах может
вообще занимать часы.
Сразу подумал что что-то тут неладно. Т.к. сам не так давно делал ту же задачу что и ТС и у меня сканер за несколько минут успевал закончить на X64 ОС (сканил все процессы).

DaVillka, дам вам такие советы:

1) Не нужно в цикле каждый раз выделять освобождать и память. Выделите память перед циклом, чем больше тем меньше ReadProcessMemory вызывать придется а след-но выиграйте по скорости. Если MBI.RegionSize больше чем ваш буфер читаете один кусок, затем следующий. Ну вы поняли.

2) Проверка атрибутов. Да конечно например если встретите PAGE_NOACCESS ничего страшного, ReadProcessMemory просто сфэйлит, но зачем её вызывать если можно отсеить проверкой флагов. PAGE_GUARD думаю тоже стоит проверять, иначе вы получается сбрасывать будете данный флаг в чужом процессе, что не есть хорошо. Ну и то что MBI.State == MEM_COMMIT должно быть это понятно.

3) Ну и если не хотите проц грузить слип все таки нужен. Только не нужно его при каждой интеграции цикла вызывать. Я например делал Sleep(1) через каждые 30 просканеных страниц страниц. Ну или приоритет процессу вашему меняйте.

PS: Ну и добавлю, может пригодится. Если вдруг потребуется сканить X64 процессы из X32 процесса, то для этого есть функции NtWow64QueryVirtualMemory64/NtWow64ReadVirtualMemory64. Они работают от XP до 8, выше не проверял.
2
30.01.2016, 21:27

Не по теме:


Цитата Сообщение от jupman Посмотреть сообщение
Т.к. сам не так давно делал ту же задачу что и ТС и у меня сканер за несколько минут успевал закончить на X64 ОС (сканил все процессы).
Существует метод, позволяющий искать сигнатуры в 64-битных адресных
пространствах еще на порядок быстрее, но из ring-3 его, к сожалению,
реализовать не получится ввиду недоступности соответствующих структур.

0
30.01.2016, 21:41

Не по теме:

Цитата Сообщение от Убежденный Посмотреть сообщение
Существует метод, позволяющий искать сигнатуры в 64-битных адресных
пространствах еще на порядок быстрее, но из ring-3 его, к сожалению,
реализовать не получится ввиду недоступности соответствующих структур.
В ядро пока не лезу. :) Я сейчас Побегайло только дочитал, сейчас Харта читаю, потом буду Рихтера. Ну а потом буду наконец-то KmdTut by Four-F (благо асм знаю). А вообще смотрю ваши темы и как-то страшно, как я вижу с получением подписи драйверу куча мороки.

0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
11.02.2016, 17:16
Цитата Сообщение от jupman Посмотреть сообщение
NtWow64QueryVirtualMemory64/NtWow64ReadVirtualMemory64. Они работают от XP до 8, выше не проверял.
Проверил кстати на Windows 10 NtWow64QueryVirtualMemory64 не экспортируется. Приходится Heaven's Gate использовать.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
11.02.2016, 18:39
Про Heaven's Gate можно забыть из-за Control Flow Guard.
1
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
12.02.2016, 00:42
Убежденный, Спасибо. Вообще тестил уже на Win 10 все работает. Скачал доку по CFG, буду разбираться что за зверь.

Добавлено через 2 часа 47 минут
Убежденный. Ну у меня норм работает т.к. я без опции /guard:cf компилирую, у меня данный механизм отключен. Да и если уж нужен этот CFG можно ведь отдельно Heaven's Gate откомпилировать (без /guard:cf). Или я что-то не догоняю?

Добавлено через 6 минут
Т.е. получается для той части кода которая компилируется без CFG, компилятор ненавтыкает LdrpValidateUserCallTarget'тов. Верно? Ведь именно данная функция как я понял возбуждает исключения если адрес не описан в cfg bitmap.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
12.02.2016, 08:37
Цитата Сообщение от jupman Посмотреть сообщение
Да и если уж нужен этот CFG можно ведь отдельно Heaven's Gate откомпилировать (без /guard:cf). Или я что-то не догоняю?
Я имел в виду случай, когда тебе нужен Heaven's Gate в чужом процессе,
где включен CFG.
0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
12.02.2016, 13:50
Убежденный, а, понял. Т.е. получается если я сделаю инжект в процесс с включенным CFG я не смогу использовать Heaven's Gate. Но ведь в моем внедренном коде не будет проверок (LdrpValidateUserCallTarget), почему должны быть проблемы? И не подскажете есть ли в Windows 10 какой-нибудь процесс с включенным CFG (но выключенным "Disable Dynamic Code"). Хочу потестить, а то у меня старая студия (нет поддержки /guard:cf) и я не могу подходящий exe собрать.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
12.02.2016, 13:54
Цитата Сообщение от jupman Посмотреть сообщение
Но ведь в моем внедренном коде не будет проверок (LdrpValidateUserCallTarget), почему должны быть проблемы?
Потому что проверки будут в ntdll.dll.

Цитата Сообщение от jupman Посмотреть сообщение
И не подскажете есть ли в Windows 10 какой-нибудь процесс с включенным CFG (но выключенным "Disable Dynamic Code").
CFG, кажется, там почти для всех процессов включен.
А вот Disable Dynamic Code включен только для services.exe, csrss.exe и smss.exe,
если не ошибаюсь. Да это все легко самому сварганить, см. функции Get/SetProcessMitigationPolicy,
UpdateProcThreadAttribute и т.п. Все нужные структуры есть в последних версиях WDK/SDK.

--------

Если будут какие-нибудь любопытные результаты скрещивания CFG с Heaven's Gate -
напиши, пожалуйста, а то я эту тему особо не ковырял еще, так, знаю понаслышке...
1
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
12.02.2016, 20:41
Цитата Сообщение от Убежденный Посмотреть сообщение
Если будут какие-нибудь любопытные результаты скрещивания CFG с Heaven's Gate -
напиши, пожалуйста, а то я эту тему особо не ковырял еще, так, знаю понаслышке...
Ок, если что интересного накапаю то отпишу.
0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
14.02.2016, 03:09
Убежденный, native-api в Heaven's Gate по прежнему можно вызывать. Тестил в контексте cmd.exe (у него в DLL characteristics установлен IMAGE_DLLCHARACTERISTICS_GUARD_CF (0x4000) а значит есть CFG). Нельзя юзать APC, исключения, грузить либы. Что особо и нужно на мой взгляд, nt вполне должно хватать. Ну если уж нужно либу там прогрузить, то может стоит попробовать LoadConfig->GuardCFCheckFunctionPointer перехватить у ntdll (туда система адрес LdrpValidateUserCallTarget кладет). Не знаю поможет или нет, не стал пробовать.

Неплохая статья : “Closing Heaven’s Gate”
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.02.2016, 03:09

Поиск строки в памяти запущенного процесса и её изменение
Не могу решить задачку нужно считать строку из памяти процесса запущенной программы. RVA строки $0036D0C8 нужен ведь RVA не VA ...

Виртуальная память процесса, функции WinAPI
Всем доброго времени суток! Нужно написать программу, которая выводит информацию о виртуальной памяти процесса (задача сформулирована...

Совместимость оперативной памяти - Оперативная память
Доброго времени суток! Имею возможность установить 2 планки оперативностой памяти ,проблема в том что есть старая: Samsung И новую...

После замены оперативной памяти компьютер перезагружается / Оперативная память
Здравствуйте, на моем компьютере всего 2 слота под память. Стоит сейчас всего 2гб, решил поставить 4+4=8гб, стал компьютер перезагружаться....

Оперативная память для RYZEN, тест памяти DDR4. Одноканальность/двухканальность
С моими железяками, тест &quot;резонансного дзена&quot; получиться не скоро. Приборахлился еще одной планкой памяти. Corsair...


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

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru