Инветрировать DWORD

Тема в разделе "WASM.ASSEMBLER", создана пользователем ASMatik, 9 ноя 2008.

  1. ASMatik

    ASMatik New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2008
    Сообщения:
    27
    Пишу программу, в которой требуется хучить АПИ. Дошел до момента, когда нужно сделать запись jmp near addr в конец функции-трамплина (а также в конец перехватываемой функции), но появился один ньюанс - т.к. слова сохраняются в памяти наоборот, мне нужно инвертировать смещение и только потом записать. Делаю вот как:
    Код (Text):
    1. std
    2. lea     esi, OldOffset
    3. add     esi, 4
    4. lea     edi, [eax+8+ebx+1+4]
    5. mov     ecx, 4
    6. rep     movsb
    OldOffset - локальная переменная, содержащая адрес функции,
    lea edi, [eax+8+ebx+1+4] - здесь доступ к третьему члену структуры, последний +4 - адрес конца трамплина.
    Теоритически это должно работать, т.к. используется инструкция std и mosvb должен делать декремент esi и edi, но на практике в OllyDbg происходит Access Violation. Ногами сильно не пинайте, т.к. опыта в ассемблере еще маловато). Собственно вопрос: как инвертировать DWORD значение для последующей записи? Может быть для этого есть какие-либо инструкции? Заранее спасибо
     
  2. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    ASMatik
    BSWAP?
     
  3. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    ASMatik
    ты хочешь например из 0x12345678 получить 0x78563412? если да, то bswap.
    что здесь eax, ebx? если они указывают в "небо", то скорее всего ты получишь "Access Violation"
     
  4. ASMatik

    ASMatik New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2008
    Сообщения:
    27
    Большое спасибо всем. BSWAP самое оно))).
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    ASMatik
    > OldOffset - локальная переменная, содержащая адрес функции
    Тогда надо add esi,3 или сразу lea esi, OldOffset+3.

    > в OllyDbg происходит Access Violation
    На какой инструкции?
     
  6. ASMatik

    ASMatik New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2008
    Сообщения:
    27
    Ок, спасибо, проблема решена через bswap. Я думаю ничего страшного если я заюзал 486 модель. Но все-таки попробую минуя bswap через OldOffset+3.


    Блин, Access Violation на инструкции из модуля user32
    Код (Text):
    1. 7E43288D:   MOV ESI,DWORD PTR DS:[EDI]
    Даже хз, почему именно в user32. Может кто нибудь знает? movsb проходит нормально, память тоже копируется нормуль.
     
  7. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    ASMatik
    Access Violation на инструкции из модуля user32
    А ты std вернул в состояние cld?
     
  8. ASMatik

    ASMatik New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2008
    Сообщения:
    27
    Точно! Вот как тут все хитро))))) Огромное спасибо q_q. Все заработало
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    ASMatik
    Ничего инвертировать не нужно, т.к. не важно как числа\адреса хранятся в памяти - главное что они одинаково хранятся как в переменной OldOffset, так и в операнде jmp near. Просто делаешь
    Код (Text):
    1. mov ecx,[OldOffset]
    2. mov [eax+8+ebx+1],ecx
     
  10. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    leo
    спасибо :lol:
     
  11. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.873
    ASMatic
    три года leo ждал вашего "спасибо" -- наверное, не дождался ;)