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?
dummok, Вы не переключаетесь в 64 мод. Вы сохраняете при retf wow селектор Ваш membuf 32-х битный. Вы должны загрузить в качестве аргумента retf соответствующий селектор, 0x33 наверно, думаю стоит его определить в динамике.
согласен, я имел ввиду эмуляцию для поддержки 32битного когда, загрузка аргумента для retf EMIT(0x6A) EMIT(0x33) push cs для перехода в режим 64битной адресации, но почему меняется значение указателя memoryBuffer, я думал что его должно было просто расширить скажем с 002fb63c до 0х00000000`002fb63c а на деле 002fb63c преврощается в 0х00000000`005ee5fd при этом ds остается прежним равным 2b
в студии , я пользуюсь 2010 нету поддержки инлайн можно через инклуды замутить но не эметы 1. вы не сможете переключить селектор без потерь..... 2. очередной майнер? (чет во всех темах токо о больших числах)
не могли бы вы скинуть хорошую статью или мануал про переключение селектора и изменения в окружении процесса работающего под wow ? http://blog.rewolf.pl/blog/?p=102 эмиты я взял вот отсюда) это 32битный код, у студии компилятор не определяет вставки асма х64 на самом деле 64битный код я могу представить в виде текста hex значений и передать туда управление после смены селектора и нет это не майнер) я еще далек от этого просто изучаю матчасть
кажется разобрался что происходит, в режиме х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 плох?
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.