Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   [ASSEMBLER] Задаем вопросы (для новичков) (https://forum.antichat.xyz/showthread.php?t=70421)

!_filin_! 25.05.2007 17:31

[ASSEMBLER] Задаем вопросы (для новичков)
 
надо в меседжбоксе вывести содержание переменной, как реализовать?

Great: В этой теме задаем простые вопросы по ассемблеру (специально для новичков)

А®ТеS 25.05.2007 17:52

Элементарно:
Код:

...
.data
msgtext db "Hello, WORLD", 0h
msgcap db "It is ASM!!! =)", 0h
...
.code
start:
INVOKE MessageBoxA, 0 offset msgtext, offset msgcap, 0
end start


!_filin_! 25.05.2007 18:00

гг..ты немного...а точнее совсем нетак понял. Значение в переменную заносится во время работы проги, например я от функции получаю число. и его надо вывести на месседж бокс вот примерный код:
...................
Код:

.data
msgtext db "Hello, WORLD", 0h
msgcap db "It is ASM!!! =)", 0h
messedg db ?

...............
Код:

code
start:
mov messedg, 15
INVOKE MessageBoxA, 0 offset msgtext, offset msgcap, 0
end start
Использовал вместо функции MOV, соответственно как на месседж бокс вывести содержание переменной messedg (число 15)


da_ff 25.05.2007 21:07

а сзади дописать 0h у messedg? так сказать привести строку к ASCIIZ виду

slesh 26.05.2007 12:02

Просто так вывести нельзя. так число - это не строка.
Поэтому нужно перевести из числа в строку. Можно сделать это вручную, но лучше юзать API функцию.
Вот код на FASM. Выводит содержимое регистра.
Код:

format PE GUI
entry _start
include 'd:\coding\fasm\include\win32ax.inc'
include 'd:\coding\fasm\include\encoding\win1251.inc'
include 'd:\coding\fasm\include\apia\user32.inc'
section '.data' data readable writeable
formats db "%d",0
zagolovok db "Содержимое регистра",0
temp db 256 dup(?)
section '.code' code readable executable
_start:
mov eax,-1234568
invoke wsprintf,temp,formats,eax
invoke MessageBox,0,temp,zagolovok,MB_OK
invoke ExitProcess,0
section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',user32,'USER32.DLL'
include 'd:\coding\fasm\include\apia\kernel32.inc'


Xserg 26.05.2007 14:57

Решил тоже ассемблер поизучать.
Пишется таким способом тяжело, зато инжектится в чужой процесс элементарно.
IMНO зачем тогда ассемблер нужен.

INVOKE wvsprintf,offset outst,offset inst,var1,var2, .....
h ttp://msdn2.microsoft.com/en-us/library/ms647551.aspx
Преобразует содержание переменной(ых) в строку.

Код:

  .486               
  .model flat,stdcall
  option casemap :none

kernel32 EQU edx
user32 EQU ebx
CallFunc MACRO reg,zText:VARARG
    LOCAL m1
          call m1
          db zText,0
          m1:
      push reg
      call ebp
      call eax
            ENDM
cText MACRO zText:VARARG
      LOCAL m1
          call m1
          db zText,0
          m1:
        ENDM
;----------------------------------------------
      .code
start:
  mov edx,[esp]     
  call sfind_kern_b
; edx kernel32.dll ModuleHandle
; ebx User32.dll  ModuleHandle
; ebp = GetProcAddress(GetModuleHandle('kernel32.dll),'GetProcAddress');
  push kernel32 ;--1
cText  'user32.dll'
    CallFunc kernel32,'LoadLibraryA'
    mov user32,eax
  pop kernel32  ;--1
;--------------------------------------------------
CallFunc kernel32,'GetCurrentProcessId'
;--------------------------------------------------
; INVOKE wvsprintf,offset outst,offset inst,var1,var2, .....
; http://msdn2.microsoft.com/en-us/library/ms647551.aspx
;-------------------
    mov ecx,10
m1:  push 0
loop m1  ;10*4+
    mov ecx,esp ;offset outst
    push ebp ;--1
    push ebx ;--2
    push eax ;ProcessId var1
    push esp ;var1
cText 'It is MASM!!! =)%#8IX',0 ;//offset inst
    push ecx ;offset outst
    CallFunc user32,'wvsprintfA'
    add esp,4 ; var1 dellete
    pop ebx ;--2
    pop ebp ;--1
    mov ecx,esp ;offset outst
;---------------------------------------------------   
;-- MessageBox ----------------------------------
      push 0
cText 'ProcessId'
      push ecx ;offset outst
      push 0
      CallFunc user32,'MessageBoxA'
add esp,10*4 ;10*4-
ret                                                    ; exit proocess
;-------------------------------------------   
;-- No comments -- Не отлажено ------
sfind_kern_b: ;edx base
sfind_kern_bs:
  and edx,0ffff0000h
 cmp word ptr [edx],05A4Dh
jz sfind_kern_b1
  sub edx,1000h
  jmp sfind_kern_bs
sfind_kern_b1:
  mov eax,[edx+3ch]
  mov ebx,edx
  add ebx,eax
 cmp word ptr[ebx],04550h
jz sfind_kern_b2
  sub edx,1000h
  jmp sfind_kern_bs
GPA db 'GetProcAddress',0
sfind_kern_b2:
  mov esi,offset GPA
  mov ebx,EDX
  add ebx,03Ch
  mov eax,[ebx]
  mov ebx,EDX
  add ebx,eax
  add ebx,160h-0e8h
  mov ecx,EDX
  add ecx,[ebx]
  add ecx,12 ; adr export
  mov ebx,EDX
  add ebx,[ecx]
  mov edi,ebx
  xor eax,eax
sadrxor:
  push edi
  push esi
sgpa_fefe:
  pop edi
  pop esi
    inc esi
  push esi
  push edi
  mov ecx,0Fh
  repe cmpsb 
  cmp ecx,0
  jz sgpa_fef
  mov cl,0
  cmp [esi],cl 
  jnz sgpa_fefe
  inc eax
  jmp  sgpa_fefe
 sgpa_fef:
  pop edi
  pop esi
  push eax
  mov ebx,EDX
  add ebx,03Ch
  mov eax,[ebx]
  mov ebx,EDX
  add ebx,eax
  add ebx,160h-0e8h
  mov ecx,EDX
  add ecx,[ebx]
  pop ebx 
  dec ebx
  MOV EAX,[ECX+24h]
  add eax,edx
  MOV bx,[eax+ebx*2]
  MOV EAX,[ECX+1ch]
  add eax,edx
  MOV EAX,[eax+ebx*4]
  add eax,edx
  mov ebp,eax
ret
end start

Как бы все это попроще писать?
Особенно переменные в стеке. :confused:

tclover 26.05.2007 15:05

Мне нужна таблица системных вызовов линукс, чтобы с регистрами и все дела =\
Есть у кого?

_Great_ 26.05.2007 16:42

Тискаем гугл

второй линк: http://www.die.net/doc/linux/man/man2/syscalls.2.html
читай-не хочу

slesh 26.05.2007 17:37

2 da_ff. Типа сумничал?
Можно и сделать деление, но это только в тех случаях когда пишешь под DOS. потому что там нет API функций. Если нужно под дос, то могу выложить примерчик!

-n00by- 27.05.2007 17:43

О! крута.... ну раз такой сабж забили, то посоветуйте книги/статьи попроще, ибо я ваще в этом не шарю

_Great_ 27.05.2007 17:55

Цитата:

Сообщение от -n00by-
О! крута.... ну раз такой сабж забили, то посоветуйте книги/статьи попроще, ибо я ваще в этом не шарю

В.Юров учебник+справочник, калашникова рекомендуют (не читал)

ЗЫ. Зубкова еще рекомендуют, сам не читал )
ЗЫЫ. Вообще, моё имхо, рано или поздно по любой книге можно выучить асм. Точнее, не по одной, а если купить несколько книг, мозг в конце концов научится отфильровывать ненужное.

Dumkopff 27.05.2007 18:43

-n00by-
Iczelion tutorials
все очень понятно написано имхо.

!_filin_! 27.05.2007 18:55

Какраз Икзелиона туторы для начала будут сложные.
Лутше начинай с Калаша, потом Самоучитель Ассемблер IBM PC (Галисеева) ну и под конец Assembler для DOS, Win , Unix (Зубкова)
Как по мне это три основные книжки, от Калаша узнаеш вообще что такое асм там всё очень доходчиво описано, Самоучитель - это уже следуйщий уровень, описана работа под Вынем и некоторые интересные алгоритмы, Зубков - это классика тут уже высший уровень. Линки не давал потому что у меня эти книжки в печатном варианте.
Назвал основу но конечно чем больше инфы прочитаеш ( и запомниш! ) тем лутше для тебя (Тот же Икзелион). Так что гугл тебе в руки, сейчас литературы очень много!

slesh 28.05.2007 09:47

Берешь список инструкций МП и этого уже будет достаточно.
Ну и как всегда Справочник по Api функциям и прерываниям Dos

L0rd_Ha0S 28.05.2007 19:00

To -n00by-:
Вот сюда зайди, тут много чего интересного есть.

Piflit 07.06.2007 17:56

как компилировать *.asm сорцы в masm'e?
и во что они должны скомпилиться, в exe или в com?

slesh 07.06.2007 22:10

Во что компилить - это уже во что захочешь. т.е. есть опции для компиляции, также внутри файла есть маханькие описания. типа если файл создает из сегмента кода, данныйх итд, то никогда ты его не скомпилишь в ком файл.
Вроде масм компилит по умолчанию в EXE.
Для того чтобы компильнуть под COM нужно делать так:
ml.exe [имя_файла].asm /AT

taha 08.06.2007 14:33

Цитата:

как компилировать *.asm сорцы в masm'e?
мой любимый способ:

создаешь example.bat туды пишешь

Код:

;@echo off
 ;goto make

.386
.model flat,stdcall
option casemap:none

include D:\masm32\include\windows.inc
include  D:\masm32\include\user32.inc
include  D:\masm32\include\kernel32.inc
includelib D:\masm32\lib\kernel32.lib
includelib  D:\masm32\lib\user32.lib

.data
        s_title        db "Хэкк",0
        s_zzz        db "хэккерский хэккк",0

.code
start:
 invoke MessageBox,0,addr s_zzz,addr s_title,0
 invoke ExitProcess,0
end start

:make
set asmname=D:\example
 title %asmname%.bat
 D:\masm32\bin\ml  /c /coff %asmname%.bat
 D:\masm32\bin\link  /SUBSYSTEM:WINDOWS /LIBPATH:D:\masm32\lib %asmname%.obj

 del %asmname%.obj

 echo
 pause

запускаешь батник >>> .exe готов!!

Цитата:

и во что они должны скомпилиться, в exe или в com?
что компилятору и линкеру скажешь, то он и сделает.. (.exe .com .dll .sys .....)
на wasm.ru кажется были опции

NetMan 08.06.2007 15:07

А не проще ли юзать какую-нибудь IDE? RadASM или WinASM, например?

iv. 08.06.2007 15:17

Цитата:

как компилировать *.asm сорцы в masm'e?
Командами:
ml /c /coff /Cp *.asm
link /SUBSYSTEM:CONSOLE *.obj
Флаги различны в зависимости от того, что на выходе хочешь. Навскидку что обозначают к сожалению уже не помню - смотри на wasm.ru

Цитата:

мой любимый способ:

создаешь example.bat туды пишешь
...
Оу, что-то не понял прикола, прошу пояснений. Твой способ у меня не сработал к сожалению. =)
Цитата:

А не проще ли юзать какую-нибудь IDE? RadASM или WinASM, например?
Да ну, имхо фигня эти все ide для асма. Максимум нужны только в крупных проектах, чтоб не запутаться.

slesh 08.06.2007 17:54

Эх.. Fasm Rulit - нету мозгоебки с компилом

Piflit 08.06.2007 18:49

Цитата:

Сообщение от slesh
ml.exe [имя_файла].asm /AT

чуть попозже выложу текст ошибки, которую масм выдает при таком способе=\

Цитата:

Сообщение от slesh
Эх.. Fasm Rulit - нету мозгоебки с компилом

возможно, но я уже купил книжку Калашникова, а она про masm. хотел в электронной версии прочитать, но решил купить.

еще вопрос: в каком случае надо компилить в com, а в каком в exe?

+еще один: зачем нужны файлы в расширении *.obj?

Спасибо!=)

NetMan 08.06.2007 19:08

После ассемблирования (с помощью ml) исходник превращается в промежуточную форму - объектный модуль (.obj). Для генерации exe'шника необходимо запустить компоновщик (link), указав ему объектный модуль.

slesh 08.06.2007 23:20

Ну COM - это уже отжившее своё.
Такчто в любом случае лучше компилить EXE
Хотя у комов размер меньше.

Вообще у ассемблеров не очень большое различие.
Вот я с легкостью перешел с TASM на FASM и при этом я понял, что с FASM'a надо было начинать с самого начала. Потому что на нем можно тварить чудеса.
// Анекдот в тему: Решил хакер блины печь, первый блин как всегда вышел Комом, а второй уже EXE'шником

Piflit 08.06.2007 23:23

Цитата:

Сообщение от slesh
// Анекдот в тему: Решил хакер блины печь, первый блин как всегда вышел Комом, а второй уже EXE'шником

в тему))

я тоже хотел начать с fasm'a, но не нашел подходящей литературы, поэтому пришлось поучить masm.
2 slesh, в чем основные различия tasm/masm и fasm? (наиболее интересен синтаксис)

slesh 09.06.2007 00:18

FASM рулит в том что не надо мучаться с компилом.
Все параметры компила пишутся в исходнике проги.
Вот к примеру некоторые из них:
1) format PE GUI at 5000000h - компилит в PE EXE под графическую оболочку и базовый адрес кода - 5000000h
2) format PE - тоже PE EXE но под консоль
3) format PE64 - под 64 битные системы
4) use16 - 16-ти битный bin файла
5) use32 - 32-х битный bin файла
6) format ELF - вообще под линух.

Ну и в томже духе. И вообще в FASM можно ресурсы прописывать внутри кода программы.

Piflit 09.06.2007 20:21

2 slesh
1. если указать в исходнике format PE или format PE GUI at 5000000h, то строчкой ниже надо писать use16 или use32?
2. почему com весит 25 байт, а ехе 1 кб, причем при запуске ехе вылезает ошибка. вот сам код:
Код:

format PE ; com компилился с format binary
use16  ; закомментивание этой строчки не помогло
org 100h

mov ah,9
mov dx,msg
int 21h

mov ah,0
int 16h

int 20h

msg db 'Hello World$'


iv. 09.06.2007 20:24

2Piflit:
1. Формат PE подразумевает 32 битную адресацию.
2. com - программа на диске находится в таком же состоянии как и в памяти, а в exe присутствует ещё туча всякой служебной инфы, PE заголовок, стаб и т.д.

И ещё, какие нафик прерывания, если ты пишешь под винду? =) Или тогда уже пиши под дос.

NetMan 09.06.2007 20:27

Цитата:

причем при запуске ехе вылезает ошибка. вот сам код:
Этот код не может исполняться под Windows(иметь PE формат), т.к. напрямую использует прерывания.

Piflit 09.06.2007 20:36

нафиг дос))) буду писать под винду, просто сорц из книжки был именно такой...
чувствую, придется еще одну покупать, типа "асм под вин32"...

iv. 09.06.2007 20:39

Цитата:

нафиг дос))) буду писать под винду, просто сорц из книжки был именно такой...
чувствую, придется еще одну покупать, типа "асм под вин32"...
Ниасилишь скорее всего сейчас под винду, попрактикуйся под дос.
Под винду можешь глянуть Уроки Iczelion'а (http://wasm.ru/publist.php?list=1), правда там под масм, но суть та же.

Piflit 09.06.2007 20:44

Цитата:

Сообщение от iv.
Ниасилишь скорее всего сейчас под винду, попрактикуйся под дос.
Под винду можешь глянуть Уроки Iczelion'а (http://wasm.ru/publist.php?list=1), правда там под масм, но суть та же.

я сейчас и не собираюсь, только начал=)
килограммы мануалов и wasm.ru мне в помощь))

кстати, я оттуда (wasm.ru) почти дочитал цикл статей про Ollydbg. познавательно))

ЗЫ но ведь дос приложения можно запускать под вин?... через командную строчку... и тогда их соответственно надо компилить в com, как в моем исходнике... я прав?)

NetMan 09.06.2007 20:45

Цитата:

ЗЫ но ведь дос приложения можно запускать под вин?... через командную строчку... и тогда их соответственно надо компилить в com, как в моем исходнике... я прав?)
да =)

iv. 09.06.2007 20:50

Цитата:

ЗЫ но ведь дос приложения можно запускать под вин?... через командную строчку... и тогда их соответственно надо компилить в com, как в моем исходнике... я прав?)
И .exe тоже, только директивы поменять нужно, в fasm'e, к сожалению, сейчас не скажу какие именно. Васм, опять же, в помощь. =)

NetMan 09.06.2007 20:51

RTFM _http://flatassembler.net/docs.php

Tikson 17.06.2007 19:58

как открыть com программу в CodeView?
у меня открываются только exe

tcl 17.06.2007 20:01

Без понимания ассемблера в дос, ты будешь виндовс чайником.

Satell 18.06.2007 21:49

нужно обьединить два исходника на masm, но когда я включаю модули из второй в первую, вылезают ошибки в модуле windows.inc, огромная куча, вида:
syntax error: in structure
structure improperly initialized

symbol type conflict: bool
symbol redefenition: hinst
если его закомментить то ошибки исчезают

и в user32.inc ошибка symbol redefinition : wsprintfA

т.е. как я понял какие-то структуры из windows.inc как-то перекрываются со структурами из других модулей?
как это можно решить, можно ли вторую программу как-нибудь отдельным модулем c подпрограммой сделать, а из первой её вызывать?

Код:

;модули первой программы
EXTERN  shutdown@8:NEAR
EXTERN  recv@16:NEAR
EXTERN  send@16:NEAR
EXTERN  accept@12:NEAR
EXTERN  listen@8:NEAR
EXTERN  bind@12:NEAR
EXTERN  closesocket@4:NEAR
EXTERN  socket@12:NEAR
EXTERN  CharToOemA@8:NEAR
EXTERN  WSAStartup@8:NEAR
EXTERN  wsprintfA:NEAR
EXTERN  GetLastError@0:NEAR
EXTERN  ExitProcess@4:NEAR
EXTERN  lstrlenA@4:NEAR
EXTERN  WriteConsoleA@20:NEAR
EXTERN  GetStdHandle@4:NEAR

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\ws2_32.lib
includelib \masm32\lib\winmm.lib
include    \masm32\include\kernel32.inc
include    \masm32\include\winmm.inc

;модули второй программы
include \masm32\include\windows.inc
include \masm32\include\masm32.inc
include \masm32\include\user32.inc
include \masm32\include\wsock32.inc
includelib \masm32\Lib\masm32.lib
includelib \masm32\Lib\wsock32.lib


_Great_ 18.06.2007 21:59

Цитата:

и в user32.inc ошибка symbol redefinition : wsprintfA
Выход - закомментировать прототип wsprintfA в windows.inc
Это ошибка в масме, wsprintfA объявлена и в user32.inc (где и должна быть) и в windows.inc (где ее за каким-то хреном поместили).

Satell 19.06.2007 11:38

выдрал фтп сервер из пинча
вроде бы компилиться ml /c /coff /Cp ftp.asm

потом линкую link /subsystem:windows ftp.obj
вылезают ошибки unresolved external symbol _SendReply@8
unresolved external symbol _MainSockListen@0
unresolved external symbol _ServeThread@4

в файле obj к функциям SendReply, MainSockListen, ServeThread добавляются какие-то цифры и нижняя черточка перед _функция@8 _функция@0 _функция@4 и линкер не может понять их

что это?
у каво есть рабочий исходник ftp сервера?

ниже то что добавил в файл ftp.asm
Код:

.586P
.MODEL FLAT, stdcall
include Inc\windows.inc
include Inc\kernel32.inc
include Inc\user32.inc
include Inc\advapi32.inc
include Inc\ws2_32.inc
include Inc\wsock32.inc
include Inc\oaidl.inc
include Inc\pinch.inc
include Inc\ole32.inc
include Inc\shlwapi.inc
include Inc\oleaut32.inc
include Inc\shell32.inc
include Inc\masm32.inc
include Inc\rasapi32.inc
include Inc\gdi32.inc
include Inc\oaidl.inc
include Inc\aplib.inc
include Inc\urlmon.inc
include Inc\wininet.inc
includelib Lib\ole32.lib
includelib Lib\kernel32.lib
includelib Lib\user32.lib
includelib Lib\oleaut32.lib
includelib Lib\advapi32.lib
includelib Lib\shlwapi.lib
includelib Lib\shell32.lib
includelib Lib\masm32.lib
includelib Lib\wsock32.lib
includelib Lib\ntdll.lib
includelib Lib\ws2_32.lib
includelib Lib\rasapi32.lib
includelib Lib\gdi32.lib
includelib Lib\urlmon.lib
includelib Lib\aplib.lib
includelib Lib\wininet.lib

start:
        invoke startftp
end start



Время: 00:29