Сейчас на форуме: jinoweb (+4 невидимых)

 [email protected] —› Программирование —› x86 -> x64 on W10
Посл.ответ Сообщение


Ранг: 216.9 (наставник), 85thx
Активность: 0.310.15
Статус: Участник
X-Literator

Создано: 10 сентября 2019 16:07
· Личное сообщение · #1

Всех приветствую.

Разбираюсь в реализации перехода к выполнению x64 кода из 32-битного процесса.

Постараюсь как можно более конкретно сформулировать возникший вопрос.

За основу взял всем известный код https://github.com/dadas190/Heavens-Gate-2.0

В функции X64Call() всё предельно просто - в начале

push 0x33
push _next_64bit_block

С этого момента (а точнее, после retf сразу за этим кодом) должен выполняться 64-битный код, так как сегмент кода будет изменен на 0x33. До этого в выделенной для куска машинного кода памяти меняются адреса на актуальные, подставляется нужное значение, чтобы исправить стек, и т.д.:

*(uint32_t*)(r + 3) = (uint32_t)(r + 8);
*(uint8_t*)(r + 20) = stackfix;
*(uint8_t*)(r + 27) = (uint8_t)(((n>4) ? (n - 4) : 0));
*(uint32_t*)(r + 34) = (uint32_t)(&args[n - 1]);
*(uint64_t*)(r + 83) = proc;
*(uint8_t*)(r + 96) = (uint8_t)(32 + ((n > 4) ? ((n - 4) * 8) : 0));
*(uint32_t*)(r + 104) = (uint32_t)(&ret);
*(uint32_t*)(r + 115) = (uint32_t)(r + 121);


Но как я ни бился, как я ни экспериментировал с выравниванием, с количеством передаваемых параметров вызываемой функции, выполнение вылетает в ntdll

.text:77ED1DF0 ntdll.dll:$71DF0 #711F0 <ZwAllocateVirtualMemory>: ACCESS VIOLATION.

Работает ли в принципе эта фича в новых виндах, или там что-то поправили, и теперь это невозможно / сложно?

Буду благодарен даже не за конкретное решение, а за подсказки.

-----
Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей.





Ранг: 69.9 (постоянный), 82thx
Активность: 0.140.73
Статус: Участник

Создано: 10 сентября 2019 18:03
· Личное сообщение · #2

Crawler
на десятке 1809 (предпоследняя это вроде?) работает. Но я юзал чужую либу ( --> rewolf wow64ext<-- ), а не кодил вручную HG.

| Сообщение посчитали полезным: Crawler


Ранг: 216.9 (наставник), 85thx
Активность: 0.310.15
Статус: Участник
X-Literator

Создано: 11 сентября 2019 10:05
· Личное сообщение · #3

morgot, спасибо за наводочку, протестирую)

-----
Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей.




Ранг: 19.5 (новичок), 8thx
Активность: 0.050.08
Статус: Участник

Создано: 11 сентября 2019 11:11
· Личное сообщение · #4

странный какой-то код, при желании можно упростить в разы
LoadLibrary64 отрабатывает нормально, вызывая 64 битную ntdll._LdrLoadDll
GetProcAddress64 тоже отрабатывает, но вызывает при этом 32 битную kernel32 (возможно здесь косяк?)
в обоих случаях возвращается значение отличное от нуля
после вызова X64Call возвращаемое значение 0 и программа падает на combase._CoIncrementMTAUsage mov rdx,[rax+rcx*8]

проверял на Windows 10 х64 1903



Ранг: 262.5 (наставник), 337thx
Активность: 0.340.25
Статус: Участник

Создано: 11 сентября 2019 11:15
· Личное сообщение · #5

morgot пишет:
rewolf wow64ext

Может пригодится, инфа от автора:
http://blog.rewolf.pl/blog/?p=102

| Сообщение посчитали полезным: Crawler


Ранг: 216.9 (наставник), 85thx
Активность: 0.310.15
Статус: Участник
X-Literator

Создано: 11 сентября 2019 12:31
· Личное сообщение · #6

TryAga1n Спасибо! Пригодится)

Добавлено спустя 19 минут
dezmand07
Скорее всего, трабла именно в том, что для вызова X64Call() там обвязка написана для предыдущих версий винды, а сейчас что-то со стеком)

-----
Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей.





Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 13 сентября 2019 23:06 · Поправил: difexacaw
· Личное сообщение · #7

В 10-ке есть редкая инструкция в торбо wrfsbase, вообще с сегментами какая то мистика, загрузив одинаковый селектор в fs/gs адресация происходит разная.. хз нужно конкретно Интел маны изучать, как это работает. По любому будут траблы с сегментами. Это можно выяснить только отладкой, никак иначе. Там есть есчо фичи в нт планировщике, он как то проверяет сегменты и их фиксит. Это есть даже в сурках в2к, но там обработка совсем иная. Мне тоже пока не ясно что там идёт не так.

-----
vx


| Сообщение посчитали полезным: Crawler


Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 14 февраля 2020 20:27
· Личное сообщение · #8

Потестите кому не лень. Не могу понять что за фигня, толи в железе баг, откуда анстаб на некорых версиях/железе. Таких тем уже много, нужно понять причину.

b25b_14.02.2020_EXELAB.rU.tgz - Wow.7z

-----
vx




Ранг: 16.3 (новичок), 3thx
Активность: 0.010.06
Статус: Участник

Создано: 16 марта 2020 19:30
· Личное сообщение · #9

О, знакомые штуки.
Пользую запчасти из этого и других гейтов, ибо у меня не msvc, а mingw и его не очень умение в инлайл асм, который так обожают почти все авторы гейтов.
У меня эта штука написана с год, если не больше, назад, в большом проекте, недавно туда полез - стало крашить на получении PEB64, на мелких прогах-тестах - все норм, хотя ничего не менял, только еще пару функций из х64 добавил. Решил отключением оптимизации кода вокруг memcpy64 и GetPEB64. Судя по отсутствию криков НИЧЕГОНЕРАБОТАЕТ - у остальных проблем нет, разброс винды от семерки и дальше.
А вот X64Call у меня выглядит иначе и сейчас я озадачился откуда и почему, ибо с первых разов в гугле подобного не нашел.
Code:
  1. uint8_t callx64_code[346] = { 0x55, 0x8B, 0xEC, 0x83, 0xEC, 0x40, 0x53, 0x56, 0x57, 0x8B, 0x4D, 0x10, 0x8D, 0x55, 0x14, 0x85, 0xC9, 0x7E, 0x15, 0x8B, 0x45, 0x14, 0x8D, 0x55, 0x1C, 0x49, 0x89, 0x45, 0xF0, 0x8B, 0x45, 0x18, 0x89, 0x4D, 0x10, 0x89, 0x45, 0xF4, 0xEB, 0x08, 0x0F, 0x57, 0xC0, 0x66, 0x0F, 0x13, 0x45, 0xF0, 0x85, 0xC9, 0x7E, 0x15, 0x49, 0x83, 0xC2, 0x08, 0x89, 0x4D, 0x10, 0x8B, 0x42, 0xF8, 0x89, 0x45, 0xE8, 0x8B, 0x42, 0xFC, 0x89, 0x45, 0xEC, 0xEB, 0x08, 0x0F, 0x57, 0xC0, 0x66, 0x0F, 0x13, 0x45, 0xE8, 0x85, 0xC9, 0x7E, 0x15, 0x49, 0x83, 0xC2, 0x08, 0x89, 0x4D, 0x10, 0x8B, 0x42, 0xF8, 0x89, 0x45, 0xE0, 0x8B, 0x42, 0xFC, 0x89, 0x45, 0xE4, 0xEB, 0x08, 0x0F, 0x57, 0xC0, 0x66, 0x0F, 0x13, 0x45, 0xE0, 0x85, 0xC9, 0x7E, 0x15, 0x49, 0x83, 0xC2, 0x08, 0x89, 0x4D, 0x10, 0x8B, 0x42, 0xF8, 0x89, 0x45, 0xD8, 0x8B, 0x42, 0xFC, 0x89, 0x45, 0xDC, 0xEB, 0x08, 0x0F, 0x57, 0xC0, 0x66, 0x0F, 0x13, 0x45, 0xD8, 0x8B, 0xC2, 0xC7, 0x45, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x99, 0x0F, 0x57, 0xC0, 0x89, 0x45, 0xC0, 0x8B, 0xC1, 0x89, 0x55, 0xC4, 0x99, 0x66, 0x0F, 0x13, 0x45, 0xC8, 0x89, 0x45, 0xD0, 0x89, 0x55, 0xD4, 0xC7, 0x45, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x66, 0x8C, 0x65, 0xF8, 0xB8, 0x2B, 0x00, 0x00, 0x00, 0x66, 0x8E, 0xE0, 0x89, 0x65, 0xFC, 0x83, 0xE4, 0xF0, 0x6A, 0x33, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x83, 0x04, 0x24, 0x05, 0xCB, 0x48, 0x8B, 0x4D, 0xF0, 0x48, 0x8B, 0x55, 0xE8, 0xFF, 0x75, 0xE0, 0x49, 0x58, 0xFF, 0x75, 0xD8, 0x49, 0x59, 0x48, 0x8B, 0x45, 0xD0, 0xA8, 0x01, 0x75, 0x03, 0x83, 0xEC, 0x08, 0x57, 0x48, 0x8B, 0x7D, 0xC0, 0x48, 0x85, 0xC0, 0x74, 0x16, 0x48, 0x8D, 0x7C, 0xC7, 0xF8, 0x48, 0x85, 0xC0, 0x74, 0x0C, 0xFF, 0x37, 0x48, 0x83, 0xEF, 0x08, 0x48, 0x83, 0xE8, 0x01, 0xEB, 0xEF, 0x48, 0x83, 0xEC, 0x20, 0xFF, 0x55, 0x08, 0x48, 0x8B, 0x4D, 0xD0, 0x48, 0x8D, 0x64, 0xCC, 0x20, 0x5F, 0x48, 0x89, 0x45, 0xC8, 0xE8, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x44, 0x24, 0x04, 0x23, 0x00, 0x00, 0x00, 0x83, 0x04, 0x24, 0x0D, 0xCB, 0x66, 0x8C, 0xD8, 0x66, 0x8E, 0xD0, 0x8B, 0x65, 0xFC, 0x66, 0x8B, 0x45, 0xF8, 0x66, 0x8E, 0xE0, 0x8B, 0x45, 0xC8, 0x8B, 0x55, 0xCC, 0x5F, 0x5E, 0x5B, 0x8B, 0xE5, 0x5D, 0xC3 };

Ну и грубо говоря:
typedef DWORD64 (*tX64Call)(DWORD64 func, int argC, ...);
tX64Call X64Call = (tX64Call)callx64_code;




Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 16 марта 2020 21:21
· Личное сообщение · #10

ZLOFENIX

Твой код будет работать от фазы луны:

Code:
  1. $+BF   mov eax,2B
  2. $+C4   mov fs,ax


- fs: 53, планировщик пофиксит значение при первом переключении контекста(=> 47.KiSC25) --> Link <--

Code:
  1.    mov ax,2B
  2.    mov fs,ax
  3. L: mov ax,fs
  4.    cmp ax,2B
  5.    je L
  6. ; swapcontext..


- можно посчитать переключения.

Code:
  1.    mov rcx,[rbp-10]
  2.    mov rdx,[rbp-18]
  3.    push [rbp-20]


- 64 код после переключения мода. А куда собственно указывает rsp/rbp.. наверно так совпало что LM_RSP < CM_ESP, поэтому и не падает, а используется чужой стек --> Link <--

В этих переключениях есть скрытые нюансы, не зная которые сложно понять в чём нестабильность.

-----
vx





Ранг: 90.1 (постоянный), 91thx
Активность: 0.290.56
Статус: Участник

Создано: 16 марта 2020 22:50
· Личное сообщение · #11

difexacaw пишет:
Твой код будет работать от фазы луны:
$+BF mov eax,2B
$+C4 mov fs,ax

Это код револьфа, и эти строки необходимы, иначе могут быть проблемы с RFG на десятой винде.

-----
В облачке многоточия





Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 16 марта 2020 23:35 · Поправил: difexacaw
· Личное сообщение · #12

Boostyq

Так ведь на 10-ке SwapContext(): mov eax,53h/mov fs,eax(10.0.1). Хотя там есть условие что поток не маркирован, а маркер устанавливается от параметров в KeInitThread(StartContext?). Врядле это как то связано с fg. Без rfg и на 8-ке в частности селектор восстанавливается, а значит это уже анстаб.

Добавлено спустя 18 минут
Простой пример:

Code:
  1.          invoke GetTickCount
  2.          lea ebx,[eax][16000]
  3.          xor edi,edi
  4.          .repeat
  5.                  mov ax,ds
  6.                  mov fs,ax
  7.                  .repeat
  8.                         mov dx,fs
  9.                  .until Ax != Dx
  10.                  inc edi
  11.                  invoke GetTickCount
  12.          .until Eax >= Ebx
  13.          shr edi,5


w8, деф. приоритет: ~120переключений/с. На высоком приоритете ~30.

-----
vx





Ранг: 90.1 (постоянный), 91thx
Активность: 0.290.56
Статус: Участник

Создано: 17 марта 2020 01:15
· Личное сообщение · #13

difexacaw пишет:
Без rfg и на 8-ке в частности селектор восстанавливается, а значит это уже анстаб.

За что купила, за то продала, референс указала, так что здесь мои полномочия уже все.
Возможно в норме селектор должен переписываться, но это происходит не на всех сборках, насколько помню в комите был указан определенный номер.

-----
В облачке многоточия





Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 17 марта 2020 19:45 · Поправил: difexacaw
· Личное сообщение · #14

Boostyq

Селекторы трогать нельзя, будет анстаб, на этом был косяк не только у меня ^. А если этот ваш револьф написал кривую реализацию(без переключения стека даже) и все начали копипастить, то это уже проблемы бездумного использования чужих кривых поделок. А как там с fg я посмотрю, наверно сначала нужно этого револьфа почитать, что бы все версии модулей не тянуть. Было бы неплохо номер вспомнить, примерно хоть

-----
vx





Ранг: 90.1 (постоянный), 91thx
Активность: 0.290.56
Статус: Участник

Создано: 17 марта 2020 21:54
· Личное сообщение · #15

difexacaw пишет:
А если этот ваш револьф написал кривую реализацию

Этот револьф на несколько порядков > тебя, его либу юзают кучу людей, а твой помет только ты.
И никто не пишет про анстаб, потому что он исправил уже кучу багов, а ты только кукареку.
Если подставить клавиатуру под твой бескостный вечномолотящий язык, то самая правильная реализация будет готова быстрее, чем я успею сказать надо же.
difexacaw пишет:
неплохо номер вспомнить, примерно хоть

В гугле забанили? На гитхаб зайди да почитай.

-----
В облачке многоточия





Ранг: 69.9 (постоянный), 82thx
Активность: 0.140.73
Статус: Участник

Создано: 17 марта 2020 22:19 · Поправил: morgot
· Личное сообщение · #16

difexacaw , Boostyq
насколько я понимаю, речь об этом --> Closing “Heaven’s Gate”<--
Хз как оно там правильно, но реализация от револьфа работает на всех 64 битных ОС, что я тестил, вплоть до последней десятки.

Инди, напишите свою реализацию, много кто будет благодарен.




Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 17 марта 2020 22:27
· Личное сообщение · #17

Boostyq

Не истери, проходи мимо если чота не нравится.

morgot

Давно уже, такой же анстаб и было выяснено почему. У всех анстаб, так как стек не переключался и сегменты бились.

-----
vx





Ранг: 77.2 (постоянный), 74thx
Активность: 0.190.15
Статус: Участник

Создано: 17 марта 2020 22:42
· Личное сообщение · #18

difexacaw пишет:
У всех анстаб, так как стек не переключался и сегменты бились.

Переведи на русский свою хрень..




Ранг: 69.9 (постоянный), 82thx
Активность: 0.140.73
Статус: Участник

Создано: 17 марта 2020 22:51
· Личное сообщение · #19

difexacaw
в каких случаях этот код падает? Т.к. я его юзал как РоС больше, там вызвать 2-3 функи и все.




Ранг: 90.1 (постоянный), 91thx
Активность: 0.290.56
Статус: Участник

Создано: 18 марта 2020 00:32
· Личное сообщение · #20

difexacaw пишет:
Не истери, проходи мимо если чота не нравится.

Да, мне не нравишься ты и твое тошнотворное поведение, но я не вижу причин следовать совету какого-то гребня.
Тебе давно пора заметить, что как бы твое чсв не упорствовало, большинство людей вокруг умнее тебя.
И если твой код падает, то наберись мужества, признай что он шваль, и посмотри нормальную реализацию.

-----
В облачке многоточия



 [email protected] —› Программирование —› x86 -> x64 on W10
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати