Masm и Syscall

Тема в разделе "WASM.BEGINNERS", создана пользователем M0rg0t, 20 июн 2020.

Метки:
  1. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    Не могу понять, в чем ошибка, или масм глючит, или я не знаю какой-то матчасти. Есть код вида
    Код (ASM):
    1.  
    2. invoke GetModuleHandle,chr$("user32.dll")
    3. mov pMem,rax
    4. invoke VirtualProtect,pMem,16d,PAGE_EXECUTE_READWRITE,addr oldProtect
    5. ;т.е. это
    6. invoke NtProtectVirtualMemory,INVALID_HANDLE_VALUE,ppMem,addr tmp,PAGE_EXECUTE_READWRITE,addr oldProtect
    7.  
    Перевожу вызов функции на сисколл
    Код (ASM):
    1. mov rcx,INVALID_HANDLE_VALUE
    2. mov rdx,ppMem
    3. lea r8,tmp
    4. mov r9,PAGE_EXECUTE_READWRITE
    5. lea rax,oldProtect
    6. mov qword ptr [rsp+32],rax
    7. call xNtProtectVirtualMemory ;Вот эта строка
    8. xNtProtectVirtualMemory: ;и эта, без них не робит
    9. mov     r10, rcx
    10. mov     eax, 50h
    11. syscall
    12. ret
    Почему-то оно не работает, если убрать эти две строки (call и метку), тогда идет ошибка доступа к памяти (C000005) и сискол не отрабатывает. Если же метку и переход оставить, то норм.

    Почему так?
     
  2. Indy_

    Indy_ Well-Known Member

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

    В сурках XP описаны прототипы и непосредственно открыт код сервисной обработки, прототипы смотри. Только не позеленей при этом :sarcastic:
     
  3. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    Indy_, так а что не так?:dntknw: Хендл текущего процесса же будет HANDLE - 1, т.е. вот эта константа.
    --- Сообщение объединено, 20 июн 2020 ---
    И с обычным вызовом натив апи работает, сисколл только нет.
     
  4. Indy_

    Indy_ Well-Known Member

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

    А тебе не очевидно что стек смещён ?

    Когда вызываешь процедуру он смещается, а сервисные аргументы не только через регистры передаются.

    Да и вообще зачем тебе сервисы трогать, глупая бессмысленная затея.
    --- Сообщение объединено, 20 июн 2020 ---
    > т.е. вот эта константа.

    Это код ошибки использованный вместо описателя процесса, значение тоже но смысл иной.
     
    M0rg0t и q2e74 нравится это.
  5. q2e74

    q2e74 Active Member

    Публикаций:
    0
    Регистрация:
    18 окт 2018
    Сообщения:
    988
    Мега философская фишка.
     
  6. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    Да вроде как очевидно, но непонятно. Т.е. достаточно добавить push rax и будет норм?
    Ну интересно просто, для обучения.
    А как надо? (HANDLE - 1 ) ?
     
  7. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Ошибка в конвенции вызова, вроде как NumberOfBytesToProtect должно быть в r8, указатель OldAccessProtection на стеке. Если сам исполняемый код доступен на запись, то все работает как надо, если READ_EXECUTE то странно что оно отрабатывает.
     
  8. Indy_

    Indy_ Well-Known Member

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

    Код (Text):
    1. #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
    - wrk
     
    M0rg0t нравится это.
  9. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    Это есть , см rax (заношу адрес туда и на стек).
    Ну обычный вызов апи отрабатывает , просто через сисколл нужно добавить еще 1 пуш..
     
  10. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Видимо надо смотреть в отладчике, что на момент сисколла в регистрах и на стеке, в чем отличие.
     
    TrashGen нравится это.
  11. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    ormoulu, там все идентичное. Просто видимо нужен лишний push , возможно внутри функция (в ядре) что-то там считает, хз. В юзермодном отладчике, повторюсь, отличий нет.
     
  12. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.173
    Адрес:
    подполье
    Сервис в курсе, что на стеке должен быть есчо и адрес возврата из NtProtectVirtualMemory
    --- Сообщение объединено, 20 июн 2020 ---
    То есть тупо по коду если, то вот это смещение в стеке
    6. mov qword ptr [rsp+32], rax
    без call будет другим
     
    M0rg0t нравится это.
  13. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    Подниму тему. Реально ли выполнить сискол в WOW64 без Heavens Gate? Пишу примерно так

    Код (ASM):
    1. push offset oldProtect
    2. push PAGE_EXECUTE_READWRITE
    3. mov tmp,4096
    4. push offset tmp ;        NumberOfBytesToProtect,
    5. push offset pMem
    6. push 0FFFFFFFFh
    7.  
    8. ; дальше либо так
    9. mov     eax, 50h ;тут номер NtProtectVM
    10. lea edx,[esp+4]
    11. xor ecx,ecx
    12. assume fs:nothing
    13. call dword ptr fs:[0C0h] ;TEB->WOW32Reserved
    14.  
    15. ;либо так, один хрен ACCESS_VIOLATION
    16.  invoke GetModuleHandleW,uni$("ntdll")
    17.  mov edx,eax
    18.  invoke GetProcAddress,edx,chr$("Wow64Transition")
    19. .if !eax
    20.  exit
    21. .else
    22.  mov dwWOW, eax ;addr wow64t
    23. .endif
    24.  
    25. mov edx,dwWOW
    26. ....
    27. call @f
    28. @@:
    29. call dword ptr[edx]
    30.  
    31.  
    Опять , все как в дебагере, а на деле х.
    --- Сообщение объединено, 13 дек 2020 ---
    Все работает, видимо временный глюк с выравниванием / стеком / алкоголем.
     
  14. Indy_

    Indy_ Well-Known Member

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

    Слой эмуляции wow64, не получится по простому.

    Предлагаю выложить дамп кл что бы ссылаться на уже решённые задачи. Тем более ты ведь его выкачал.
     
  15. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    Я не хочу вручную эмулировать это все, просто прыжок туда, а там пусть ОС выполняет. Так то вроде работает, не знаю насколько стабильное решение правда.

    так надо куда-то залить, видимо. Я же делал chm файл, но это не то. Сайт какой-то сделать рид-онли и туда?
     
    Indy_ нравится это.
  16. Indy_

    Indy_ Well-Known Member

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

    > Сайт какой-то сделать рид-онли и туда?

    Не знаю, тебе лучше знать. Да и вообще вопрос не простой, если даже сюда это прицепить то вероятно форум заддосят или есчо как то поломают.
     
  17. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.173
    Адрес:
    подполье
    А почему бы, как и все решения (являющиеся ответами не только на многие заданные вопросы, но так же и на которые есчо никто не думал задавать!) не выкласть на inde-vx.nаrod.ru в html? Или даже в chm. И ссылацо на нево, типо, иди вон цхм читай там всё решено где выборка из еп и графствует морфом по стеку
     
  18. Indy_

    Indy_ Well-Known Member

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

    А хост ты оплатишь ?
     
  19. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    О хоспаде, я уже писал, сделайте экспорт в html, чтобы все ссылки между страницами работали, и захостите бесплатно на гитхабе. Визоры они осилили, а статический сайт запостить не могут, позорище, а не спецы.
     
  20. Indy_

    Indy_ Well-Known Member

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

    Я никогда не говорил что этих поганых скриптах шарю, мне это знать не нужно.