Использование __asm ​​для вызова функции из шестнадцатеричного смещения - PullRequest
1 голос
/ 18 декабря 2009

Я не знаю сборки, поэтому не знаю, как это сделать.

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

#define FuncToCall 0x00447E5D

Итак, как теперь я могу использовать __asm ​​{} для вызова этой функции?

Ответы [ 4 ]

3 голосов
/ 18 декабря 2009

Ну, короткий ответ: если вы не знаете сборку, вам не следует этого делать, ха-ха.

Но, если вы так сильно хотите взломать стену, я имею в виду изменение работы законной программы, вы не можете просто взять адрес и назвать его хорошим.

Вам нужно найти символ (если он находится в счастливой стране Linux) или использовать sig-сканирование (или оба D =), чтобы найти реальную функцию.

Как только вы это сделаете, все относительно просто, вам просто нужно написать mov и jmp. Предполагая, что у вас уже есть доступ к запущенному процессу, и ваш sig-сканер нашел правильный адрес, этот бит кода даст вам желаемый

mov eax, 0×deadbeef
jmp eax

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

Существует также некоторая путаница, связанная с различными соглашениями о вызовах, так что никто из комментаторов не пытается меня об этом назвать, что далеко продвинулось в этом вопросе.

EDIT: Между прочим, я не использую call, потому что при использовании call вы должны беспокоиться о кадрах стека и других очень беспорядочных вещах. Этот код перейдет на любой адрес и начнет выполняться.

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

1 голос
/ 18 декабря 2009

Спасибо за ответы, но я разобрался. Вот что я делаю:

#define FuncToCall 0x00447E5D
DWORD myfunc = FuncToCall; 
__asm call dword ptr [myfunc]; 

Если это работает, не исправляйте это, и, черт возьми, это работает.

1 голос
/ 18 декабря 2009

Я думаю, вы могли бы также привести этот адрес к указателю на функцию и вызвать его таким образом. Это может быть лучше.

0 голосов
/ 23 мая 2011

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

void call_FuncToCall(.......)
{
  __asm__
  ("call label1\n label1:\n"
   "pop %eax\n"
   "movl FuncToCall, %eax\n"
   "leave\n"
   "jmp *%eax");
}
...