DotFix :: Портал разработки и защиты программ
Главная
Программы
Статьи
Разное
Форум
Контакты
Автор: GPcH. Дата публикации: 13.05.2004

Вставка ассемблерных процедур в код Visual Basic: миф или реальность?



  • Введение
  • Подготовка ассемблерного кода
  • Добавление ассемблерных процедур в код на Visual Basic 6.0

    Введение

    Знатоки таких языков высокого уровня, как Delphi и C++, сейчас скажут, что только данные языки способны воспринимать низкоуровневые конструкции, причем ключевого слова Asm вполне достаточно. Частично с этим утверждением можно согласиться – в VB так просто встроить Asm нельзя, но поверьте, прочитав данную статью для Вас это будет также просто сделать и на VB.

    Для начала рассмотрим методику вставки. Для вызова ассемблерного кода используется API функция

    “CallWindowProc”, содержащаяся в библиотеке "user32.dll", которая входит в поставку винды. Она имеет 1 основной и 4 дополнительных параметра. В первый мы будем передавать адрес первой ячейки массива, содержащего массив байт (откомпилированную ассемблерную процедуру), а в остальные – параметры, необходимые для работы ассемблерной функции.

    Для начала создадим новый проект и объявим эту функцию:

    CODE NOW!

    Private Declare Sub CallWindowProc Lib "user32" Alias "CallWindowProcA" _
    (ByVal ptrMC As Long, ByRef P1 As Long, ByVal P2 As Long, ByVal P3 As Long, ByVal P4 As Long)




    Теперь создадим функцию, которая преобразует HEX строку машинных кодов в байтовый массив и возвратит адрес первой ячейки массива:

    CODE NOW!

    Private Bytes() As Byte

    Private Function LoadAsmFunction(CodeString As String) As Long
    Dim i As Long
    If Len(CodeString) = 0 Then Exit Sub
    ReDim Bytes(Len(CodeString) \ 2 - 1)
    For i = 0 To Len(CodeString) \ 2 - 1
    Bytes(i) = CByte("&H" & Mid(CodeString, i * 2 + 1, 2))
    Next i
    LoadAsmFunction = VarPtr(Bytes(0))
    End Function




    Теперь перейдем непосредственно к созданию ассемблерной функции.


    Подготовка ассемблерного кода

    При создании новой функции будем использовать следующий шаблон:

    CODE NOW!

    [BITS 32] ;Делаем процедуру 32 битной

    ; Считываем данные из стека
    push ebp
    mov ebp, esp
    push ebx
    push esi
    push edi
    ; Код нашей процедуры
    ; Если в процедуру передавалось два параметра
    mov eax, [ebp+8] ; Считываем первый
    mov ebx, [ebp+12] ; Считываем второй
    xor eax, ebx ; Производим операцию над параметрами
    ; Регистр EAX всегда должен содержать то, что возвращает функция
    ; Записываем данные в стек
    pop edi
    pop esi
    pop ebx
    mov esp,ebp
    pop ebp
    ret




    Комментарий: первый параметр, передаваемый функции всегда находится по адресу ebp+8, остальные в зависимости от их длины расположены дальше ebp+8. Строки передавать в функцию нельзя (так как они в Unicode. И вообще, при работе с ними, все начинает глючить). Также компилятор nasmw не понимает db, посему работать с переменными, созданными в этой функции вам тоже не получится. И самое обидное: API использовать также нельзя. При вызове более 2-х параметров, в конце функции необходимо вместо ret ставить ret 8 при использовании 3-х параметров и ret 8+<длина параметра(чаще всего 4)> при использовании 4-х параметров.

    Теперь у Вас возникнет вопрос: “Как это все теперь перевести в HEX строку, которую мы будем передавать ранее написанной функции?”. Резонный вопрос. Для начала необходимо перевести этот ассемблерный код в BIN файл, содержащий машинные коды, для чего можно использовать nasmw – компилятор ассемблера (командная строка: nasmw.exe -f bin YouProgram.asm -o YouProgram.bin), а затем написать небольшую программку для перевода BIN файла в HEX строку. Я же рекомендую не геморроиться и использовать написанную мной прогу Asm to VB, которая без проблем переведет код, написанный по вышеприведенному шаблону в BIN файл или HEX строку. В Asm to VB я уже встроил компилятор nasmw, поэтому кроме этой программы для написания ассемблерных функций Вам ничего не потребуется.


    Добавление ассемблерных процедур в код на Visual Basic 6.0

    Мы имеем Hex строку и имеем функцию, передавая в которую Hex строку она создает массив машинных инструкций и возвращает ссылку на первую ячейку массива. Поверьте этого достаточно.

    Теперь запустим функцию с параметрами (если в функцию передаётся не 4, а меньше параметров, то остальные параметры забиваются нулями, если этого не сделать, функция не будет работать!), предварительно присвоив переменной sHex Hex строку, которую мы получили в предыдущем шаге:

    CODE NOW!

    sRetVal = CallWindowProc(LoadAsmFunction(sHex),0,0,0,0)


    Теперь мы имеем в переменной sRetVal результат работы функции.

    PS: Вот так вот все просто. Желаю удачи!


    Комментарии
    отсутствуют

    Добавление комментария

    Ваше имя (на форуме):

    Ваш пароль (на форуме):

    Комментарии могут добавлять только пользователи,
    зарегистрированные на форуме данного сайта. Если Вы не
    зарегистрированы, то сначала зарегистрируйтесь тут

    Комментарий:



  • 04.09.2011 Долгожданный релиз VB Decompiler. Масса улучшений декомпиляции Native Code. Значительно расширенна и обновлена справочная система на русском и английском языках.
    20.12.2010 DotFix Software поздравляет наших клиентов и посетителей сайта с наступающим Новым Годом и рождеством! Желаем приятно провести праздники и успехов в новом году!
    28.11.2010 Выпущена новая версия защиты DotFix NiceProtect. Основные изменения коснулись обфускатора Delphi программ. Теперь имеется полная поддержка Tab и Page контролов на формах, что обеспечивает максимальную совместимость обфускации с Delphi XE программами.
    21.10.2010 Обновлен декомпилятор Visual Basic программ до версии 8.1. Декомпиляция P-Code программ становится все более идеальной, также проделана большая работа по улучшению анализа Native Code и .NET приложений.
    16.09.2009 Полностью обновлен движок сайта! Теперь все ссылки имеют читаемый понятный вид, разного рода глюки на страницах убраны. И теперь сайт полноценно работает на второй версии нашего движка.
    Архив новостей
    Яндекс цитирования

    Движок сайта: DotFix Engine v0.2
    Администрация сайта:
    xbox 360 slim