Как можно хукнуть os.execute?

DeKzer

Известный
Автор темы
519
223
Версия MoonLoader
.026-beta
Здравствуйте, недавно наткнулся на эту тему - https://www.blast.hk/threads/189239/ . Подскажите пожалуйста, можно ли таким-же способом хукнуть os.execute? Если да - прошу дать пример, буду очень благодарен.
 

Tema05

Известный
1,471
435
Даже с примером тебе нужно будет искать адрес для хука. Но если ты умеешь искать такое скорее всего проблем с написанием остального не возникнет. А если ты хочешь, чтобы за тебя и адрес нашли выходит просишь бесплатно всё за тебя сделать.

И на lua тяжело сделать на 100% стабильные хуки (несколько мне известно из-за сборщика мусора). Но вот лучшая либа для этого https://www.blast.hk/threads/55743/
 

movebx

Известный
72
191
И на lua тяжело сделать на 100% стабильные хуки (несколько мне известно из-за сборщика мусора).
Хуки, именно нормальные хуки а не редефайн функции, никак не связаны со сборщиком мусора в луа. Ты напрямую патчишь код своим jmp rel
 
  • Нравится
Реакции: Tema05

g305noobo

Известный
Модератор
304
479
Здравствуйте, недавно наткнулся на эту тему - https://www.blast.hk/threads/189239/ . Подскажите пожалуйста, можно ли таким-же способом хукнуть os.execute? Если да - прошу дать пример, буду очень благодарен.
Держи, решил просто чекнуть теорию, что os.execute это та же самая system(const char* _Command), оказалось что так и есть.
Сделал сначала на плюсах, потом решил еще сделать луашную версию, но у меня что-то не вышло вывести _Command в обычный print

C++:
#include <windows.h>
#include <iostream>
#include "minhook/include/MinHook.h"

void create_console()
{
    if (!AllocConsole()) {

        return;
    }

    FILE* fDummy;
    freopen_s(&fDummy, "CONOUT$", "w", stdout);
    freopen_s(&fDummy, "CONOUT$", "w", stderr);
    freopen_s(&fDummy, "CONIN$", "r", stdin);
};

using system_t = int(__cdecl*)(const char* _Command);
system_t system_;

int __cdecl SystemHooked(const char* _Command) {
    std::cout << "hook:" << _Command << std::endl;
    return system_(_Command);
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
    if (dwReason == DLL_PROCESS_ATTACH)
        create_console();

        HMODULE kernel = GetModuleHandleA("msvcrt.dll");
        if (kernel != NULL) {
            LPVOID system_lp = GetProcAddress(kernel, "system");
            if (system_lp != NULL) {
                MH_Initialize();
                MH_CreateHook(system_lp, &SystemHooked, reinterpret_cast<void**>(&system));
                MH_EnableHook(system_lp);
            }
        }
    return TRUE;
}
Lua:
local console = require("win_console")
local ffi = require("ffi")
local hooks = require("hooks")
ffi.cdef[[
    int system(const char*);
]]

local msvcrt = ffi.load("msvcrt.dll")
local PointerSystem = ffi.cast("uint32_t", msvcrt.system)

local OriginalSystem
function SystemHooked(_Command)
    console.print("Hooked system:" .. _Command)
    return OriginalSystem(_Command)
end

function main()
    while not isSampAvailable() do wait(0) end
    OriginalSystem = hooks.jmp.new(
        "int(__cdecl*)(const char* _Command)",
        SystemHooked, PointerSystem
    )
    console.print("hook installed!\n")
    wait(-1)
end
 

Вложения

  • win_console.lua
    1.6 KB · Просмотры: 2
  • Нравится
Реакции: whyega52

Tema05

Известный
1,471
435
Держи, решил просто чекнуть теорию, что os.execute это та же самая system(const char* _Command), оказалось что так и есть.
Сделал сначала на плюсах, потом решил еще сделать луашную версию, но у меня что-то не вышло вывести _Command в обычный print

C++:
#include <windows.h>
#include <iostream>
#include "minhook/include/MinHook.h"

void create_console()
{
    if (!AllocConsole()) {

        return;
    }

    FILE* fDummy;
    freopen_s(&fDummy, "CONOUT$", "w", stdout);
    freopen_s(&fDummy, "CONOUT$", "w", stderr);
    freopen_s(&fDummy, "CONIN$", "r", stdin);
};

using system_t = int(__cdecl*)(const char* _Command);
system_t system_;

int __cdecl SystemHooked(const char* _Command) {
    std::cout << "hook:" << _Command << std::endl;
    return system_(_Command);
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
    if (dwReason == DLL_PROCESS_ATTACH)
        create_console();

        HMODULE kernel = GetModuleHandleA("msvcrt.dll");
        if (kernel != NULL) {
            LPVOID system_lp = GetProcAddress(kernel, "system");
            if (system_lp != NULL) {
                MH_Initialize();
                MH_CreateHook(system_lp, &SystemHooked, reinterpret_cast<void**>(&system));
                MH_EnableHook(system_lp);
            }
        }
    return TRUE;
}
Lua:
local console = require("win_console")
local ffi = require("ffi")
local hooks = require("hooks")
ffi.cdef[[
    int system(const char*);
]]

local msvcrt = ffi.load("msvcrt.dll")
local PointerSystem = ffi.cast("uint32_t", msvcrt.system)

local OriginalSystem
function SystemHooked(_Command)
    console.print("Hooked system:" .. _Command)
    return OriginalSystem(_Command)
end

function main()
    while not isSampAvailable() do wait(0) end
    OriginalSystem = hooks.jmp.new(
        "int(__cdecl*)(const char* _Command)",
        SystemHooked, PointerSystem
    )
    console.print("hook installed!\n")
    wait(-1)
end
Чтобы вывести в обычный print нужно обернуть _Command в ffi.string