• XSS.stack #1 – первый литературный журнал от юзеров форума

Не могу вызвать функцию в другом процессе

Exfazo

(L3) cache
Забанен
Регистрация
29.01.2021
Сообщения
268
Решения
1
Реакции
37
Пожалуйста, обратите внимание, что пользователь заблокирован
Всем привет, когда запускаю прогру, то процесс крашит. В чем проблема?
C:
struct ParamFnc
{
    char path[MAX_PATH];
    int data;
};

int main()
{
    DWORD addrFnc = cleoAddr + 0x20F20; //Адресс функции в чужом процессе
    ParamFnc param; //Параметры функции
    memset(&param, 0, sizeof(param));
    strcpy(param.path, (char*)"test");
    param.data = 1;
    LPVOID RemoteString = VirtualAllocEx(proc_handle, NULL, sizeof(param), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(proc_handle, RemoteString, (LPCVOID)&param, sizeof(param), NULL);
    CreateRemoteThread(proc_handle, NULL, NULL, (LPTHREAD_START_ROUTINE)addrFnc, RemoteString, NULL, NULL);
    CloseHandle(proc_handle);

    return 1;
}
 
Пожалуйста, обратите внимание, что пользователь заблокирован
В чем проблема?
Да в чем угодно. Неверный адрес функции, неверная конвенция о вызовах, да ты даже ни одного результата вызова винапи не проверил на корректность.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Да в чем угодно. Неверный адрес функции, неверная конвенция о вызовах, да ты даже ни одного результата вызова винапи не проверил на корректность.
А это правильно, то что я передаю агрументы в стек через структуры? Они точно попадут в функцию?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
А это правильно, то что я передаю агрументы в стек через структуры? Они точно попадут в функцию?
Нет, CreateRemoteThread вызывает stdcall (x86) и fastcall (x64) функцию ровно с одним параметром, который размера указателя.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Нет, CreateRemoteThread вызывает stdcall (x86) и fastcall (x64) функцию ровно с одним параметром, который размера указателя.
Как тогда передавать мне два аргумента в функцию?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Как тогда передавать мне два аргумента в функцию?
Это твоя функция?
 
Change the CreateRemoteThread line to
[CODE = cpp] HANDLE hThread = CreateRemoteThread (proc_handle, NULL, NULL, (LPTHREAD_START_ROUTINE) addrFnc, RemoteString, NULL, NULL); [/ CODE]
Then you can check if the hThread handle is NULL and call GetLastError () for more information [/ ICODE] [/ ICODE]
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Change the CreateRemoteThread line to
[CODE = cpp] HANDLE hThread = CreateRemoteThread (proc_handle, NULL, NULL, (LPTHREAD_START_ROUTINE) addrFnc, RemoteString, NULL, NULL); [/ CODE]
Then you can check if the hThread handle is NULL and call GetLastError () for more information [/ ICODE] [/ ICODE]
CreateRemoteThread returns the thread handle
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Exactly. If it's causing an error and the thread is not being created, you can use it to gather more information. Or am I misunderstanding the issue?
You've got it all wrong. I don't have a function called in the process
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Нашел такой вариант вызова функции в чужом процессе(скопировать функцию RemoteThread в чужой процесс и запустить поток на выполнение этой функции). Пытался вызвать функцию MessageBoxA в процессе телеграма, в итоге - все работает, но когда в сообщении я нажимаю кнопку ОК, то телеграмм сразу же закрывается. Из за чего может быть?
C++:
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <TlHelp32.h>

struct Struct
{
    HWND   hWnd;
    char lpText[MAX_PATH];
    char lpCaption[MAX_PATH];
    UINT   uType;
    DWORD pAdr;
}FuncArgs;

typedef void(__cdecl* _SendMSG)(HWND, char*, char*, UINT);

DWORD __stdcall RemoteThread(Struct* sArg)
{
    _SendMSG msg = (_SendMSG)sArg->pAdr;
    msg(sArg->hWnd, sArg->lpText, sArg->lpCaption, sArg->uType);
    return 0;
}
void __stdcall RemoteThread_end() {}

int GetProcessPID(wchar_t* procName)
{
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 process;
    process.dwSize = sizeof(PROCESSENTRY32);
    DWORD proc_id = 0;
    if (Process32First(snapshot, &process))
    {
        while (Process32Next(snapshot, &process))
        {
            if (wcscmp(process.szExeFile, procName) == 0)
            {
                return process.th32ProcessID;
            }
        }
    }
    return 0;
}

int main()
{
    int procDIP = GetProcessPID((wchar_t*)L"Telegram.exe");
    if (procDIP == 0)
    {
        printf("%s", "Failed to find process\n");
        return 0;
    }
    HANDLE proc_handle = OpenProcess(PROCESS_ALL_ACCESS, false, procDIP);
    if (proc_handle == 0)
    {
        printf("%s", "Failed to open process\n");
        return 0;
    }
    FuncArgs.hWnd = NULL;
    strcpy(FuncArgs.lpCaption, (char*)"123");
    strcpy(FuncArgs.lpText, (char*)"123");
    FuncArgs.uType = MB_OK;
    FuncArgs.pAdr = 0x75C6FDAE; // адрес MessageBoxA
    LPVOID pRemoteThread = VirtualAllocEx(proc_handle, NULL, (DWORD_PTR)RemoteThread_end - (DWORD_PTR)RemoteThread, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); // Тут я выделил память процессу
    WriteProcessMemory(proc_handle, pRemoteThread, (LPVOID)RemoteThread, ((DWORD_PTR)RemoteThread_end - (DWORD_PTR)RemoteThread), 0); //Скопировал функцию RemoteThread в память
    Struct* myArg = (Struct*)VirtualAllocEx(proc_handle, NULL, sizeof(Struct), MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(proc_handle, myArg, &FuncArgs, sizeof(Struct), NULL);
    HANDLE hThread = CreateRemoteThread(proc_handle, 0, 0, (LPTHREAD_START_ROUTINE)pRemoteThread, myArg, 0, 0);
    CloseHandle(hThread);
    VirtualFreeEx(proc_handle, myArg, sizeof(Struct), MEM_RELEASE);
    CloseHandle(proc_handle);

    return 1;
}
Проверил каждую винапи функцию, везде нету проблем. В кодах ошибках по нулям
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Проверил каждую винапи функцию, везде нету проблем. В кодах ошибках по нулям
Ну, например, потому, что ты освобождаешь myArg в удаленном процессе, до того, как завершится исполнения удаленного потока, а поток обращается к адресу myArg, по которому уже освобождена память.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх