Вызов функции через опкоды (Вызов функции через опкоды)

Модератор: Модераторы разделов

Аватара пользователя
netelis
Сообщения: 95
ОС: Debian Wheezy i686

Вызов функции через опкоды

Сообщение netelis »

Помогите разобратся ещё с функцией у меня не правильно работает

Код: Выделить всё

#define COMMANDS_COUNT    16

char old_commands[COMMANDS_COUNT];
unsigned char main_opcodes[] = {0x48, 0x31, 0xc0, 0x048, 0x0b8, 0xff, 0xd0, 0xc3};

void insert_code(unsigned long our_func_ptr, unsigned long sys_mkdir_ptr) {
  memcpy(old_commands, &sys_mkdir_ptr, COMMANDS_COUNT);
  memcpy(&sys_mkdir_ptr, main_opcodes, 3);
  int i;
  for (i = 0; i < sizeof(long); i++) {
    unsigned long mask = ((unsigned long)0xff << (8 * i));
    printf("Mask: %p\n", mask);
    *((unsigned char *)sys_mkdir_ptr + 3 + i) = (our_func_ptr & mask) >> (8 * i);
  }
  memcpy(&sys_mkdir_ptr + 7, main_opcodes + 3, 3);
  printf("print %p\n",sys_mkdir_ptr);
}
  long addr=0x12DF301A;
  long addr2=0;
insert_code(addr,addr2);


Когда передаю 2 параметра числа не работает.
Есть буффер опкодов на в машинном коде который выполняет некотрую процедуру и есть функция в которую я хочу прописать этот опкод который вызовет мою собственную процедуру и вызывает переход обратно
эквивалент опкода на ассемблере
xor eax, eax
mov rax, адрес_нашей_функции
call rax
ret
Вобщем решил написать свою функцию которая
1)Копирует резервные байты начала подменяемой процедуры
2)Вместо них вставляет начало опкода до адресса моей собственной функции
3) Находим адресс моей функции в обратном порядке и копируем её после опкода
4) Копируем после адресса моей функции продолжение опкода CALL eax , ret
И собственно вызываем эту процедуру которая вызовет мою функцию.
Я пытаясь разобратся написал собственную процедуру которая тоже не правильно работает

Код: Выделить всё

#define COMMANDS_COUNT 16

char old_commands[COMMANDS_COUNT];
unsigned char main_opcodes[] = {0x48, 0x31, 0xc0, 0x048, 0x0b8, 0xff, 0xd0, 0xc3};

void insert_code(unsigned long addr,unsigned long addr2){
memcpy(old_commands, &addr2, COMMANDS_COUNT);
memcpy(&addr2,main_opcodes,3);
addr2=addr2<<16;
for (i = 0; i < sizeof(long); i++) {
unsigned long mask = ((unsigned long)0xff <<(8*i));
unsigned long c=(addr&mask)>>(8*i);
addr2=addr2<<8;
addr2+=c;
};
memcpy(&addr2+3,main_opcodes+3,3);
};

В чём у меня тут ошибка?
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: Вызов функции через опкоды

Сообщение Crazy »

Ты хоть понимаешь, как такой ассемблерный код выполняется?
xor eax, eax
mov rax, адрес_нашей_функции
call rax
ret

Desipere in loco
Спасибо сказали: