Студентам с вопросами о лабораторных работах сюда

Тема в разделе "WASM.BEGINNERS", создана пользователем IceStudent, 11 ноя 2006.

  1. Patriot86rus

    Patriot86rus New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2010
    Сообщения:
    6
    Хорошо, попробую найти, а этот код кидаем в текстовый фаил, потом переименовываем в *.asm!?
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Patriot86rus
    большинству компиляторов абсолютно все равно как обзывается файл и тем более что написано в имени после ".". главное чтобы внутри файла содержалась информация, которую сможет переварить данный компилятор
     
  3. SilenceCracker

    SilenceCracker New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    3
    Салют всем,
    Значение 7F7C0000H как перевести в 10риичную систему (с плавующей запятой)


    111110000000000000000- мантиса
    11111110-порядок
    11111110(2) = 255(10)
    коэф. смещения = 255-127=128

    Что не так?
     
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
  5. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
  6. idsp

    idsp New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2009
    Сообщения:
    13
    ребят, в чем отличие

    quote:


    mov bx, offset Image

    от

    lea bx, Image



    в отладчики все равно все сводится к mov bx, 0000h
     
  7. Administrator

    Administrator New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2009
    Сообщения:
    23
    команда lea является альтернативой оператору ассемблера offset. В отличие от offset допускает индексацию операнда, что позволяет более гибко организовать адресацию операндов.
     
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Administrator
    lea можно использовать
    Для сложения: lea eax,[eax+ebx]=add eax,ebx
    Для инкремента и декремента: lea eax,[eax+1] / lea eax,[eax-1]
    Для умножения от 2 до 9
    2) lea eax,[eax+eax] или lea eax,[eax*2]
    3) lea eax,[eax+eax*2]
    4) lea eax,[eax*4]
    5) lea eax,[eax+eax*4]
    6) lea ecx,[eax*2] / lea eax,[ecx+ecx*2]
    7) lea ecx,[eax+eax*2] / lea eax,[ecx+eax*4]
    8) lea eax,[eax*8]
    9) lea eax,[eax+eax*8]
    вместо NOP lea eax,[eax]
    а вот mov offset также допускает индексацию операнда т.е. вполне допустима инструкция типа
    mov edx,dword ptr MsgCaption[ebx+edx*4+345] и в чем тут "позволяет более гибко организовать адресацию операндов"?

    Фраза "команда lea является альтернативой оператору ассемблера offset. В отличие от offset команда lea допускает индексацию операнда, что позволяет более гибко организовать адресацию операндов." взята из учебника Юрова В., Хорошенко С. Assembler: учебный курс.– Спб.: Питер, 1999 потом перекочевала в учебник Юрова "Assembler: учебный курс" и оттуда начала гулять по учебникам и интернету. Что этим хотел сказать Виктор Иванович одному ему только и известно :)
     
  9. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Не путай mov offset и mov ptr
     
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    murder
    адрес 32 разряда, а MsgCaption был описан как DB, поэтому пришлось прибегнуть к dword ptr -- я ничего не путаю
    mov edx,offset 400157h == mov reg,imm32
    1011 w reg imm
    1011 1 010 57 01 40 00
    B A 57014000
    mov edx,[ebx+edx*4+4002B0] == mov reg,[mem]
    100010 d w mod reg 100 Sc Indx Base offset32
    1000 1011 10 010 100 10 010 011 B0024000
    8 B 9 4 9 3 B002400
     
  11. idsp

    idsp New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2009
    Сообщения:
    13
    отличие lea от offset:

     
  12. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    idsp
    позвольте не согласится
    Код (Text):
    1. ; masm dos com #
    2. .286
    3. .model tiny
    4. .code
    5. org 100h
    6. start:  MOV SI,3
    7.     LEA BX,Tabl[SI] ;Корректно
    8.     MOV AL,[BX] ;AL=23h
    9.     MOV AL,Tabl[SI];так же AL=23h
    10.     mov ah,0; жду нажатия на любую клавишу
    11.     int 16h
    12.     retn; выхожу из программы
    13. Tabl DB 20h, 21h, 22h, 23h, 24h, 25h
    14. end start
    а вот при записи MOV AL, OFFSET Tabl[SI] будет выдана ошибка "invalid operand for OFFSET"
    а вот это вообще перл!
    Код (Text):
    1. MOV BX, OFFSET Tabl[SI];Необнаруживаемая ошибка по мнению idsp
    2.     MOV AL, [BX] ;Ошибка – (AL)=20h <-- допустим адрес Tabl 200h
    3. ;тогда в AL попадет содержимое не ячейки памяти с адресом 203h а ячейки памяти с адресом 23h
    idsp учите матчасть!
     
  13. kamax70

    kamax70 New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    36
    Перехват API - функций

    Название уже избито, но у меня немного необычное задание.
    Есть файл, в котором хранятся названия функций, типы их параметров и библиотеки, их содержащие. Нужно, чтобы прога перехватывала все функции, описанные в файле.
    Проблема состоит в том, что я не знаю исчерпывающего списка возможных функций и не могу для каждой сделать свой обработчик.
    Можете предложить идею, как это реализовать?
     
  14. PowerASM

    PowerASM New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    59
    kamax70а какая вам разница, сколько у нее параметров. ставите jmp на свой код в начале функции и jmp на продолжение функции в конце своего кода. Если с параметрами работать не надо, то это подойдет для любой функции. Если надо работать с параметрами, то просто поверьте описанию из файла и предположите, что все так и есть. А обработчики можно и динамически генерировать.
     
  15. kamax70

    kamax70 New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    36
    Тут мой недочет, я не все условие сказал.. Вообще должен составляться ченджлог в новом файле того, что сделали функции. Например при CreateFile мне потребуется значения 1 и 5 параметров, для какой либо другой функции - значения других параметров. Если я ставлю jmp на свой код, как мой код может понять, какую именно API - функцию он заменяет? И даже зная параметры, как я могу динамически создать функцию с этими же параметрами?
     
  16. PowerASM

    PowerASM New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    59
    так если известен тип вызова функции (а для API это обычно stdcall, реже fastcall и cdecl) то достаточно просто сообразить где они (параметры должны находиться)

    Код (Text):
    1. CreateFileW:
    2.   jmp MyFunc                     // 5 байт
    3. continue_createfile:
    4.   ...
    5. MyFunc:
    6.   //здесь рассмотрим стек
    7. // Return               [esp+0]
    8. // Name                 [esp+4]
    9. // Access               [esp+8]
    10. // Share                 [esp+12]
    11. // Security              [esp+16]
    12. // Operation            [esp+20]
    13. // Attributes            [esp+24]
    14. // Template             [esp+28]
    15. //а теперь загрузим номер необходимого нам параметра в eax и попробуем достать его из стека
    16. // mov eax, par_number
    17. // mov eax, [esp+eax*4+4] при условии, что параметры нумеруются с 0
    18.    mov edi, edi                    // 2 байта
    19.    push ebp                        // 1 байт
    20.    mov ebp, esp                  // 2 байта
    21.    jmp continue_createfile     // предыдущие 3 команды были затерты jmp MyFunc и мы их выполняем перед продолжением выполнения функции
    Теперь для обработки всех параметров надо с генерировать следующую подпрограмму
    1. jmp в перехватываемой функции
    2. сохранить все регистры
    3. цикл for (i=0;i<param_count;i++) check_param(get_param(i)), где check_param можно написать статически, get_param это вышеприведенные 2 команды mov а цикл - ну это уже совсем просто
    4. команды, которые затрет jmp MyFunc
    5. jmp на продолжение выполнения
    для cdecl все будет аналогично, а вот с fastcall придется еще немного подумать
     
  17. PowerASM

    PowerASM New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    59
    да. так как для каждой перехватываемой функции, такое возможно с генерировать автоматически, то для определения, какая функция вызвана можно просто проверить адрес возврата из функции перечисления параметров.
     
  18. kamax70

    kamax70 New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    36
    Эм.. я немножно не все понял.. Предположим
    Код (Text):
    1. type
    2. far_jmp = packed record
    3.   PuhsOp: byte;
    4.   PushArg: pointer;
    5.   RetOp: byte;
    6.  end;
    7. ....
    8. var
    9. olddata : oldCode;
    10. JmpMCP: far_jmp;
    11. ....
    12.  
    13. dll :=GetModuleHandle('kernel32.dll');
    14. Adr  := GetProcAddress(dll, 'CreateFileA');
    15. ReadProcessMemory(INVALID_HANDLE_VALUE, Adr, @Olddata, SizeOf(OldCode), Bytes);
    16. JmpMCP.PuhsOp  := $68;
    17. JmpMCP.PushArg := @myfunction;
    18. JmpMCP.RetOp   := $C3;
    19. WriteProcessMemory(INVALID_HANDLE_VALUE, Adr, @JmpMCP, SizeOf(far_jmp), Bytes);
    20. ......
    21.  
    22. function myfunction : integer; stdcall;
    23. begin
    24.  asm
    25.  jmp MyFunc
    26.  ...
    27.  continue_createfile
    28.  end;
    29.  WriteProcessMemory(INVALID_HANDLE_VALUE, MbaAdr, @Olddata, SizeOf(OldCode), Bytes);
    30.  result:= // сюда я так понимаю надо записать CreateFile(параметры); но как это сделать?
    31.             // на ассемблере?
    32. end;
     
  19. PowerASM

    PowerASM New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    59
    ничего не понял, чего вы хотите добиться.
    алгоритм следующий
    1. Из начала перехватываемой функции копируются n-байт (не большее 5, кратное длине команды) в конец функции перехватчика (т.е. в конец динамически выделяемой памяти)
    2. В начало функции встраивается jmp MyFunc (E9 XX XX XX XX, где XX XX XX XX адрес MyFunc - Адрес перехватываемой функции + 5) (MyFunc можно сгенерировать и динамически следующего вида
    Код (Text):
    1. pusha/call MyHandler/popa/скопированный код/jmp XX XX XX XX
    , где XX XX XX XX адрес Адрес перехватываемой функции - My Func - 7)
    3. В MyHandler функцию можно опознать к примеру так
    Код (Text):
    1. case ReturnAddress of
    2.   MyFunc:; //обработка вызова перехваченной функции
    3. end;
    Что получится
    (перехватываемая функция)
    | ^
    вызов перенаправленный jmp |
    | возврат в середину функции (уже выполнены начальные несколько команд)
    v |
    (динамически сгенерированная функция перехвата)
    ^
    |
    вызов обработчика перехватов
    |
    v
    (MyHandler)

    но можно и вместо call вставить код из case, но это уже сложнее описать.

    PS я так и не понял зачем восстанавливать начало функции.
     
  20. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    PowerASM
    Если у процесса имеется отладочный порт, то обработка исключений замедляется в сотни/тысячи раз. Если порта нет, то задержки не значительны, не заметны и ими можно пренебречь. В этом случае нет необходимости определения длинны перехватываемой инструкции(что влечёт за собой енуп тредов и их контекстов), необходимо знать лишь начало инструкции. Пишите в память однобайтную инструкцию, которая вызывет исключение(точка останова). В этом случае диспетчер исключений(локально, удалённо как отладчик или менеджер в ядре) получит полный контекст потока на момент останова, что позволяет восстановить состояние камня полностью, также и эмулировать инструкции(дабы не восстанавливать их в памяти).