Как реализовать распаковку кода (машинного) на языке высокого уровня?

Тема в разделе "WASM.BEGINNERS", создана пользователем wvlg, 3 июн 2008.

  1. wvlg

    wvlg New Member

    Публикаций:
    0
    Регистрация:
    25 сен 2007
    Сообщения:
    44
    Нужно реализовать следущее. Приходит машинный код (т.е. он задается пользователем, не важно как по сети или из текстового файла) как например реализовать его исполнение, ну скажем, на Borland Builde C++?
    Как это сделать в ассемблере - проблем нет(вернее сказать представляю что для этого нужно, хотя никогда и близко такого не делал). Нужно создать область памяти с доступом R\W\E и просто переписать туда наш машинный код.
    Но как это сделать на языке высокого уровня? ASM вставка тут, я понимаю не подойдет. ИЛи подойдет? Если подойдет то как?
     
  2. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Какая разница на каком языке писать? Апи функции одинаковые для всех. Вон, Ms-Rem на деьлфях писал по началу. И как писал! Почитай учебник по апи-функциям.
     
  3. wvlg

    wvlg New Member

    Публикаций:
    0
    Регистрация:
    25 сен 2007
    Сообщения:
    44
    С этим нисколько не спорю!!! Дело-то не в этом. Допустим, выделил я память, которая будет RWE, записал туда то, что мне нужно. (Это все в API есть-точно!!!) Как мне туда перейти на исполнение? Разве такое есть в API, а потом обратно?

    С удовольствием (если там есть то что меня отделяет от результата). Пару источников, хотя бы, желательно онлайн...
     
  4. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Смотря что у тебя там за код.
    Если надо с возвратом, то в этом коде желательно чтобы ret в конце был.
    А вызывать - хочеш во встроенном ассемблере call напиши, хочеш на Си - создай указатель на функцию, инициализируй нужным адресом и вызови как обычную функцию.
     
  5. wvlg

    wvlg New Member

    Публикаций:
    0
    Регистрация:
    25 сен 2007
    Сообщения:
    44
    О таком я думал, но мне казалось:
    Да кто же мне даст код функции в памяти поправить?
    но если такое возможно это в коре меняет дело... Осталось только понять. Как именно поправить ей код на асме? Да и как вообще на регистры подавать нужные значение перед ее вызовом? Также асм вставкой?
    А задача такая:
    Пользователь вводит машинный код. В этом коде используются 4 регистра процессора. (два задают адреса строки символов(на оба одинаковый адрес), третий счетчик, в 4й происходит запись символа и операции над ним). Необходимо подать на эти регистры нужные нам значения. У нас в программе есть строка, адрес, по которому она лежит и нужно "положить" в регистры. А затем необходимо запустить этот самый пользовательский код на исполнение и вернуться в основную часть программы.
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1. typedef void (* stub_func)();
    2.  
    3. stub_func s;
    4. void *mem;
    5.  
    6. mem = malloc(size);
    7. memcpy(mem, bcode, size);
    8. s = (stub_func)mem;
    9. s();
     
  7. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    wvlg
    Посмотри CallWindowProc. Ее используют например, чтобы вызывать машинный код из Visual Basic'a.
     
  8. wvlg

    wvlg New Member

    Публикаций:
    0
    Регистрация:
    25 сен 2007
    Сообщения:
    44
    n0name
    Класс, не думал, что может быть так просто. Интересно вот только на
    s = (stub_func)mem;
    Никто ругаться не будет? Но это проверю. СПС большое!!!
    Stiver
    Постараюсь посмотреть. Но если способ описанный выше сработает сделаю это чуть позже.
    Спасибо!!!
     
  9. Osen

    Osen Рие

    Публикаций:
    0
    Регистрация:
    5 апр 2008
    Сообщения:
    283
    Адрес:
    Париж
    wvlg
    Чтобы выполнить код надо передать на него управление переходом. Регистры можно менять асм вставкой. Другим способом является испльзование CreateThread + GetThreadContext + SetThreadContext + ResumeThread.