Микс x86 и x64 вычисление указателей

Тема в разделе "WASM.X64", создана пользователем dummok, 7 янв 2018.

  1. dummok

    dummok New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2018
    Сообщения:
    4
    DWORD64 *memoryBuffer = new DWORD64;

    int main(void)
    {

    __asm
    {
    int 3

    EMIT(0x6A) EMIT(0x33) /* push _cs */ \
    EMIT(0xE8) EMIT(0) EMIT(0) EMIT(0) EMIT(0) /* call $+5 */ \
    EMIT(0x83) EMIT(4) EMIT(0x24) EMIT(5) /* add dword [esp], 5 */ \
    EMIT(0xCB) /* retf swtich to x64 */

    push memoryBuffer
    }
    }
    изучаю работу под wow64
    объясните пожалуйста почему меняется значение memoryBuffer при переключении x86-x64,
    если это как то связано с трансляцией адресов и регистром cs почему в windbgx64 в окне disassembly значения остаются прежними?
    почему не получается сделать так mov [esp], memoryBuffer вроде синтаксис masm позволяет?
    я использую visual studio для создания 32 битного приложения, как заставить понять её что я перешел в х64?
     
  2. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    dummok,

    Вы не переключаетесь в 64 мод. Вы сохраняете при retf wow селектор :)

    Ваш membuf 32-х битный. Вы должны загрузить в качестве аргумента retf соответствующий селектор, 0x33 наверно, думаю стоит его определить в динамике.
     
  3. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    В динамике? ;)
    Тогда флюшить все к херам надо ;)
     
  4. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    в студии нет поддержки инлайн асма х64? напишите на сях или асме lib и прилепите.
     
    Последнее редактирование: 7 янв 2018
  5. dummok

    dummok New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2018
    Сообщения:
    4
    согласен, я имел ввиду эмуляцию для поддержки 32битного когда, загрузка аргумента для retf EMIT(0x6A) EMIT(0x33) push cs
    для перехода в режим 64битной адресации, но почему меняется значение указателя memoryBuffer, я думал что его должно было просто расширить
    скажем с 002fb63c до 0х00000000`002fb63c а на деле 002fb63c преврощается в 0х00000000`005ee5fd при этом ds остается прежним равным 2b
     
  6. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    в студии , я пользуюсь 2010 нету поддержки инлайн можно через инклуды замутить но не эметы
    1. вы не сможете переключить селектор без потерь.....
    2. очередной майнер? (чет во всех темах токо о больших числах)
     
  7. dummok

    dummok New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2018
    Сообщения:
    4
    не могли бы вы скинуть хорошую статью или мануал про переключение селектора и изменения в окружении процесса работающего под wow ?
    http://blog.rewolf.pl/blog/?p=102 эмиты я взял вот отсюда) это 32битный код, у студии компилятор не определяет вставки асма х64
    на самом деле 64битный код я могу представить в виде текста hex значений и передать туда управление после смены селектора
    и нет это не майнер) я еще далек от этого просто изучаю матчасть
     
  8. dummok

    dummok New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2018
    Сообщения:
    4
    кажется разобрался что происходит,
    в режиме х86 опкод ff 35 3c b6 32 01 обрабатывается как push DWORD PTR ds:0x132b63c
    в режиме х64 опкод ff 35 3c b6 32 01 обрабатывается как push QWORD PTR [rip+0x132b63c] # 0x132b642
    windbg же выдает это вот в таком виде ff353cb63201 push qword ptr [00000000`0264e5fd] ds:00000000`0264e5fd
    кстати а чем EMIT плох?
     
  9. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    dummok,

    > мануал про переключение селектора и изменения в окружении процесса работающего под wow ?

    Режим переключается через межсегментное ветвление(far). Тип сегмента описан в дескрипторе, на который ссылается селектор. Так для переключения в 64 в дескрипторе должен быть установлен маркер L. Обычно такие переключения под wow называют "heavens gate" -> google.

    > кажется разобрался что происходит,

    Кодировка MODRM зависит от режима, она отличается 16/32/64. Одна и та же последовательность байт может по разному интерпретироваться. Например ваш ff 35:
    - 35 = mod(11) -- opcode_push(110) -- R/M(101).
    В 32 моде адрес вычисляется как disp32. В 16 моде как [Di]. В 64 моде используется дополнительный тип адресации(rip), которая включается при условии mod = 0 & R/M = 101. Тогда адрес вычисляется как disp32 + RIP.
     
    dummok нравится это.