Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/40: Рейтинг темы: голосов - 40, средняя оценка - 4.85
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21

Сканер сигнатур

15.01.2014, 00:12. Показов 8625. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
в продолжении этой темы Остановить процесс загрузки файла в память на конкретном адресе но по другому вопросу

в общем получилась данная задумка подменил параметр D3D_FEATURE_LEVEL_11_1 на D3D_FEATURE_LEVEL_10_0 и запустил D3D11-приложение на DX10-видеокарте.

Dll (хук)
Кликните здесь для просмотра всего текста
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
#include <Windows.h>
#include <d3d11_2.h>
 
#pragma comment(lib, "d3d11.lib")
 
DWORD WINAPI Hook_thread(LPVOID);
DWORD hooked_D3D11CreateDeviceAndSwapChain = 0;
 
DWORD APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
    switch (dwReason)
    {
    case DLL_PROCESS_ATTACH:
        CreateThread(NULL, NULL, Hook_thread, NULL, NULL, NULL);
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
    default:
        break;
    }
    return true;
}
 
HRESULT HookedD3D11CreateDeviceAndSwapChain(
    _In_   IDXGIAdapter *pAdapter,
    _In_   D3D_DRIVER_TYPE DriverType,
    _In_   HMODULE Software,
    _In_   UINT Flags,
    _In_   const D3D_FEATURE_LEVEL *pFeatureLevels,
    _In_   UINT FeatureLevels,
    _In_   UINT SDKVersion,
    _In_   const DXGI_SWAP_CHAIN_DESC *pSwapChainDesc,
    _Out_  IDXGISwapChain **ppSwapChain,
    _Out_  ID3D11Device **ppDevice,
    _Out_  D3D_FEATURE_LEVEL *pFeatureLevel,
    _Out_  ID3D11DeviceContext **ppImmediateContext
    )
{
    D3D_FEATURE_LEVEL g_pFeatureLevels = D3D_FEATURE_LEVEL_10_0;
    pFeatureLevels = &g_pFeatureLevels;
 
    return D3D11CreateDeviceAndSwapChain(pAdapter, DriverType, Software,
        Flags, pFeatureLevels, FeatureLevels, SDKVersion,
        pSwapChainDesc, ppSwapChain, ppDevice, pFeatureLevel, ppImmediateContext);
}
 
void CallHook()
{
    _asm call dword ptr hooked_D3D11CreateDeviceAndSwapChain
}
 
DWORD WINAPI Hook_thread(LPVOID)
{
    hooked_D3D11CreateDeviceAndSwapChain = (DWORD)HookedD3D11CreateDeviceAndSwapChain;
    DWORD call_address = 0x0; // адрес функции D3D11CreateDeviceAndSwapChain в памяти (нужно искать вручную)
 
    DWORD old_prot = 0;
 
    VirtualProtect((void*)call_address, 6, PAGE_EXECUTE_READWRITE, &old_prot);
    memcpy((void*)call_address, (PBYTE)CallHook, 6);
    VirtualProtect((void*)call_address, 6, old_prot, &old_prot);
    ::ExitThread(1337);
}


программа для приостановки процесса инициализации (со встроенным инжектором)
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <Windows.h>
 
using namespace std;
 
typedef LONG(WINAPI* NTRESUMEPROCESS)(HANDLE pHandle);
 
HANDLE hProc = 0;
 
PROCESS_INFORMATION StartProcess(char* AppName)
{
    cout << "AppName: " << AppName << endl;
    PROCESS_INFORMATION procInfo;
    STARTUPINFO startInfo;
    memset(&procInfo, 0, sizeof(procInfo));
    memset(&startInfo, 0, sizeof(startInfo));
    startInfo.cb = sizeof(startInfo);
 
    char temp[MAX_PATH];
    CreateProcess(AppName, temp, NULL, NULL, FALSE,
        CREATE_SUSPENDED, NULL, NULL, &startInfo, &procInfo);
 
    return procInfo;
}
 
bool Inject(DWORD pID, char* path)
{
    LPVOID RemoteString;
    LPVOID LoadLibAddr;
    if (pID == 0)
        return false;
    if (hProc == 0)
        return false;
    LoadLibAddr = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
    RemoteString = VirtualAllocEx(hProc, NULL, strlen(path),
        MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(hProc, RemoteString, path, strlen(path), NULL);
    CreateRemoteThread(hProc, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddr,
        RemoteString, NULL, NULL);
    CloseHandle(hProc);
    return true;
}
 
int main()
{
    DWORD time;
    cout << "Time for sleep thread, in milliseconds: ";
    cin >> time;
    cout << endl;
 
    char AppName[256];
    cout << "Enter AppName name: ";
    cin >> AppName;
    cout << endl;
 
    PROCESS_INFORMATION procInfo = StartProcess(AppName);
    cout << "Process is SUSPENDED." << endl;
    cout << endl << "Press F1..." << endl;
    hProc = procInfo.hProcess;
    while (1)
    {
        if (GetAsyncKeyState(VK_F1))
        {
            NTRESUMEPROCESS Resume = (NTRESUMEPROCESS)GetProcAddress(
                GetModuleHandle("ntdll.dll"), "NtResumeProcess");
            cout << "Process is RESUME." << endl;
            Resume(procInfo.hProcess);
            Sleep(time);
            SuspendThread(procInfo.hThread);
            cout << "Thread is SUSPENDED." << endl;
            cout << endl << "Press F2 for using dll_injector..." << endl;
        }
 
        if (GetAsyncKeyState(VK_F2))
        {
            char DllName[256];
            cout << "Enter DllName name: ";
            cin >> DllName;
            cout << endl;
            Inject(procInfo.dwProcessId, DllName);
            cout << "Dll injected." << endl;
            cout << endl << "Press F3 for resume thread..." << endl;
        }
 
        if (GetAsyncKeyState(VK_F3))
        {
            ResumeThread(procInfo.hThread);
            cout << "Thread is RESUME." << endl;
        }
 
        Sleep(100);
    }
 
    return 0;
}


ну и само тестовое D3D11-приложение
Кликните здесь для просмотра всего текста
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
#include <d3d11_2.h>
 
#pragma comment (lib, "d3d11.lib")
 
ID3D11Device* device;
IDXGISwapChain* swapChain;
ID3D11RenderTargetView* renderTarget;
ID3D11DeviceContext* context;
ID3D11Texture2D* texture;
 
void CleanD3D()
{
    device->Release();
    swapChain->Release();
    renderTarget->Release();
    context->Release();
    texture->Release();
}
 
void RenderFrameD3D()
{
    float ClearColor[4] = { 0.396078431372549f, 0.6117647058823529f,
        0.9372549019607843f, 1.0f };
    context->ClearRenderTargetView(renderTarget, ClearColor);
    swapChain->Present(0, 0);
}
 
void InitializeD3D(HWND hWnd)
{
    UINT creationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;
#if defined(_DEBUG)
    creationFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
    D3D_FEATURE_LEVEL featureLevels = D3D_FEATURE_LEVEL_11_1;
 
    DXGI_SWAP_CHAIN_DESC desc = { 0 };
    ZeroMemory(&desc, sizeof(DXGI_SWAP_CHAIN_DESC));
    desc.BufferCount = 2;
    desc.Windowed = TRUE;
    desc.OutputWindow = hWnd;
    desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    desc.SampleDesc.Count = 1;
    desc.SampleDesc.Quality = 0;
    desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
 
    D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, creationFlags,
        &featureLevels, 1, D3D11_SDK_VERSION, &desc, &swapChain, &device, NULL, &context);
 
    swapChain->GetBuffer(0, IID_PPV_ARGS(&texture));
    device->CreateRenderTargetView(texture, NULL, &renderTarget);
}
 
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_DESTROY:
        {
            PostQuitMessage(0);
            return 0;
        }
    }
    return DefWindowProc(hWnd, message, wParam, lParam);
}
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wc;
    ZeroMemory(&wc, sizeof(WNDCLASSEX));
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(0, IDC_ARROW);
    wc.lpszClassName = "WindowClass";
    RegisterClassEx(&wc);
    HWND hWnd = CreateWindowEx(0, "WindowClass", "Test D3D11.2",
        WS_SYSMENU | WS_MINIMIZEBOX, (GetSystemMetrics(SM_CXSCREEN) - 1280) / 2,
        (GetSystemMetrics(SM_CYSCREEN) - 720)/ 2, 1280, 720, 0, 0, hInstance, 0);
    ShowWindow(hWnd, nCmdShow);
    InitializeD3D(hWnd);
    MSG msg;
    while (1)
    {
        while (PeekMessage(&msg, 0, 0, 0, 1))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        if (msg.message == WM_QUIT) break;
        RenderFrameD3D();
    }
    CleanD3D();
    return msg.wParam;
}


вопрос в следующем: искать постоянно меняющийся адрес не вариант. Помогите со сканером сигнатур (точнее с функцией или прототипом функции). Пробовал те, которые в инете есть - результата никакого не дало. В OllyDbg сигнатуру с маской находить умею

пользовался вот такой заготовкой
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
bool Data(const BYTE* pData, const BYTE* pattern, const char* mask)
{
    for (; *mask; mask++, pData++, pattern++)
    if (*mask == 'x' && *pData != *pattern)
        return false;
    return (*mask) == NULL;
}
 
DWORD FindPattern(DWORD addr, DWORD length, BYTE* pattern, char* mask)
{
    for (DWORD i = 0; i < length; i++)
    if (Data((BYTE*)(addr + i), pattern, mask))
        return (DWORD)(addr + i);
    return NULL;
}
 
DWORD WINAPI Hook_thread(LPVOID)
{
    hooked_D3D11CreateDeviceAndSwapChain = (DWORD)HookedD3D11CreateDeviceAndSwapChain;
 
    DWORD call_address = FindPattern((DWORD)module.LpBaseOfDll, module.SizeOfImage,
        (PBYTE)"\xFF\x15 ...", "xxxx????xxx ..."); // module - это MODULEINFO
 
    DWORD old_prot = 0;
 
    VirtualProtect((void*)call_address, 6, PAGE_EXECUTE_READWRITE, &old_prot);
    memcpy((void*)call_address, (PBYTE)CallHook, 6);
    VirtualProtect((void*)call_address, 6, old_prot, &old_prot);
    ::ExitThread(1337);
}
но как было сказано выше - безрезультатно.
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.01.2014, 00:12
Ответы с готовыми решениями:

Сканер портов
Всем привет.Пишу сканер портов.Как мне сделать так,что бы вывод шёл в главное окно?то есть нажимаю на кнопку &quot;сканировать&quot; и...

Сканер отпечатков пальцев
Здравствуйте! Можно ли подключится к драйверу сканера для получения изображения (на него нет SDK есть только драйвер и программа к нему в...

Как ускорить сканер памяти
Вот код #include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;tlhelp32.h&gt; #include &lt;algorithm&gt; int8_t GetInt8FromProcess(HANDLE...

3
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
15.01.2014, 05:12
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
static BYTE __fastcall MakeSigByte(const char* const pszBuf)
{
   if (IsBadReadPtr(pszBuf,2))
   {
      // Error !
      return 0;
   }
 
   int     Lo = toupper(pszBuf[1]);
   int     Hi = toupper(pszBuf[0]);
 
   int   iSignLo = 0;
 
   if ((Lo >= '0') && (Lo <= '9'))
   {
      iSignLo = Lo - '0';
   }
   else if ((Lo >= 'A') && (Lo <= 'F'))
   {
      iSignLo = Lo - 'A' + 0x0A;
   }
   else
   {
      // Error !
      printf("Err: Invalid signature character %c\n",pszBuf[1]);
      return 0;
   }
 
   int   iSignHi = 0;
 
   if ((Hi >= '0') && (Hi <= '9'))
   {
      iSignHi = Hi - '0';
   }
   else if ((Hi >= 'A') && (Hi <= 'F'))
   {
      iSignHi = Hi - 'A' + 0x0A;
   }
   else
   {
      // Error !
      printf("Err: Invalid signature character %c\n",pszBuf[0]);
      return 0;
   }
 
   return (BYTE)(iSignLo | (iSignHi << 4));
}
 
static bool __fastcall IsMatchGlobbed(const BYTE* const pBuf,const char* const pszGlobbedSignature,DWORD dwSigSize)
{
   if (IsBadReadPtr(pBuf,(dwSigSize / 2)))
   {
      // Error !
      return false;
   }
 
   for (DWORD ii = 0; ii < dwSigSize; ii += 2)
   {
      if ((pszGlobbedSignature[ii] != '.') && (pszGlobbedSignature[ii + 1] != '.'))
      {
         // Be sure both are UNSIGNED !! 
         BYTE     bySigByte = MakeSigByte(&pszGlobbedSignature[ii]);
         BYTE     byChkByte = (BYTE)pBuf[ii / 2];
 
         if (byChkByte != bySigByte)
         {
            return false;
         }
      }
   }
      
   return true;
}
 
// Signature from PEiD:
// char*    pszPEiDGlobbedSignature[] = "E803000000EB....BB55000000E803000000EB....E88E000000E803000000EB....E881000000E803000000EB....E8B7000000E803000000EB....E8AA000000E803000000EB....83FB55E803000000EB....752DE803000000EB....60E8000000005D81ED07E240008BD581C256E2400052E8..000000C3C3E803000000EB....E80E000000E8D1FFFFFFC3E803000000EB....33C064FF30648920CCC3E803000000EB....33C064FF306489204BCCC3E803000000EB....33DBB94B0C410081E9..E340008BD581C2..E340008D3A8BF733C0E803000000EB....E817000000909090E99C22000033C064FF3064892043CCC3CCCCCCCCAC"; // yoda'sProtector1.03.3 (.exe,.scr,.com) -->AshkbizDanehkar
1
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
15.01.2014, 21:03  [ТС]
спасибо, буду пробовать.

кстати нашёл похожий вариант на то, что приводил выше, но вроде более "качественный"
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
bool DataCompare(byte* pData, byte* pattern, char* mask)
{
    for (; *mask; mask++, pattern++, pData++)
    {
        if (*mask == 'x' && *pData != *pattern)
            return false;
    }
    return true;
}
 
DWORD FindPattern(DWORD addr, DWORD length, byte* pattern, char* mask)
{
    MEMORY_BASIC_INFORMATION mbi = { 0 };
    DWORD offset = 0;
 
    while (offset < length)
    {
        VirtualQueryEx(handle, (LPCVOID)(addr + offset), &mbi,
            sizeof(MEMORY_BASIC_INFORMATION));
        if (mbi.State != MEM_FREE)
        {
            byte* buffer = new byte[mbi.RegionSize];
            ReadProcessMemory(handle, mbi.BaseAddress, buffer,
                mbi.RegionSize, NULL);
            for (unsigned int i = 0; i < mbi.RegionSize; i++)
            {
                if (DataCompare(buffer + i, pattern, mask))
                {
                    delete[] buffer;
                    return (DWORD)mbi.BaseAddress + i;
                }
            }
            delete[] buffer;
        }
        offset += mbi.RegionSize;
    }
    return 0;
}
0
 Аватар для Excelike
1 / 1 / 1
Регистрация: 20.02.2014
Сообщений: 77
09.04.2014, 03:10
Спасибо, нашёл похожий код, всё работает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.04.2014, 03:10
Помогаю со студенческими работами здесь

Сканер IP - Адресов, Порт - сканер (в локальной сети)
Доброе время суток) Написана программа для сканирования портов (указал диапазон 5900 - 5906), на данный момент программа работает только...

Создание каркаса программы из namespace`ов и сигнатур
Всем привет. Возникла следующая проблема :) Вернулся с Java на C++. Расстроился. Раздражает то, что надо делить реализацию от сигнатуры....

Код поиска сигнатур (нужны комментарии)
требуется разобрать код #include &lt;iostream&gt; using namespace std; int cmp_func(const void *str1, const void *str2) { return...

Лексический сканер
Лексический сканер должен учитывать области видимости и кодировать их по-разному. Содержание задания: Разработать программу лексического...

Сканер портов
Всем добрый день! У меня возникла проблема при реализации сканера портов под Линукc: Программа почему то себя по разному ведет при...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
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