Принцип работы: хукаем функцию writecallback, которую необходимо передавать cURL, чтобы он мог записать в writedata ответ сервера (и никакой подмены сервера не нужно)
Код:
Код:
C++:
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <iostream>
#include <thread>
#include <minhook/MinHook.h>
#pragma comment(lib, "minhook_32.lib")
// Это строка, на которую мы подменим ответ от сервера
char fake_src[219] = R"(cd42404d52ad55ccfa9aca4adc828aa5800ad9d385a0671fbcbf724118320619 3861248
2d9675d849a9a7b52334735a0c621ccb6c203d6b1da7f759e719b0a3013f849c 7634608
e469ab66d7a9e90e2b1fa843933d701b0acaacfa9ce1cb0f4274b2ec720b90d8 4931520)";
using writecallback_t = int (__cdecl *)(void *, int, int, void *);
writecallback_t writecallback_orig;
int writecallback_hooked(void *a_src, int a2, int a3, void *a4)
{
std::cout
<< " \twritecallback called [ "
<< a_src
<< " - " << a2
<< " - " << a3
<< " - " << a4
<< " ] "
<< std::endl;
a_src = fake_src; // Подменяем ответ
return writecallback_orig(a_src, a2, a3, a4);
}
class c_entry_point
{
public:
c_entry_point()
{
// AllocConsole();
// freopen("CONOUT$", "w", stdout);
std::thread fucking_thread([]()
{
HMODULE module_handle = 0;
while (!module_handle)
{
module_handle = GetModuleHandleA("d3d9.dii");
//std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
// If module loaded
uintptr_t base_address = reinterpret_cast<uintptr_t>(module_handle);
std::cout <<
" \tbase address [ 0x"
<< std::hex << std::uppercase
<< base_address << " ] "
<< std::endl;
void *hook_address = reinterpret_cast<void *>(base_address + 0x2DB30); // Тут адрес функции writecallback
std::cout <<
" \thook address [ 0x"
<< std::hex << std::uppercase
<< hook_address << " ] "
<< std::endl;
MH_Initialize();
MH_CreateHook(hook_address, &writecallback_hooked, reinterpret_cast<void **>(&writecallback_orig));
MH_EnableHook(hook_address);
std::cout << "\thook installed. " << std::endl;
});
fucking_thread.detach();
}
} entry_point;
Последнее редактирование: