Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126

Функция в dll, которая инжектится в чужой процесс, крашит программу

05.03.2017, 23:11. Показов 2925. Ответов 7

Студворк — интернет-сервис помощи студентам
Здравствуйте, сражу скажу, программу я пишу в целях собственного развития, вирус писать я не планирую.
Теперь проблема, при вызове функции CreateToolHelp32Snapshot, целевая программа(Диспетчер задач) крашится, причем без предупреждений(нет окна в котором написано, что программа перестала отвечать), процесс просто завершается. Прошу помочь, предположений нет. Скидываю код.
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#include <Windows.h>
#include <TlHelp32.h>
#include <string>
#include "ntstructures.h"
#include "MinHook\\include\\MinHook.h"
 
#if defined _M_X64
#pragma comment(lib, "MinHookLib\\lib\\libMinHook-x64-v120-mdd.lib")
#elif defined _M_IX86
#pragma comment(lib, "MinHookLib\\lib\\libMinHook-x86-v120-mdd.lib")
#endif
 
typedef HANDLE(WINAPI *OPENPROCESS)(DWORD, BOOL, DWORD);
typedef NTSTATUS(WINAPI *NTQSI)(SYSTEM_INFORMATION_CLASS, PVOID, ULONG, PULONG);
 
NTQSI oNtQuerySystemInformation = NULL;
OPENPROCESS oOpenProcess = NULL;
 
std::wstring getProcessNameByPID(DWORD dwPID);
DWORD getPIDbyProcessName(wchar_t *pName, unsigned int procNumber = 0);
 
 
HANDLE WINAPI DetourOpenProcess(DWORD dwAccess, BOOL b, DWORD dwPID)
{
    if ((L"notepad.exe" == getProcessNameByPID(dwPID)) && (dwAccess & PROCESS_TERMINATE))
    {
        SetLastError(ERROR_ACCESS_DENIED);
        WCHAR awcText[260] = L"\0";
        DWORD dwUnameSize = 260;
        GetUserName(awcText, &dwUnameSize);
        wcscat(awcText, L", блокнот уже не остановить :)");
        MessageBox(0, awcText, L"Это уже не остановить!", MB_OK | MB_TOPMOST | MB_ICONINFORMATION);
        return NULL;
    }
    return oOpenProcess(dwAccess, b, dwPID);
}
 
NTSTATUS NTAPI DetourNtQuerySystemInformation(SYSTEM_INFORMATION_CLASS SystemInformationClass,
    PVOID SystemInformation,
    ULONG SystemInformationLength,
    PULONG ReturnLength)
{
    //DWORD pid = getPIDbyProcessName(L"notepad.exe"); КРАШИТ ПРОГРАММУ
    LONG result = oNtQuerySystemInformation(SystemInformationClass, SystemInformation, SystemInformationLength, ReturnLength);
    if (SystemInformationClass == 5)
    {
        SYSTEM_PROCESS_INFORMATION *pinfo, *pinfo_last;
        if (SystemInformationLength > 20000)
        {
            pinfo = (SYSTEM_PROCESS_INFORMATION*)SystemInformation;
            for (;;)
            {
                //if (pinfo->UniqueProcessId == (HANDLE)pid)
                if (pinfo->UniqueProcessId == (HANDLE)4448)
                {
                    if (pinfo->NextEntryOffset == 0)
                    {
                        pinfo_last->NextEntryOffset = 0;
                    }
                    else
                    {
                        pinfo_last->NextEntryOffset += pinfo->NextEntryOffset;
                    }
                }
                if (pinfo->NextEntryOffset == 0) break;
                pinfo_last = pinfo;
                pinfo = (SYSTEM_PROCESS_INFORMATION*)((char*)pinfo + pinfo->NextEntryOffset);
            }
        }
    }
    return result;
}
 
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
    switch (dwReason) {
        case DLL_PROCESS_ATTACH:
        {
                                   if (MH_Initialize() != MH_OK)
                                   {
                                        return FALSE;
                                   }
                                   if (MH_CreateHook(&OpenProcess, &DetourOpenProcess, reinterpret_cast<void**>(&oOpenProcess)) != MH_OK)
                                   {
                                       return FALSE;
                                   }
                                   if (MH_CreateHook(GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtQuerySystemInformation"), &DetourNtQuerySystemInformation, 
                                       reinterpret_cast<void**>(&oNtQuerySystemInformation))!= MH_OK)
                                   {
                                       return FALSE;
                                   }
                                   if (MH_EnableHook(&OpenProcess) != MH_OK)
                                   {
                                       return FALSE;
                                   }
                                   if (MH_EnableHook(GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtQuerySystemInformation")) != MH_OK)
                                   {
                                       return FALSE;
                                   }
                                   break;
        }
        case DLL_PROCESS_DETACH:
        {
                                   MH_DisableHook(&OpenProcess);
                                   MH_RemoveHook(&OpenProcess);
                                   MH_DisableHook(GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtQuerySystemInformation"));
                                   MH_RemoveHook(GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtQuerySystemInformation"));
                                   MH_Uninitialize();
        }
    }
    return TRUE;
}
 
 
std::wstring getProcessNameByPID(DWORD dwPID)
{
    std::wstring strProcessName = L"\0";
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 pe = { NULL };
    pe.dwSize = sizeof(PROCESSENTRY32);
    if (Process32First(hSnapshot, &pe))
    {
        if (pe.th32ProcessID == dwPID)
        {
            strProcessName = pe.szExeFile;
            goto leave;
        }
        while (Process32Next(hSnapshot, &pe))
        {
            if (pe.th32ProcessID == dwPID)
            {
                strProcessName = pe.szExeFile;
                goto leave;
            }
        }
    }
leave:;
    CloseHandle(hSnapshot);
    return strProcessName;
}
 
DWORD getPIDbyProcessName(wchar_t *pName, unsigned int procNumber)
{
    DWORD dwPID = 0;
    DWORD pnumber = procNumber;
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); // Крашится конкретно тут
    PROCESSENTRY32 pe = { NULL };
    pe.dwSize = sizeof(PROCESSENTRY32);
    if (Process32First(hSnapshot, &pe))
    {
        if (!wcscmp(pe.szExeFile, pName))
        {
            if (!pnumber)
            {
                dwPID = pe.th32ProcessID;
                return dwPID;
            }
            pnumber--;
        }
        while (Process32Next(hSnapshot, &pe))
        {
            if (!wcscmp(pe.szExeFile, pName))
            {
                if (!pnumber)
                {
                    dwPID = pe.th32ProcessID;
                    break;
                }
                pnumber--;
            }
        }
    }
    leave:;
        CloseHandle(hSnapshot);
        return dwPID;
    return 0;
}
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
typedef LONG KPRIORITY;
 
typedef enum _SYSTEM_INFORMATION_CLASS
{
    SystemBasicInformation,
    SystemCodeIntegrityInformation,
    SystemExceptionInformation,
    SystemInterruptInformation,
    SystemLookasideInformation,
    SystemPerformanceInformation,
    SystemProcessInformation,
    SystemProcessorPerformanceInformation,
    SystemQueryPerformanceCounterInformation,
    SystemRegistryQuotaInformation,
    SystemTimeOfDayInformation,
    SystemPolicyInformation
} SYSTEM_INFORMATION_CLASS;
 
typedef struct _UNICODE_STRING {
    USHORT Length;
    USHORT MaximumLength;
    PWSTR  Buffer;
} UNICODE_STRING, *PUNICODE_STRING;
 
typedef struct _SYSTEM_PROCESS_INFORMATION {
    ULONG NextEntryOffset;
    ULONG NumberOfThreads;
    BYTE Reserved1[48];
    PVOID Reserved2[3];
    HANDLE UniqueProcessId;
    PVOID Reserved3;
    ULONG HandleCount;
    BYTE Reserved4[4];
    PVOID Reserved5[11];
    SIZE_T PeakPagefileUsage;
    SIZE_T PrivatePageCount;
    LARGE_INTEGER Reserved6[6];
} SYSTEM_PROCESS_INFORMATION;
 
 
 
 
typedef struct _SYSTEM_BASIC_INFORMATION
{
    ULONG Reserved;
    ULONG TimerResolution;
    ULONG PageSize;
    ULONG NumberOfPhysicalPages;
    ULONG LowestPhysicalPageNumber;
    ULONG HighestPhysicalPageNumber;
    ULONG AllocationGranularity;
    ULONG_PTR MinimumUserModeAddress;
    ULONG_PTR MaximumUserModeAddress;
    ULONG_PTR ActiveProcessorsAffinityMask;
    CCHAR NumberOfProcessors;
} SYSTEM_BASIC_INFORMATION, *PSYSTEM_BASIC_INFORMATION;
Заранее спасибо!
P.S Windows 10 x64
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.03.2017, 23:11
Ответы с готовыми решениями:

Внедрение DLL в чужой процесс
Доброго времени суток! Делаю инжект ддлки в сторонний процесс следющим образом: 1. открыл процесс 2. выделил память в нём 3....

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

Обрезает uchar и крашит процесс
unsigned char *a=&quot;...&quot; int bc(unsigned char *b, size_t len){ ... } int at(){ size_t len; len = (size_t)sizeof(a); ...

7
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
05.03.2017, 23:37
Цитата Сообщение от Алексей_Либанов Посмотреть сообщение
при вызове функции CreateToolHelp32Snapshot, целевая программа(Диспетчер задач) крашится
1. Настрой систему на автоматический сбор дампов приложений, как написано здесь:

Collecting User-Mode Dumps
https://msdn.microsoft.com/en-... s.85).aspx

2. Когда снова упадет, будет создан крэш-дамп в соответствующей папке.

3. Далее открываешь дамп в отладчике (например, в WinDBG), подключаешь
отладочные символы (.pdb) и смотришь, где упало и почему.

А вообще, похоже на рекурсию: перехватчик OpenProcess вызывает функцию
getProcessNameByPID (или GetUserName), а одна из них так или иначе дергает OpenProcess.
В итоге снова вызывается перехватчик. И так в цикле, пока не наступает исчерпание стека.
Поищи в журнале приложений соответствующее событие. Обычно код завершения при
этом такой: 0xC00000FD (STATUS_STACK_OVERFLOW).
0
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
06.03.2017, 19:43  [ТС]
Полностью убрал перехват OpenProcess, это ничего не поменяло.
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
#include <Windows.h>
#include <TlHelp32.h>
#include <string>
#include "ntstructures.h"
#include "MinHook\\include\\MinHook.h"
 
#if defined _M_X64
#pragma comment(lib, "MinHookLib\\lib\\libMinHook-x64-v120-mdd.lib")
#elif defined _M_IX86
#pragma comment(lib, "MinHookLib\\lib\\libMinHook-x86-v120-mdd.lib")
#endif
 
//typedef HANDLE(WINAPI *OPENPROCESS)(DWORD, BOOL, DWORD);
typedef NTSTATUS(WINAPI *NTQSI)(SYSTEM_INFORMATION_CLASS, PVOID, ULONG, PULONG);
 
NTQSI oNtQuerySystemInformation = NULL;
//OPENPROCESS oOpenProcess = NULL;
 
std::wstring getProcessNameByPID(DWORD dwPID);
DWORD getPIDbyProcessName(wchar_t *pName, unsigned int procNumber = 0);
 
 
/*HANDLE WINAPI DetourOpenProcess(DWORD dwAccess, BOOL b, DWORD dwPID)
{
    if ((L"notepad.exe" == getProcessNameByPID(dwPID)) && (dwAccess & PROCESS_TERMINATE))
    {
        SetLastError(ERROR_ACCESS_DENIED);
        WCHAR awcText[260] = L"\0";
        DWORD dwUnameSize = 260;
        GetUserName(awcText, &dwUnameSize);
        wcscat(awcText, L", блокнот уже не остановить :)");
        MessageBox(0, awcText, L"Это уже не остановить!", MB_OK | MB_TOPMOST | MB_ICONINFORMATION);
        return NULL;
    }
    return oOpenProcess(dwAccess, b, dwPID);
}*/
 
NTSTATUS NTAPI DetourNtQuerySystemInformation(SYSTEM_INFORMATION_CLASS SystemInformationClass,
    PVOID SystemInformation,
    ULONG SystemInformationLength,
    PULONG ReturnLength)
{
    DWORD notepadPID = getPIDbyProcessName(L"notepad.exe");
    LONG result = oNtQuerySystemInformation(SystemInformationClass, SystemInformation, SystemInformationLength, ReturnLength);
    if (SystemInformationClass == 5)
    {
        SYSTEM_PROCESS_INFORMATION *pinfo, *pinfo_last;
        if (SystemInformationLength > 20000)
        {
            pinfo = (SYSTEM_PROCESS_INFORMATION*)SystemInformation;
            for (;;)
            {
                if (pinfo->UniqueProcessId == (HANDLE)notepadPID)
                {
                    if (pinfo->NextEntryOffset == 0)
                    {
                        pinfo_last->NextEntryOffset = 0;
                    }
                    else
                    {
                        pinfo_last->NextEntryOffset += pinfo->NextEntryOffset;
                    }
                }
                if (pinfo->NextEntryOffset == 0) break;
                pinfo_last = pinfo;
                pinfo = (SYSTEM_PROCESS_INFORMATION*)((char*)pinfo + pinfo->NextEntryOffset);
            }
        }
    }
    return result;
}
 
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
    switch (dwReason) {
        case DLL_PROCESS_ATTACH:
        {
                                   if (MH_Initialize() != MH_OK)
                                   {
                                        return FALSE;
                                   }
                                   /*if (MH_CreateHook(&OpenProcess, &DetourOpenProcess, reinterpret_cast<void**>(&oOpenProcess)) != MH_OK)
                                   {
                                       return FALSE;
                                   }*/
                                   if (MH_CreateHook(GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtQuerySystemInformation"), &DetourNtQuerySystemInformation, 
                                       reinterpret_cast<void**>(&oNtQuerySystemInformation))!= MH_OK)
                                   {
                                       return FALSE;
                                   }
                                   /*if (MH_EnableHook(&OpenProcess) != MH_OK)
                                   {
                                       return FALSE;
                                   }*/
                                   if (MH_EnableHook(GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtQuerySystemInformation")) != MH_OK)
                                   {
                                       return FALSE;
                                   }
                                   break;
        }
        case DLL_PROCESS_DETACH:
        {
                                   //MH_DisableHook(&OpenProcess);
                                   //MH_RemoveHook(&OpenProcess);
                                   MH_DisableHook(GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtQuerySystemInformation"));
                                   MH_RemoveHook(GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtQuerySystemInformation"));
                                   MH_Uninitialize();
        }
    }
    return TRUE;
}
 
 
std::wstring getProcessNameByPID(DWORD dwPID)
{
    std::wstring strProcessName = L"\0";
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 pe = { NULL };
    pe.dwSize = sizeof(PROCESSENTRY32);
    if (Process32First(hSnapshot, &pe))
    {
        if (pe.th32ProcessID == dwPID)
        {
            strProcessName = pe.szExeFile;
            goto leave;
        }
        while (Process32Next(hSnapshot, &pe))
        {
            if (pe.th32ProcessID == dwPID)
            {
                strProcessName = pe.szExeFile;
                goto leave;
            }
        }
    }
leave:;
    CloseHandle(hSnapshot);
    return strProcessName;
}
 
DWORD getPIDbyProcessName(wchar_t *pName, unsigned int procNumber)
{
    DWORD dwPID = 0;
    DWORD pnumber = procNumber;
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); // Крашится конкретно тут
    PROCESSENTRY32 pe = { NULL };
    pe.dwSize = sizeof(PROCESSENTRY32);
    if (Process32First(hSnapshot, &pe))
    {
        if (!wcscmp(pe.szExeFile, pName))
        {
            if (!pnumber)
            {
                dwPID = pe.th32ProcessID;
                goto leave;
            }
            pnumber--;
        }
        while (Process32Next(hSnapshot, &pe))
        {
            if (!wcscmp(pe.szExeFile, pName))
            {
                if (!pnumber)
                {
                    dwPID = pe.th32ProcessID;
                    goto leave;
                }
                pnumber--;
            }
        }
    }
    leave:;
        CloseHandle(hSnapshot);
        return dwPID;
    return 0;
}
Насчет краш-дампа - я получил файл размером ~190mb с расширением .dmp, что мне с ним делать?

Добавлено через 7 минут
Ну я тут немного разобрался, и получил вот это.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Microsoft (R) Windows Debugger Version 6.12.0002.633 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.
 
 
Loading Dump File [C:\Users\Алексей\AppData\Local\Temp\CrashDumpes\Taskmgr.exe.6224.dmp]
User Mini Dump File: Only registers, stack and portions of memory are available
 
WARNING: Minidump contains unknown stream type 0x15
WARNING: Minidump contains unknown stream type 0x16
Symbol search path is: SRV*%systemroot%\symbols*http://msdl.microsoft.com/download/symbols
Executable search path is: 
Windows 7 Version 14393 MP (4 procs) Free x64
Product: WinNt, suite: SingleUserTS
Machine Name:
Debug session time: Mon Mar  6 19:34:01.000 2017 (UTC + 3:00)
System Uptime: not available
Process Uptime: 0 days 0:00:16.000
................................................................
............
This dump file has an exception of interest stored in it.
The stored exception information can be accessed via .ecxr.
(1850.2f58): Stack overflow - code c00000fd (first/second chance not available)
kernel32!CreateToolhelp32Snapshot+0x4b:
00007ff8`2c1b543b c744245000000000 mov     dword ptr [rsp+50h],0 ss:00000033`46783fc0=00000000
Добавлено через 2 минуты
Кстати, этот дамп весил уже 2мб(это минидамп).
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
06.03.2017, 20:13
Цитата Сообщение от Алексей_Либанов Посмотреть сообщение
Полностью убрал перехват OpenProcess, это ничего не поменяло.
Значит, проблема не в нем, а в перехватчике NtQuerySystemInformation.
Судя по коду ошибки, там рекурсивный вызов. Т.е. обработчик NtQuerySystemInformation
вызывает CreateToolhelp32Snapshot, а та, в свою очередь, снова сводится к вызову
NtQuerySystemInformation... Получается "зацикливание", которое приводит к
переполнению стека и вылету с кодом 0xC00000FD.
0
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
06.03.2017, 21:11  [ТС]
А как тогда определить PID по имени процесса?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
07.03.2017, 08:45
Главное - делать это вне перехватчиков OpenProcess и NtQuerySystemInformation.
Тогда не будет рекурсии и переполнения стека. А как именно делать - не важно.
0
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
07.03.2017, 20:46  [ТС]
А можно как-то обойти это ограничение, ведь как тогда скрывать процессы, запущенные после внедрения dll?

Добавлено через 1 минуту
И можно ли как-то определить pid по имени процесса без вызова NtQuerySystemInformation?

Добавлено через 33 минуты
Появилась еще одна проблема - после активации хука и вызова getPIDbyProcessName появляется окно Microsoft Visual c++ Runtime Error, после чего целевая программа падает.
Код для наглядности:
C++
1
2
3
4
5
6
targetPID = getPIDbyProcessName(L"wininit.exe"); //Тут нормально
                                   if (MH_EnableHook(GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtQuerySystemInformation")) != MH_OK)
                                   {
                                       return FALSE;
                                   }
                                   //targetPID = getPIDbyProcessName(L"wininit.exe"); //А тут краш и ошибками MS Visual C++ Runtime Error
Добавлено через 6 минут
В это окне написано:
"Run-Time Check Failture #3 - The variable 'pinfo_last' is begining used without begin initialized."
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
07.03.2017, 22:25
Цитата Сообщение от Алексей_Либанов Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
pinfo = (SYSTEM_PROCESS_INFORMATION*)SystemInformation;
 for (;;)
 {
 //if (pinfo->UniqueProcessId == (HANDLE)pid)
 if (pinfo->UniqueProcessId == (HANDLE)4448)
 {
 if (pinfo->NextEntryOffset == 0)
 {
 pinfo_last->NextEntryOffset = 0;  // чему равна  pinfo_last  при 1-й итерации цикла ?
 }
 else
 {
 pinfo_last->NextEntryOffset += pinfo->NextEntryOffset; //  // чему равна  pinfo_last  ? 
 }
Алексей_Либанов, вот фрагмент кода. Вполне может оказаться, что 'pinfo_last' being used without begin initialized.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.03.2017, 22:25
Помогаю со студенческими работами здесь

Как создать Dll которая убивает процесс
как создать Dll которая убивает процесс CheatEngine и WireShark и чтобы Dll вызывался из Java

Крашит DLL при инжекте
Код привел в скрине, крашит без всяких ошибок не знаю как исправить, буду рад если поможите

DLL крашит приложение при создании потока (CreateThread)
Здрасьте. Внедряю свою дллку в любой процесс и он крашится с моего потока. #include &lt;Windows.h&gt; void Main(){ ...

Внедрение программы в чужой процесс
Как внедрить свою программу в процесс например игры, чтобы в игре работала моя программа?

Вставка своего кода в чужой процесс. *nix
Добрый вечер :) Расскажите пожалуйста о инжектинге. На данный момент, я знаю только то, что можно внедрить свой код в адресное...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru