Важная информация
Показано с 1 по 5 из 5

Тема: Передача параметров через изменение маш. кода

  1. #1 Передача параметров через изменение маш. кода 
    Разбирающийся
    Регистрация
    13.10.2013
    Сообщений
    53
    Сказал(а) спасибо
    52
    Поблагодарили 34 раз(а) в 22 сообщениях
    Здравствуйте.

    На днях решил попробовать передавать параметры подпрограмме напрямую в код (на благо производительности),
    но, разумеется, столкнулся с нарушением прав доступа (на сколько я понимаю). В интернете я находил лишь либо
    общие слова, либо подключение сторонних библиотек ("mman.h" вроде) для Linux.

    Пример того, что я пытался сделать:
    Процедура:
    Код FreeBasic:
    Sub foo()
       Asm
          push 1
          
          _label:
          push 7 '<- this '7' has address (_label + 1) and size 1 byte
          
          push 0
          Call _fb_PrintInt@12  'print 7
       End Asm
    End Sub
    Получить смещение и прочитать кусок маш.кода:
    Код FreeBasic:
    Dim address As Integer
    'put offset of _label in 'address' 
    Asm
       mov eax, offset _label
       mov [address], eax
    End Asm
     
    'read 'foo':
    Print "fragment of code:"
    For i As Integer = 0 To 3
       Print i, Peek(UByte, address+i)
    Next
    Попытка переписать код, где программа крашится:
    Код FreeBasic:
    'try to rewrite:
    Asm
       mov eax, [address]
       mov Byte Ptr [eax + 1], 8
    End Asm
    Sleep
    Есть ли относительно простой способ реализовать это или овчинка выделки не стоит?
    Ответить с цитированием  
     

  2. Пользователь сказал cпасибо:

    >Quiet Snow< (27.03.2015)

  3. #2  
    Профи Аватар для stabud
    Регистрация
    05.01.2013
    Сообщений
    765
    Сказал(а) спасибо
    318
    Поблагодарили 337 раз(а) в 266 сообщениях
    Записей в блоге
    6
    Цитата Сообщение от Good.Morning Посмотреть сообщение
    Попытка переписать код, где программа крашится:
    Понятное дело, у программ по умолчанию ставится защита на модификацию кода.

    Можно обойти это , например так:

    FreeBasic Code:
    1. #Include "windows.bi"
    2. Sub foo()
    3.    Asm
    4.       push 1
    5.  
    6.       _label:
    7.       push 7 '<- this '7' has address (_label + 1) and size 1 byte
    8.  
    9.       push 0
    10.       Call _fb_PrintInt@12  'print 7
    11.    End Asm
    12. End Sub
    13.  
    14. Dim address As Integer
    15. 'put offset of _label in 'address'
    16. Asm
    17.    mov eax, offset _label
    18.    mov [address], eax
    19. End Asm
    20.  
    21. 'read 'foo':
    22. Print "fragment of code:"
    23. For i As Integer = 0 To 3
    24.    Print i, Peek(UByte, address+i)
    25. Next
    26.  
    27. Dim As Integer pOldProtect,pOldProtect2
    28.  
    29. VirtualProtect(Cast(Any Ptr,address),4,PAGE_EXECUTE_READWRITE,@pOldProtect)
    30.  
    31. Asm
    32.    mov eax, [address]
    33.    mov Byte Ptr [eax + 1], 8
    34. End Asm
    35. VirtualProtect(Cast(Any Ptr,address),4,pOldProtect,@pOldProtect2)
    36. 'read 'foo':
    37. Print "fragment of code:"
    38. For i As Integer = 0 To 3
    39.    Print i, Peek(UByte, address+i)
    40. Next
    41. sleep
    Ответить с цитированием  
     

  4. 4 пользователя(ей) сказали cпасибо:

    >Quiet Snow< (27.03.2015), Free Admin (27.03.2015), Good.Morning (26.03.2015), Абадябер (26.03.2015)

  5. #3  
    Разбирающийся
    Регистрация
    13.10.2013
    Сообщений
    53
    Сказал(а) спасибо
    52
    Поблагодарили 34 раз(а) в 22 сообщениях
    stabud, большое спасибо.
    А менять защиту на старую обязательно или она восстанавливается при завершении работы программы?
    Ответить с цитированием  
     

  6. #4  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,819
    Сказал(а) спасибо
    1,806
    Поблагодарили 932 раз(а) в 794 сообщениях
    Записей в блоге
    1
    А менять защиту на старую обязательно
    Не обязательно, так the trick говорил. Но сам бы возвращал, т.к. стараюсь чтобы код по всем канонам был.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  7. Пользователь сказал cпасибо:

    Good.Morning (27.03.2015)

  8. #5  
    Профи Аватар для stabud
    Регистрация
    05.01.2013
    Сообщений
    765
    Сказал(а) спасибо
    318
    Поблагодарили 337 раз(а) в 266 сообщениях
    Записей в блоге
    6
    Цитата Сообщение от Good.Morning Посмотреть сообщение
    stabud, большое спасибо.
    А менять защиту на старую обязательно или она восстанавливается при завершении работы программы?
    Функция работает с памятью, а не с файлом на диске. Ответ на вопрос: не обязательно.
    Ответить с цитированием  
     

  9. Пользователь сказал cпасибо:

    Good.Morning (27.03.2015)

Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 2
    Последнее сообщение: 04.08.2014, 18:10
  2. Авторизация через СМС
    от svyatopolk в разделе Общие вопросы web-разработки
    Ответов: 3
    Последнее сообщение: 03.06.2014, 02:53
  3. Передача пакетов данных?
    от Aleksandr-dr в разделе Общие вопросы web-разработки
    Ответов: 0
    Последнее сообщение: 22.10.2013, 22:08
  4. продвижение через группы в мэйл.ру
    от Василиса в разделе Другие поисковики
    Ответов: 2
    Последнее сообщение: 11.10.2012, 14:34
  5. Программа для расчёта параметров водородных аэростатов
    от Kakos_nonos в разделе Разработки на C/C++
    Ответов: 3
    Последнее сообщение: 21.08.2012, 04:41
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •