Assembler (Помогите)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Adio, 17 Jul 2005.

Thread Status:
Not open for further replies.
  1. Adio

    Adio Elder - Старейшина

    Joined:
    23 May 2005
    Messages:
    1,646
    Likes Received:
    148
    Reputations:
    18
    Всем привет.
    Помогите разобраться с Ассамблером вот нашел кучи
    документации то сё.. и все равно не пойму как оно работает )) т.е как исполняеться код и в какой Винде

    Вот как например в С++ пишешь слова типа
    cout << "Hello word\n";

    ну вообщем сдесь понятно .
    А в Ассамблере Черт знает шо и де его писать?
    как исполнить программу ? и как посмотреть результат своей программы... ну вообще я полНЫЙ НОЛЬ. В Ассамблере.. такого еще не видел..)) Но интересно очень. Подскажите как пользоваться и маленький примерчик Hello World сделать )).
    И если не трудно обьясните как это работает
    Эти Цифры буквы...(

    Всем спасибо за ранее.
     
  2. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    Ну чтоже, давай с тобой разбираться что такое ассемблер. Ну раз ты про это заговорил - это уже большой шаг.
    Многие его считают обычным "крутым языком" для "хакеров". Это не только ошибочное но и педаристически-тупое мнение, обычный стереотип, шаблон и т д.
    Ассемблер я вообще не считаю полноценным языком, т.к. делаю на нем только вставки в C - код. Сам из себя синтаксис асма ничего страшного не представляет. Компидяторов много и сделать реальную Win32-прогу непросто.
    Разумеется, ты ни разу не писал чтото на асме, поэтому задал вопрос, как сделать Hello world. Давай подумает сначала, откуда берется хело ворд. В винде в окошке? Или ты имел ввиду в консоли cmd.exe ? Или где? Понимаешь ли, Ассемблер - это почти представлений команд, в бинарном видео лежащих в EXE,COM и т д файлах.
    А современные компиляторы переводят один вызов (причем с разными связями и т д) на много асм-команд для процессора. Например вызов MessageBox( 0, "Fuck this world", "MessageTitle", MB_ERROR ); примерно эквивалентен

    push MB_ERROR (точнее вместо MB_ERROR нужно поставить значение)
    push offset MessageTitle (можно push [MessageTitle])
    push offset FuckThisWorld
    oush 0
    call [user32.MessageBoxA]

    кстати, рекомендую прочитать мою статью http://antichat.ru/txt/stack.
    Так что например вывести Helo world не так просто. Мы начинаем думать не тупыми
    cout << "Hello word\n"; не задумываясь как все это работает на низком уровне, а САМИ программируем в низком уровне... Не сказал бы что делать прогу на asm-хорошая идея. Разве что размер кода... Всеравно, компилятор добавит в EXE некоторые свои вещи, некоторые из которых не поддаются управлению с исходника (во как сказал))

    У каждой команды есть опкод. То, чем она записывается в бинарник.
    Давай возьмем такие команды для начала


    mov приемник источник например mov eax,ebx
    переслать данные из источника в приемник

    xor приемник источник например xor eax,ebx
    мат. операция XOR (иск. ИЛИ) с источником. релультат в приемнике.

    cmp пар1 пар2 например cmp eax,1
    сравнение пар1 и пар2. (вычитанием) если равны, флаг нуля устан. в 1 (Z flag)

    jz, jnz, je, jne, jmp, jbe и т д например jnz 0x00401020
    переходы (скачки), jmp=безусл. переход, выполняется всегда. остальное - переход с учетом флагов. например, переход jnz будет выполнен если Z флаг НЕ В 0 (jump if not zero) этим можно заменять конструкции if, while, for...

    call например call MessageBoxA
    это не jmp, т.к. jmp просто переводит EIP на новое место, а call сохраняет адрес след. команды в стеке, чтобы потом вернуться (после вызова ф-ии)

    retn например retn =))
    возврат из процедуры, востанав. сохраненного значения EIP командой CALL

    leave делает некоторые операции с ebp и eip, для удобвства

    and, or, not - мат. операции. надеюсь сам поймешь

    push, pop сохранение и извлечение из стека. например push 5; pop eax. (eax=5)

    xlat... нафиг

    int [номер] например int 13
    емулирование прерывания номер [номер] - врядли надо будет

    ну и все остальное


    Добавлю, что EIP - это адрес след. команды для выполнения.
    EBP - используется для указ. кадра стека внутри него и по другому тоже, ESP указывает на вершину стека, EAX, EBX, ECX, EDX - просто регистры.

    Также, чтобы получить доступ к памяти по адресу address, можно

    mov eax, [address] (иногда в отладчиках mov eax, [dword ds:address])

    теперь eax=значению dword (eax имеет тип dword-4 байта) по адресу address

    Если есть вопросы (есть. я знаю) задавай смело.

    --------------------------
    Мне кажется все это настолько просто...
     
  3. Morph

    Morph Пирожок с Маком

    Joined:
    13 Aug 2004
    Messages:
    790
    Likes Received:
    113
    Reputations:
    169
    Круто задвинул =)
    Хехе на винт сохранюка я эту пагу =)
     
  4. tester2005

    tester2005 Elder - Старейшина

    Joined:
    17 Jan 2005
    Messages:
    38
    Likes Received:
    2
    Reputations:
    0
    Kez, тебе надо мануалы по асму писать ))))
     
  5. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Самый примитивный пример:
    Code:
    .586
    .model flat, stdcall
    option casemap :none
    
    include windows.inc
    include kernel32.inc
    include user32.inc
    includelib kernel32.lib
    includelib user32.lib
    
    .data
    text db "Фдибаг, жывотнайе",0
    capt db "ПГ/ЗМ",0
    
    .code
    
    start:
    
    	invoke MessageBox,0, addr text, addr capt, MB_OK
    	invoke ExitProcess,0
    end start
    
     
  6. Adio

    Adio Elder - Старейшина

    Joined:
    23 May 2005
    Messages:
    1,646
    Likes Received:
    148
    Reputations:
    18
    KEZ а как программы выполняеться ?
    т.е

    1)освободить память
    2)залить туда АСМ код
    3)Конец файла
    4)Закрыть ?

    Это я так написал как представляю... может это все и не правильно но я думаю ты понял что обьяснить нужно последовательность выполнение.. (Может его и нет))
    Но думаю есть как в С ( с int main) ну я думаю понял))
    Большое спасибо.
     
  7. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    нет, WinMain как и main тут уже конечно же нет.
    есть точка входа в программу, она определяется компилятором либо тобой.
    почти всегда первая команда - push ebp
    Причем точка входа может располагаться как в середине так и в конце. Причем чаще всего даже в конце.
     
  8. Zadoxlik

    Zadoxlik рояль с сыром

    Joined:
    28 Feb 2005
    Messages:
    758
    Likes Received:
    216
    Reputations:
    257
  9. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    Калашников изначально у меня вызывал недоверие и подозрение.
    Врядли я выбрал бы IIS как свой сервер.
     
  10. Zadoxlik

    Zadoxlik рояль с сыром

    Joined:
    28 Feb 2005
    Messages:
    758
    Likes Received:
    216
    Reputations:
    257
    невтему однако
     
  11. Adio

    Adio Elder - Старейшина

    Joined:
    23 May 2005
    Messages:
    1,646
    Likes Received:
    148
    Reputations:
    18
    Kez а для чего АСМ используют чаще всего ?
     
  12. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    - Для вставки в код высокоуровневых языков, имхо.
    - Для изучения ошибок в программах, крякинга и вообще исследования.
    - Или для написания троянов и вирусов (не особо актуально, нынешние "хакеры" пишут трояны и вирусы на делфи, хахаха).
     
  13. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    >Врядли я выбрал бы IIS как свой сервер.

    однако прикольно, когда апач 1.3 на фряхе/линухе орет "Microsoft IIS 5.0 on Solaris" =)
     
  14. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    не это ещё фигня. прикольнее когда ты залазаешь на сервак и видишь

    Powered by Denver on Windows ME
     
  15. Adio

    Adio Elder - Старейшина

    Joined:
    23 May 2005
    Messages:
    1,646
    Likes Received:
    148
    Reputations:
    18
    А как выполнять Asm файлы ну к примеру у меня есть код (asm) как его выполнить ?
     
  16. tester2005

    tester2005 Elder - Старейшина

    Joined:
    17 Jan 2005
    Messages:
    38
    Likes Received:
    2
    Reputations:
    0
    компилятор
     
  17. Adio

    Adio Elder - Старейшина

    Joined:
    23 May 2005
    Messages:
    1,646
    Likes Received:
    148
    Reputations:
    18
    А как его Всталять в С++ Примерчик в студию если можно только такой шоб раздуплиться ))) тыж Можешь !!! Я знаю ! ))
    Пасибо !
     
  18. Adio

    Adio Elder - Старейшина

    Joined:
    23 May 2005
    Messages:
    1,646
    Likes Received:
    148
    Reputations:
    18
    Tester2005 А как Откомпилить ? тама я знаю как то вроде через командную строку ?
    но не так как в с++ вроде..
     
  19. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    Ну теперь давай думать как его исполнять.
    Известно, что готовый Asm исходник (именно чистый асм-исходник) можно успешно скомпилировать компилятором. Всего компиляторов (точнее разновидностей асм) много:
    например

    NASM - непомню
    TASM - Turbo Assembler, Borland
    MASM - Macro Assembler
    Microsoft Assembler - именно, его сделала компания микрософт...

    И разновидности кажого. Чем же они отличаются?
    NASM - компактный и быстрый (так считается), хотя сам не использовал, но он у меня имеется
    TASM - обычный ассемблер. дистр. включает много хидеров (в асме они тоже есть)
    MASM - отличается тем что тут есть макросы. Macros, чем то схожие с процедурами и ф-иями. Кусок кода, который получает параметры и чтото делает.
    Microsoft Assembler - как нестранно, он почему - то работает как и обычный ассемблер (только в него добавлены обновления глюков)

    Если ты поимел (гыы батхед, он сказал поимел - прим. Бивис) (задолбали вы писать свои педаристические примечания - прим. Кез) а че дальше писать? я уже сбился...
    Так вот, если ты имел опыт компиляции C исходников bcc32.exe или чем то (например gcc никсах), ты сразу же скомпилишь и сорец асма.
    Компиляторы очень похожы. Часто бывает достаточно запустить
    компилятор и параметром файл, который ты компилишь - появится OBJ файл. потом линкер с параметром имени появившегося OBJ. Получится EXE.

    Что такое "раздуплиться" я так и непонял, но пример приведу.
    Вставка в C/C++ код (обычно) (должны быть доступны inline asm instructions)

    void mail( void )
    {
    blablabla...

    __asm
    {
    xor eax,eax
    cmp eax,0
    jnz ... и т д
    }

    blablabla...
    }

    Вот.
    На паскале

    procedure Fuck;
    begin
    asm
    .....
    end;
    end;

    или

    procedure Fuck;assembler;
    ...
    end; - тут вся процедура написана на ассемблере

    Ну вот...

    Кстати по ТНТ идет класный развратный фильм.
     
    #19 KEZ, 19 Jul 2005
    Last edited: 19 Jul 2005
  20. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    эт правильно?

    компилятор говорит, что ошибкa
    причем правильно говорит ;)

    `main' must return `int'
     
Thread Status:
Not open for further replies.