Всем привет. Помогите разобраться с Ассамблером вот нашел кучи документации то сё.. и все равно не пойму как оно работает )) т.е как исполняеться код и в какой Винде Вот как например в С++ пишешь слова типа cout << "Hello word\n"; ну вообщем сдесь понятно . А в Ассамблере Черт знает шо и де его писать? как исполнить программу ? и как посмотреть результат своей программы... ну вообще я полНЫЙ НОЛЬ. В Ассамблере.. такого еще не видел..)) Но интересно очень. Подскажите как пользоваться и маленький примерчик Hello World сделать )). И если не трудно обьясните как это работает Эти Цифры буквы...( Всем спасибо за ранее.
Ну чтоже, давай с тобой разбираться что такое ассемблер. Ну раз ты про это заговорил - это уже большой шаг. Многие его считают обычным "крутым языком" для "хакеров". Это не только ошибочное но и педаристически-тупое мнение, обычный стереотип, шаблон и т д. Ассемблер я вообще не считаю полноценным языком, т.к. делаю на нем только вставки в 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 Если есть вопросы (есть. я знаю) задавай смело. -------------------------- Мне кажется все это настолько просто...
Самый примитивный пример: 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
KEZ а как программы выполняеться ? т.е 1)освободить память 2)залить туда АСМ код 3)Конец файла 4)Закрыть ? Это я так написал как представляю... может это все и не правильно но я думаю ты понял что обьяснить нужно последовательность выполнение.. (Может его и нет)) Но думаю есть как в С ( с int main) ну я думаю понял)) Большое спасибо.
нет, WinMain как и main тут уже конечно же нет. есть точка входа в программу, она определяется компилятором либо тобой. почти всегда первая команда - push ebp Причем точка входа может располагаться как в середине так и в конце. Причем чаще всего даже в конце.
- Для вставки в код высокоуровневых языков, имхо. - Для изучения ошибок в программах, крякинга и вообще исследования. - Или для написания троянов и вирусов (не особо актуально, нынешние "хакеры" пишут трояны и вирусы на делфи, хахаха).
>Врядли я выбрал бы IIS как свой сервер. однако прикольно, когда апач 1.3 на фряхе/линухе орет "Microsoft IIS 5.0 on Solaris" =)
А как его Всталять в С++ Примерчик в студию если можно только такой шоб раздуплиться ))) тыж Можешь !!! Я знаю ! )) Пасибо !
Tester2005 А как Откомпилить ? тама я знаю как то вроде через командную строку ? но не так как в с++ вроде..
Ну теперь давай думать как его исполнять. Известно, что готовый 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; - тут вся процедура написана на ассемблере Ну вот... Кстати по ТНТ идет класный развратный фильм.