Вызов функции для удаленной настройки EAX и ECX

0

Я пытаюсь запустить функцию, находящуюся в другой программе во время выполнения и удаленно.

Используя ollydbg, я получил адрес функции и им, используя CreateRemoteThread, чтобы запустить эту функцию, она фактически запускает эту функцию, но она возвращает два аргумента и без этих аргументов сбой программы.

Проблема в том, что этот fuction получает аргументы/параметры от EAX и ECX, которые были нажаты на эту функцию до ее вызова (эти два значения являются матричными координатами, которые идут от 1 до 576 ~~)

Изображение 174551

Createemotethread не работал для определения параметров, я попытался использовать struct для использования нескольких (2) аргументов, но значения из регистров не изменяются.

Как я могу сделать этот fuction запущенным в другой программе, начав с другой отдельной программы и установив эти два регистра?

это код, где я вызываю поток для выполнения этой функции в 0x01003084

    struct tagRemoteThreadParams //didnt worked
    {
        int Param1;
        int Param2;
    } RemoteThreadParams, *PRemoteThreadParams;


    RemoteThreadParams.Param1 = 0x00000001;//didnt worked
    RemoteThreadParams.Param2 = 0x00000001;//didnt worked


    int address=0x010038B1; // 0x01003084   --  0x01002FE0 -- 0x01003512  //Some addresses

    RedrawWindow(Find,NULL,NULL,RDW_ERASE|RDW_INVALIDATE|RDW_INTERNALPAINT|RDW_FRAME); //my program stuff

    DWORD rc;

    //this is where i call the function
    CreateRemoteThread(hProcess,NULL,NULL,(LPTHREAD_START_ROUTINE)address,&RemoteThreadParams,0,&rc);

    rc = WaitForSingleObject( hProcess, 30000 ); 
    CloseHandle(hProcess);
    VirtualFreeEx(hProcess, (LPVOID)address, 0, MEM_RELEASE | MEM_DECOMMIT);

Имейте в виду, что я не хочу использовать DLL-инъекцию (это не то, что я ищу), я действительно хочу сделать это только с одним кодом. Благодарю.

  • 0
    Работа с регистрами напрямую зависит от конкретной ОС / цели. Вы не указали теги для сужения?
  • 0
    Это в Windows, IA32
Показать ещё 6 комментариев
Теги:
multithreading
memory
reverse-engineering

2 ответа

1

Ну, вы не можете передать эту функцию как поток потока для CreateRemoteThread потому что эта функция не имеет правильной подписи. Итак, вам нужно передать функцию, которая имеет правильную подпись.

Один очень распространенный способ сделать это - передать адрес LoadLibrary. Вам нужно будет предоставить свою собственную DLL. DllMain для этой DLL может затем создать новый поток, который вызывает вашу функцию.

Но вы говорите, что не хотите привлекать другую DLL. Поэтому, на мой взгляд, один вариант. Выделите некоторую память в виртуальном адресном пространстве целевого процесса. Обеспечьте, чтобы память имела исполняемую защиту. Запишите в эту память процедуру потока с правильной подписью для CreateRemoteThread. И внутри этой процедуры потока, наконец, вызовите нужную функцию.

1

Единственное ваше решение состоит в том, чтобы вводить код в другой процесс, который делает правильную настройку регистров, а затем вызывает функцию, которую вы хотите вызвать. У CreateRemoteThread есть строгое соглашение о вызове, поэтому вы не можете заставить его иметь определенные значения регистра при входе.

Другой альтернативой является использование функции отладки в Windows для изменения содержимого регистра, но для этого требуется, чтобы вы остановили код [в правильном потоке] в нужном месте и задали регистры перед продолжением. Какая сложность, и большинство приложений (при условии, что мы играем в игры с талией и т.д.), Имеют защиту, чтобы предотвратить отладочные функции от "беспорядка" с их состоянием.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню