LINUX.ORG.RU

Сообщения Balbes

 

Изменение кода в памяти

Задача: есть .so, которая грузится процессом. Эта сошка должна изменить код процесса, т.е. вписать в нужные места jmp-ы. В винде я бы воспользовался WriteProcessMemory, а в линуксе? Я пробовал открывать /proc/<PID>/mem при помощи open/read/write/close. read вполне даже считывает код процесса, но вот write записывать отказывается. Пробовал вставлять ptrace(PTRACE_POKEDATA, pid, adr_strangepacket, buffer);, всё равно ноль эффекта. Что делать, уже не знаю.

Balbes
()

Проблема с asm-вставками, C++

Никак не могу заставить проект, активно использующий асм-вставки, работать.

void Hook_strangepacket();
asm(".intel_syntax noprefix\n"
    "_Hook_strangepacket:\n"
    "add     esp, 0x0FFFFFFE0\n"
    "lea     edx, [esp+4]\n"
    "lea     eax, [ebp+8]\n"

    "lea		ecx, [esp+0x30]\n"
    "pushad\n"
    "push	3\n"
    "push	ecx\n"
    "call %P0\n" : : "i"(AddWarns) //ошибка: expected «)» before «:» token
    "add		esp, 8\n"
    "popad\n"
    "push	0x08057125\n"
    "ret\n"
    ".att_syntax\r\n"
);
Дело в том, что мне нужно создать naked-функцию, т.е. без прологов и эпилогов. Почему-то создатели g++ отказываются реализовывать поддержку атрибута naked для платформы IA32, поэтому приходится реализовывать функцию целиком на ассемблере. Но когда из-за «call AddWarns\n» появлялась ошибка undefined symbol: AddWarns, мне пришлось, погуглив, переделать её в «call %P0\n» : : «i»(AddWarns). Однако такая запись ну никак не хочет работать, если эта строка объявлена не в теле функции. Т.е. такая запись:
void Hook_strangepacket(){
    asm(".intel_syntax noprefix\n"
        "add     esp, 0x0FFFFFFE0\n"
        "lea     edx, [esp+4]\n"
        "lea     eax, [ebp+8]\n"

        "lea		ecx, [esp+0x30]\n"
        "pushad\n"
        "push	3\n"
        "push	ecx\n"
        "call %P0\n" : : "i"(AddWarns)
        "add		esp, 8\n"
        "popad\n"
        "push	0x08057125\n"
        "ret\n"
        ".att_syntax\r\n"
    );
}
...вполне компилируема, вот только генерирует прологи и эпилоги. Как быть?

Balbes
()

Вызов функций из уже загруженной SO

Необходимо вызвать несколько функций из находящейся в памяти процесса SO и изменить в ней несколько переменных. Проблема в том, что библиотека уже загружена в память, и хендла к ней нет. Работаю из другой библиотеки. Неплохо было бы найти какой-нибудь аналог GetModuleHandle. Или узнать точку входа этой библиотеки, тогда все функции и переменные можно будет легко достать по смещению (оно известно)

Balbes
()

RSS подписка на новые темы