Пишу программу, в которой требуется хучить АПИ. Дошел до момента, когда нужно сделать запись jmp near addr в конец функции-трамплина (а также в конец перехватываемой функции), но появился один ньюанс - т.к. слова сохраняются в памяти наоборот, мне нужно инвертировать смещение и только потом записать. Делаю вот как: Код (Text): std lea esi, OldOffset add esi, 4 lea edi, [eax+8+ebx+1+4] mov ecx, 4 rep movsb OldOffset - локальная переменная, содержащая адрес функции, lea edi, [eax+8+ebx+1+4] - здесь доступ к третьему члену структуры, последний +4 - адрес конца трамплина. Теоритически это должно работать, т.к. используется инструкция std и mosvb должен делать декремент esi и edi, но на практике в OllyDbg происходит Access Violation. Ногами сильно не пинайте, т.к. опыта в ассемблере еще маловато). Собственно вопрос: как инвертировать DWORD значение для последующей записи? Может быть для этого есть какие-либо инструкции? Заранее спасибо
ASMatik ты хочешь например из 0x12345678 получить 0x78563412? если да, то bswap. что здесь eax, ebx? если они указывают в "небо", то скорее всего ты получишь "Access Violation"
ASMatik > OldOffset - локальная переменная, содержащая адрес функции Тогда надо add esi,3 или сразу lea esi, OldOffset+3. > в OllyDbg происходит Access Violation На какой инструкции?
Ок, спасибо, проблема решена через bswap. Я думаю ничего страшного если я заюзал 486 модель. Но все-таки попробую минуя bswap через OldOffset+3. Блин, Access Violation на инструкции из модуля user32 Код (Text): 7E43288D: MOV ESI,DWORD PTR DS:[EDI] Даже хз, почему именно в user32. Может кто нибудь знает? movsb проходит нормально, память тоже копируется нормуль.
ASMatik Ничего инвертировать не нужно, т.к. не важно как числа\адреса хранятся в памяти - главное что они одинаково хранятся как в переменной OldOffset, так и в операнде jmp near. Просто делаешь Код (Text): mov ecx,[OldOffset] mov [eax+8+ebx+1],ecx