Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Assembler

Автор: bomzzz
Дата сообщения: 28.10.2011 01:46
http://demon-riabev.by.ru/Programming/Tasks%20and%20examples%20Assembler/Glava%207/Index3.htm

нашел про длинные имена
Автор: bomzzz
Дата сообщения: 28.10.2011 16:19
а почему так? положим почему
AREG    dq 0

mov dword ptr [AREG], eax младшее слово
mov dword ptr [AREG+4], eax старшее слово

порядок задом наперед еще понятно - чтоб совместимость была с 32 битными значениями. а вот почему когда вытаскиваешь 10-ичное сжатое цифры задом наперед

BREG    dt 0

lea si, BREG+9
mov dl, byte ptr[si]

две сжатые цифры старших разрядов, но при этом левые четыре бита старще чем правые четыре.
Автор: MERCURY127
Дата сообщения: 28.10.2011 16:28

Цитата:
две сжатые цифры старших разрядов, но при этом левые четыре бита старще чем правые четыре

потому что внутри байта порядок всегда биг-эндиан
Автор: bomzzz
Дата сообщения: 28.10.2011 16:31
ну так и в внутри двойного слова тоже младшее и старшее значение запихивается по нормальному. вот я чета всегда с этим порядком туплю. всегда в итоге методом тыка делаю

Добавлено:
[нормальный порядок младшее двойное слово][нормальный порядок старшее двойное слово]
Автор: MERCURY127
Дата сообщения: 28.10.2011 16:42

Цитата:
нормальный порядок

для интела литл-эндиан
dq 01234567
dd 0123.4567
dw 01.23.45.67
db 0.1.2.3.4.5.6.7
для моторолы: биг-эндиан
dq 76543210
dd 7654.3210
dw 76.54.32.10
db 7.6.5.4.3.2.1.0
в чем проблема? номера байтов обозначают старшинство битов
Автор: bomzzz
Дата сообщения: 28.10.2011 16:52
хм. все равно не понял.
Автор: MERCURY127
Дата сообщения: 28.10.2011 17:32
хотя байты числа могут идти в разном порядке, биты ВНУТРИ одного байта всегда считаются слева направо в порядке убывания старшинства. те:
число 4398110 = 10101011110011012 = 0xABCDh
слово моторолы: 10101011 110011012 = AB.CD первый.второй байт в памяти.
слово интела: 11001101 101010112 = CD.AB первый.второй байт в памяти, но НЕ DC.BA
Автор: akaGM
Дата сообщения: 28.10.2011 17:33
[...]
Автор: bomzzz
Дата сообщения: 28.10.2011 17:35
но когда я делаю shr eax все праивльно же работает 4 байта
Автор: MERCURY127
Дата сообщения: 28.10.2011 17:41
естественно работает в регистрах данные хранятся в прямом порядке
Автор: bomzzz
Дата сообщения: 28.10.2011 17:42
щас попробую порисовать - я левша переученный не различаю лево и право мне надо правило мнемоническое. списпки за попытку.
Автор: bomzzz
Дата сообщения: 29.10.2011 10:59
[more]
никто не знает такую вешь. делаю программку 16 бит дос для перехвата нажатия клавиш. при нажатии клавиши F1 скажем должна выполниться команда DIR.

Цитата:

    push    ax        ;надо сохранять все используемые регистры (для начала только ax)
    in    al, 60h        ;прочитаем код из клавиатуры
    cmp    al, 3bh        ;F1 ?
    jne    to_old_09    ;если не F1, то на старый вектор
..............................
    mov    cx, 'D'
    int    16h
    cmp    al, 0
    jne    to_iret
    mov    ah, 5
    mov    cx, 'I'
    int    16h
    cmp    al, 0
    jne    to_iret
    mov    ah, 5
    mov    cx, 'R'
    int    16h

    mov    ah, 5        ; ENTER
    mov    cx, 0Dh
    int    16h

под мс досом и фридосом всегда получается так (под4досом так не получается) что первый символ после выполнения команды появляется в строке после ее выполнения. вот на картинке видно что появляется буква D первая от DIR



бороться с этим можно если перед началом ввода в командную строку команды выдержать паузу

Цитата:

    mov    cx,0004h
    mov    dx,0000h
    mov    ah,86h
    int    15h

но пауза это дело не надежное, при cx=2 она например помогает в 50% случаев. в тоже время драйвер ansi.sys обходится без этой паузы в нем команда выполняется вообще быстро. в чем же дело может быть. не могу понять откуда это дублирование первого символа береться
[/more]
сделал но так и не понял в чем ошибка была
Автор: yse
Дата сообщения: 31.10.2011 11:37
плиз подскажите пару примеров на асме написанию shellcode hello world
пример этого

format pe gui 4.0

include 'D:/include/win32ax.inc'
section '.data' data readable writeable
message db 'hello world',0
start:





invoke MessageBox,NULL,message,message,MB_OK
invoke ExitProcess,1

.end start

дизассемблерованый опкод выглядет так
0040100E > 6A 30 push 30
00401010 68 00104000 push 401000 ; ASCII "Hello, World!"
00401015 68 00104000 push 401000 ; ASCII "Hello, World!"
0040101A 6A 00 push 0
0040101C FF15 7C204000 call near dword ptr ds:[40207C] ; USER32.MessageBoxA
00401022 6A 00 push 0
00401024 FF15 5E204000 call near dword ptr ds:[40205E] ; kernel32.ExitProcess

бинарный вид > 6A3068 001040006A 00FF15 7C2040006A 00FF15 5E204000

сам шелкод
\xA6\x03\x86\x00\x01\x04\x00\xA6\x00\xFF\x51\xC7\x02\x04\x00\xA6\x00\xFF\x51\xE5\x02\x04\x00

после компелирую на с++
так
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <windows.h>
int main(){
unsigned char shellcode[]=
"\xA6\x03\x86\x00\x01\x04\x00\xA6\x00\xFF\x51\xC7\x02\x04\x00\xA6\x00\xFF\x51\xE5 \x02\x04\x00";



system("PAUSE");

((void (*)())shellcode)();

return 0;
}

запускается но открывается автоматом дебагер и указывает что ошибка по такому адресу faulted with message :access violation at 0x0022ff20 :read of address 0x00000000 Processs stopped

я так понял присутствует нулевые байты как от них избавится или покажите более пример по теме: СП.
Автор: MERCURY127
Дата сообщения: 31.10.2011 11:55
Наверное тут даже телепаты бессильны... Лично я ничего не понял. Ху из шеллкод? Какая для всего этого ось? На чем компилировать первый кусок кода? Как это все линкуется?
Автор: bomzzz
Дата сообщения: 31.10.2011 11:58

Цитата:
invoke MessageBox,NULL,message,message,MB_OK


invoke MessageBox,NULL,addr message,addr message,MB_OK
ну или offset но на масм32 похоже

Автор: MERCURY127
Дата сообщения: 31.10.2011 11:59
А кажется дошло нужно передать управление символьному буферу? Ппц... Ты вообще в курсе, что исполнение данных в защищенном режиме запрещено?
Автор: bomzzz
Дата сообщения: 31.10.2011 12:02

Цитата:

.386

.model flat, stdcall
option casemap :none

include \MASM32\INCLUDE\windows.inc
include \MASM32\INCLUDE\user32.inc
include \MASM32\INCLUDE\kernel32.inc
includelib \MASM32\LIB\user32.lib
includelib \MASM32\LIB\kernel32.lib

.data
mestitle    db "YSE",0
buffer        db "Hello World",0

.code
start:
invoke MessageBox,0,ADDR buffer,ADDR mestitle,MB_ICONASTERISK
invoke ExitProcess,0
end start

я вот таким батником компилирую перетягивая на него файл с текстом программы мышью

Цитата:

ECHO OFF
COLOR 9F
CLS
cd /d %~dp1
C:\masm32\bin\ml.exe /c /coff "%~1"
C:\masm32\bin\link.exe /subsystem:windows "%~n1.obj"
del "%~n1.obj"
pause


Добавлено:
MERCURY127
подскажи как горячую клавишу в досе сделать. сделал через инт 9 - но эта клавиша теперь работает и под волковым и в любом редакторе. а как сделать чтоб когда волков запускается она не работала? через int 16h? не охота ansi.sys использовать только из за горячих клавиш.
Автор: yse
Дата сообщения: 31.10.2011 13:08
format pe gui 4.0<- это и есть фасм компилятор совсем не масм
Автор: bomzzz
Дата сообщения: 31.10.2011 13:15
все равно вместо message надо offset message

Добавлено:
в твоем случае береться первые два байта из строки message и по этому адресу апи функция пытается выдать строку до первого нуля. а надо чтоб по адресу строки
Автор: yse
Дата сообщения: 31.10.2011 13:42
спасибо .bomzzz

вот тоже самое пробовал скомпелить в бенарном виде всеровно какой компилятор но я делал на фасм просто быстрее ,
но наверное и за команды моv и прибавляются лишнии нули или может и за команды int прерывание


msg db "Hello, world!" ; the string



_start:

; write() call

mov eax, 4
mov ebx, 1
mov ecx, msg
mov edx, 13 ; поместить 13 в edx, так как наша последовательность составляет 13 байтов
int 0x80 ; Позвонить ядру, чтобы заставить системный вызов произойти

; exit() call

mov eax,1
mov ebx,0
int 0x80
Автор: bomzzz
Дата сообщения: 31.10.2011 13:43
и скорее всего попадает в защищенную область другого процесса

Добавлено:
даже точнее в hell попадает.

так это у тебя теперь 16 битный асм

Добавлено:
http://www.emu8086.com/ емулятор скачай тут есть пример для хело ворд и даже не один для фасма подойдет как раз
Автор: yse
Дата сообщения: 31.10.2011 14:28
супер bomzzz
Автор: MERCURY127
Дата сообщения: 31.10.2011 14:40
bomzzz, чтоб не работало под волком:
INT 21 - Volkov Commander - INSTALLATION CHECK
    AH = 2Bh
    CX = 5643h ('VC')
    DX = 4F4Dh ('OM')
    AL = function number
     00h get left window data address
     01h get right window data address
     02h get address of general variables
Return: AL = 00h if Volkov Commander installed
     AH = version code (27h for v4.00.039)
     ES:BX -> requested data


Добавлено:
в своем обработчике это вызываешь и проверяешь...
Автор: bomzzz
Дата сообщения: 31.10.2011 14:43
интересненько. только все равно не только в волкова упор, остальные программы тоже могут использовать служебные клавиши. редактор какой нибуть. если перехватить инт9 то это уже глобально, так как прерывание биос. для контрал альт дел это подходит, а ansi.sys видимо как то по другому делает. вот думаю может инт 16 а может нет. ниче нагуглить не могу

Добавлено:
а как скомпилировать драйвер sys чтоб его ставить через конфиг.сис?
Автор: yse
Дата сообщения: 31.10.2011 15:05
вот Hello, world MessageBox Shellcode на всех осях работает компелим запускаем
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <windows.h>

int main(){
unsigned char shellcode[]=
"\xFC\x33\xD2\xB2\x30\x64\xFF\x32\x5A\x8B"
"\x52\x0C\x8B\x52\x14\x8B\x72\x28\x33\xC9"
"\xB1\x18\x33\xFF\x33\xC0\xAC\x3C\x61\x7C"
"\x02\x2C\x20\xC1\xCF\x0D\x03\xF8\xE2\xF0"
"\x81\xFF\x5B\xBC\x4A\x6A\x8B\x5A\x10\x8B"
"\x12\x75\xDA\x8B\x53\x3C\x03\xD3\xFF\x72"
"\x34\x8B\x52\x78\x03\xD3\x8B\x72\x20\x03"
"\xF3\x33\xC9\x41\xAD\x03\xC3\x81\x38\x47"
"\x65\x74\x50\x75\xF4\x81\x78\x04\x72\x6F"
"\x63\x41\x75\xEB\x81\x78\x08\x64\x64\x72"
"\x65\x75\xE2\x49\x8B\x72\x24\x03\xF3\x66"
"\x8B\x0C\x4E\x8B\x72\x1C\x03\xF3\x8B\x14"
"\x8E\x03\xD3\x52\x33\xFF\x57\x68\x61\x72"
"\x79\x41\x68\x4C\x69\x62\x72\x68\x4C\x6F"
"\x61\x64\x54\x53\xFF\xD2\x68\x33\x32\x01"
"\x01\x66\x89\x7C\x24\x02\x68\x75\x73\x65"
"\x72\x54\xFF\xD0\x68\x6F\x78\x41\x01\x8B"
"\xDF\x88\x5C\x24\x03\x68\x61\x67\x65\x42"
"\x68\x4D\x65\x73\x73\x54\x50\xFF\x54\x24"
"\x2C\x57\x68\x4F\x5F\x6F\x21\x8B\xDC\x57"
"\x53\x53\x57\xFF\xD0\x68\x65\x73\x73\x01"
"\x8B\xDF\x88\x5C\x24\x03\x68\x50\x72\x6F"
"\x63\x68\x45\x78\x69\x74\x54\xFF\x74\x24"
"\x40\xFF\x54\x24\x40\x57\xFF\xD0";



system("PAUSE");

((void (*)())shellcode)();

return 0;
}
Автор: MERCURY127
Дата сообщения: 31.10.2011 15:13
bomzzz, sys похож на com, только org 0, и заголовок специальный...
гугль 'DOS ".SYS" header structure -PE -FAT -NTFS' вторая ссылка в кеше...
Автор: bomzzz
Дата сообщения: 31.10.2011 16:49
ни фига не пойму, как переделать программу в драйвер
Автор: MERCURY127
Дата сообщения: 31.10.2011 18:38
гг никак... нужно изначально писать как драйвер...
Автор: bomzzz
Дата сообщения: 31.10.2011 19:06
ну дык чем они отличаются. кроме заголовка.
а драйвер мыши можно и так и так

Добавлено:
у калашникова есть о том, как освободить резидент от псп. которое резиденту на фиг не нужно. это освобождает там байт 100, но эти сто байт затусованы в памяти и выделены потом не могут быть ничему. так что не вижу смысла это делать. а вот если программу запустить как драйвер на заголовок вообще местане будет тратится, и не будет рпоблемы с повторным запуском, вот только как переделкать.
Автор: MERCURY127
Дата сообщения: 31.10.2011 19:34
С каким повторным запуском? Драйвер мыши и не только ее - это комбинированные программы с заголовком сис в сегменте данных если не ошибаюсь. Они имеют отдельные пути исполнения для разных способов запуска.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

Предыдущая тема: .NET GUI компоненты


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.