[ Assembler ] — начинающим: задаем вопросы

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by !_filin_!, 25 May 2007.

  1. !_filin_!

    !_filin_! Elder - Старейшина

    Joined:
    7 Jan 2007
    Messages:
    86
    Likes Received:
    40
    Reputations:
    16
    надо в меседжбоксе вывести содержание переменной, как реализовать?

    Great: В этой теме задаем простые вопросы по ассемблеру (специально для новичков)
     
    #1 !_filin_!, 25 May 2007
    Last edited by a moderator: 26 May 2007
    madik likes this.
  2. А®ТеS

    А®ТеS Active Member

    Joined:
    25 Nov 2006
    Messages:
    198
    Likes Received:
    193
    Reputations:
    41
    Элементарно:
    Code:
    ...
    .data
    msgtext db "Hello, WORLD", 0h
    msgcap db "It is ASM!!! =)", 0h
    ...
    .code
    start:
    INVOKE MessageBoxA, 0 offset msgtext, offset msgcap, 0
    end start
     
    #2 А®ТеS, 25 May 2007
    Last edited by a moderator: 29 Apr 2008
  3. !_filin_!

    !_filin_! Elder - Старейшина

    Joined:
    7 Jan 2007
    Messages:
    86
    Likes Received:
    40
    Reputations:
    16
    гг..ты немного...а точнее совсем нетак понял. Значение в переменную заносится во время работы проги, например я от функции получаю число. и его надо вывести на месседж бокс вот примерный код:
    ...................
    Code:
    .data
    msgtext db "Hello, WORLD", 0h
    msgcap db "It is ASM!!! =)", 0h
    messedg db ?
    ...............
    Code:
    code
    start:
    mov messedg, 15
    INVOKE MessageBoxA, 0 offset msgtext, offset msgcap, 0
    end start
    Использовал вместо функции MOV, соответственно как на месседж бокс вывести содержание переменной messedg (число 15)
     
    #3 !_filin_!, 25 May 2007
    Last edited by a moderator: 29 Apr 2008
    1 person likes this.
  4. da_ff

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

    Joined:
    11 Jul 2006
    Messages:
    118
    Likes Received:
    22
    Reputations:
    26
    а сзади дописать 0h у messedg? так сказать привести строку к ASCIIZ виду
     
    #4 da_ff, 25 May 2007
    Last edited: 25 May 2007
  5. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Просто так вывести нельзя. так число - это не строка.
    Поэтому нужно перевести из числа в строку. Можно сделать это вручную, но лучше юзать API функцию.
    Вот код на FASM. Выводит содержимое регистра.
    Code:
    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'
    
     
    #5 slesh, 26 May 2007
    Last edited: 26 May 2007
    1 person likes this.
  6. Xserg

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

    Joined:
    9 Dec 2006
    Messages:
    135
    Likes Received:
    127
    Reputations:
    53
    Решил тоже ассемблер поизучать.
    Пишется таким способом тяжело, зато инжектится в чужой процесс элементарно.
    IMНO зачем тогда ассемблер нужен.

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

    Code:
      .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:
     
    1 person likes this.
  7. tclover

    tclover nobody

    Joined:
    13 Dec 2005
    Messages:
    741
    Likes Received:
    682
    Reputations:
    287
    Мне нужна таблица системных вызовов линукс, чтобы с регистрами и все дела =\
    Есть у кого?
     
    4 people like this.
  8. _Great_

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

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    Тискаем гугл

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

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 da_ff. Типа сумничал?
    Можно и сделать деление, но это только в тех случаях когда пишешь под DOS. потому что там нет API функций. Если нужно под дос, то могу выложить примерчик!
     
  10. -n00by-

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

    Joined:
    10 Mar 2007
    Messages:
    46
    Likes Received:
    16
    Reputations:
    0
    О! крута.... ну раз такой сабж забили, то посоветуйте книги/статьи попроще, ибо я ваще в этом не шарю
     
  11. _Great_

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

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    В.Юров учебник+справочник, калашникова рекомендуют (не читал)

    ЗЫ. Зубкова еще рекомендуют, сам не читал )
    ЗЫЫ. Вообще, моё имхо, рано или поздно по любой книге можно выучить асм. Точнее, не по одной, а если купить несколько книг, мозг в конце концов научится отфильровывать ненужное.
     
    #11 _Great_, 27 May 2007
    Last edited: 30 May 2007
    3 people like this.
  12. Dumkopff

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

    Joined:
    5 Apr 2006
    Messages:
    60
    Likes Received:
    25
    Reputations:
    0
    -n00by-
    Iczelion tutorials
    все очень понятно написано имхо.
     
    2 people like this.
  13. !_filin_!

    !_filin_! Elder - Старейшина

    Joined:
    7 Jan 2007
    Messages:
    86
    Likes Received:
    40
    Reputations:
    16
    Какраз Икзелиона туторы для начала будут сложные.
    Лутше начинай с Калаша, потом Самоучитель Ассемблер IBM PC (Галисеева) ну и под конец Assembler для DOS, Win , Unix (Зубкова)
    Как по мне это три основные книжки, от Калаша узнаеш вообще что такое асм там всё очень доходчиво описано, Самоучитель - это уже следуйщий уровень, описана работа под Вынем и некоторые интересные алгоритмы, Зубков - это классика тут уже высший уровень. Линки не давал потому что у меня эти книжки в печатном варианте.
    Назвал основу но конечно чем больше инфы прочитаеш ( и запомниш! ) тем лутше для тебя (Тот же Икзелион). Так что гугл тебе в руки, сейчас литературы очень много!
     
    3 people like this.
  14. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Берешь список инструкций МП и этого уже будет достаточно.
    Ну и как всегда Справочник по Api функциям и прерываниям Dos
     
  15. L0rd_Ha0S

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

    Joined:
    25 Jan 2006
    Messages:
    148
    Likes Received:
    102
    Reputations:
    64
    To -n00by-:
    Вот сюда зайди, тут много чего интересного есть.
     
    1 person likes this.
  16. Piflit

    Piflit Banned

    Joined:
    11 Aug 2006
    Messages:
    1,249
    Likes Received:
    585
    Reputations:
    31
    как компилировать *.asm сорцы в masm'e?
    и во что они должны скомпилиться, в exe или в com?
     
  17. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Во что компилить - это уже во что захочешь. т.е. есть опции для компиляции, также внутри файла есть маханькие описания. типа если файл создает из сегмента кода, данныйх итд, то никогда ты его не скомпилишь в ком файл.
    Вроде масм компилит по умолчанию в EXE.
    Для того чтобы компильнуть под COM нужно делать так:
    ml.exe [имя_файла].asm /AT
     
    #17 slesh, 7 Jun 2007
    Last edited: 7 Jun 2007
  18. taha

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

    Joined:
    20 Aug 2006
    Messages:
    399
    Likes Received:
    330
    Reputations:
    251
    мой любимый способ:

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

    Code:
     ;@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 .dll .sys .....)
    на wasm.ru кажется были опции
     
  19. NetMan

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

    Joined:
    9 Feb 2004
    Messages:
    121
    Likes Received:
    37
    Reputations:
    34
    А не проще ли юзать какую-нибудь IDE? RadASM или WinASM, например?
     
  20. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    Командами:
    ml /c /coff /Cp *.asm
    link /SUBSYSTEM:CONSOLE *.obj
    Флаги различны в зависимости от того, что на выходе хочешь. Навскидку что обозначают к сожалению уже не помню - смотри на wasm.ru

    Оу, что-то не понял прикола, прошу пояснений. Твой способ у меня не сработал к сожалению. =)
    Да ну, имхо фигня эти все ide для асма. Максимум нужны только в крупных проектах, чтоб не запутаться.