fasm (asamblor) pe Mac
  [ Ignoră ]
Avatar
RankRankRank
Member
Din: București
Macuser din: 18.05.07

Nu stiu daca intereseaza pe cineva… dar pentru eventualitatea ca ajuta poftiti va rog (eu am cautat si nu am gasit).
Intrucat nu am vazut nici un asamblor cat de cat functional pe Mac (in timp ce pt. windows sunt gramezi si pentru Linux gramezi mai mici) m-a apucat amocul sa portez fasm pe mac (si vi-l dau atasat)

Primul pas, fara de care nu se poate este objconv un soft gratuit deosebit de util in sine, intre altele pentru a converti obj elf in obj MachO
Evident am pornit de la o versiune existenta (libc) dar lucrurile nu sunt asa simple precum par
fasm
In principal se fac urmatoarele modificari:
Important: sub MacOS toate functiile de system vor stiva aliniata la 16 bytes cand sunt chemate, motiv pentru care a trebuit modificat (urat) macro-oul ccall a.i. sa lase stiva aliniata

modificarea referintelor externe a.i. sa inceapa cu _, de pilda _malloc in loc de malloc, _main in loc de main

Se face build la varianta de libc (din sursele incluse)
Se ruleaza objconv -fmacho fasm.o fasm.mach.o
si gcc fasm.mach.o

PS: Intrucat nu e sectiune de developping am scris aici, daca vreun moderator considera inoportun acest mesaj ii multumesc pentru ca il va fi mutat intr-un loc mai potrivit.

Fișiere atașate
fasm_mac.tgz  (Dimensiune Fişier 281 - Downloads: 70)
Profil
 
  [ Ignoră ]   [ # 1 ]
Avatar
RankRankRank
Member
Din: Bucuresti
Macuser din: 11.10.05

Salut
Eu am folosit nasm care se instaleaza default odata cu Xcode.

cristi:assembler diciunasm -f macho testp.s
cristi
:assembler diciugcc -mmacosx-version-min=10.3 -o testp testp.o
cristi
:assembler diciu$ ./testp
Hello World
eHll ooWlr
dcristi
:assembler diciu

Compilatul se face cu nasm, linkeditarea cu gcc. Version min e nevoie pe Leopard pentru ca au schimbat functiile Unix (printf) si le-au inlocuit cu versiuni care respecta std UNIX - i.e. printf$2003, fprintf$2003, etc. Daca nu linkezi cu version min trebuie sa folosesti printf$2003, etc.

Mai jos sursa in assembler:

cristi:assembler diciucat testp.s
    SECTION 
.data        data section
msg
:    db "Hello World",10    the string to print, 10=cr
len
:    equ $-msg        "$" means "here"
                
len is a valuenot an address

    SECTION 
.text        code section
        
global _main        make label available to linker 
_main
:                ; standard  gcc  entry point

    push dword len
    lea eax
[msg]
    push dword    eax
    push dword    1
    
    mov eax
4
    push dword    eax
    int 0x80

    lea si
[msg]
    mov cx
len
    
again
:    mov ax[si]
    xchg al
ah
    mov [si]
ax
    add si
2
    loop again

    push dword len
    lea eax
[msg]
    push dword    eax
    push dword    1
    mov eax
4
    push dword    eax
    int 0x80

    push dword    0
    mov eax
1
    push dword    eax
    int 0x80 
Profil
 
  [ Ignoră ]   [ # 2 ]
Avatar
RankRankRank
Member
Din: București
Macuser din: 18.05.07

Asa e are si as si nasm dar din pacate mie nu prea imi plac.. IMHO fasm-ul este mai puternic, suportand si constructii specifice HLL (proc, ccall, stdcall, macro-uri, mi se pare ca i se poate pune si if/endif mai nou).. Plus ca sursele pe care voiam eu sa le compilez pe mac sunt in format fasm si destul de mari.
On a side note .. smile nu stiam ca mac os suporta si int 80, credeam ca merge doar call in libc smile

Btw, uite un exemplu si cu fasm si libc wink

format ELF

include 'cdecl.inc'

section '.text' executable

 
public _main
 extrn _printf
 extrn _getpid

 _main
:
        
ccall   _getpid
        ccall   _printf
msgeax
        ret

section 
'.data' writeable

 msg db 
"My PID is %d.",0xA,
hawk-mb:fasm hawkfasm test.asm test.elf
flat assembler  version 1.67.26  
(16384 kilobytes memory)
3 passes525 bytes.
hawk-mb:fasm hawkobjconv -fmacho test.elf

Input file
test.elfoutput filetest.o
Converting from ELF32 to Mach
-O Little Endian32

  0 Debug sections removed
  0 Exception sections removed
hawk
-mb:fasm hawkgcc test.-o test
hawk
-mb:fasm hawk$ ./test 
My PID is 47737.
hawk
-mb:fasm hawk
Profil
 
  [ Ignoră ]   [ # 3 ]
Avatar
RankRankRankRank
Sr. Member
Din: Cluj-Napoca
Macuser din: 26.01.06

astea sunt bune pentru a crackui aplicatii nu? smile

 Semnătură 

Mcintoshing…

Profil
 
  [ Ignoră ]   [ # 4 ]
Avatar
RankRankRank
Member
Din: București
Macuser din: 18.05.07

Nu chiar.. pentru ce vrei tu, in principiu iti trebuie un debugger (ceva mai rasarit decat gdb) si evident cunostinte solide de limbaj de asamblare (dar si cunostinte solide cu privire la bucataria OS-ului)
In principiu un asamblor este doar un alt instrument pentru a scrie programe (si inca programe destul de complexe, odata ce te obisnuiesti), cu avantajul ca nu iti ascunde niciodata structura masinii si nici nu te prinde intr-un labirint de tipuri de date. Spre exemplu daca am un dword si vreau sa-l tratez odata ca numar si alta data ca adresa pot s-o fac fara probleme - cata vreme stiu ce fac. In C/C++ compilatorul incearca sa te impiedice sa-ti dai cu tesla-n partile moi, si te chinuie cu tot felul de ampersanti si stelute raspberry.
Un alt motiv (si chiar un motiv serios) pentru a scrie in limbaj de asamblare este viteza mult mai mare de executie a codului (in cazul in care e scris cu cap, ceea ce nu e simplu); recte optimizarile facute de mana omului direct in limbaj de asamblare pot fi mult mai eficiente decat cele facute de compilatoare.

Profil
 
   
 
 
‹‹ AJUTOR LIVE TYPE      Adobe Media Player ››