• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak wywołać funkcję z WinApi w assemblerze ?

Object Storage Arubacloud
0 głosów
901 wizyt
pytanie zadane 4 września 2015 w Inne języki przez NTXFN Gaduła (3,430 p.)
Jak wywołać funkcję z WinApi w assemblerze ? I może jak stworzyć zmienną ( int - rozmiar mi obojętny ) w asemblerze (ale na przykładzie. w internecie szukałem ale jednak chyba tylko da się na stosie) ?

5 odpowiedzi

+2 głosów
odpowiedź 5 września 2015 przez Krawiec91 Pasjonat (19,600 p.)
Da się alokować pamięć na stercie, właśnie przy użyciu funkcji z WinAPI. Ogólnie można używać funkcji z Win API w assembly. Konieczne pewnie będzie dołączenie bibliotek, typu kernel32, ale tak poza tym można używać Win API. W linku masz przykłady kodu z użyciem funkcji GetProcessHeap(), HeapAlloc(), HeapFree().
http://kipirvine.com/asm/articles/heap_allocation.pdf
komentarz 5 września 2015 przez NTXFN Gaduła (3,430 p.)
Ale wydaje mi się że to takie nie assemblerowe, a ja chcę wszystko ręcznie tak jak da dezassembbleracji będzie wyglądać.
komentarz 5 września 2015 przez Krawiec91 Pasjonat (19,600 p.)
Czy ja wiem, czy nieassemblerowe. Przydzielenie pamięci na heap-ie, na żądanie programu leży w kwestii systemu operacyjnego, a nie procesora.W takim wypadku użycie funkcji z Win API, moim zdaniem jest zupełnie zwyczajne.
komentarz 5 września 2015 przez NTXFN Gaduła (3,430 p.)
No ale w assembleże są wogóle funkcje ? W sensie chciałbym żeby to było int/jmp/call.
+1 głos
odpowiedź 5 września 2015 przez hit02 Nałogowiec (33,970 p.)

Musisz najpierw powiedzieć asemblerowi, że będziesz kożystał z biblioteki dll, w której jest funkcja, której potrzebujesz, a potem wywołujesz funkcję tak, jak każdą inną w konwencji stdcall. Jeśli korzystasz z FASM'a, to funkcję chyba trzeba było wywoływać przez referencję ( call [FunkcjaWinapi] ).

NASM, aby uniknąć odwoływania przez referencję tworzy jednoinstrukcyjne pseudo-funkcje w stylu:

jmp [twojaImportowanaFunkcja]

Przykład dla NASM:

bits 32

extern _Beep

section .text

	push 1000  ;dwDuration
	push 0x100 ;dwFreq
	call _Beep
	ret

I komendy do kompilacji:

nasm winApiFunc.asm -f win32
ld winApiFunc.obj %windir%\system32\kernel32.dll

 

komentarz 6 września 2015 przez NTXFN Gaduła (3,430 p.)

Czyli w C++ to jest wywołanie jakiejś funkcji z tablicy funkcji ale dzięki wskaźnikowi ?

Acha. Czyli :-) w EXE jest nie tylko kod ? A gdzie jest tablica importów ? Jak ją się deklaruje (jak ją znaleźć i do niej coś dodać ?) ?Jak wogóle w takim razie wygląda kod EXE-ka ? No i w końcu to <JMP.&KERNEL32.Beep> co oznacza ? W sensie chodzi o funkcję Beep i dlatego jest napiusane Beep ? No ale to z dll po nazwach wyjmujemy ? Powiedzmy że mam z dll-kami pewne problemy bo jak można to samo wywołać w C++ Assemblerze i VB ?! 

No i w tym <...>  ten ampersant i JMP też nie rozumiem. W sensie:

Co znaczy JMP

Co znaczy &KERNEL32

Co znczy Beep ?

W sensie :-) nie spodziewałem się zę wszystko będzie nazwai ale po co to Kernel? Chodzi o jakieś namespace czy coś w tym stylu ? Czemu to nie może być tutaj po prostu ? I o znaczy to o tym JMP ? Nadal nie ogarniam tego CALL. Nie rozumiem  gdzie skaczemy. Do tego Beep czy co ? To czemu nie call Beep albo 0x... ? 

komentarz 6 września 2015 przez hit02 Nałogowiec (33,970 p.)

Tak. Podczas ładowania pliku PE (m.in. exe i dll) ładowane są również importowane biblioteki, a adresy (wskaźniki) importowanych funkcji w RAM są wpisywane do tablicy importów w obrazie pliku w pamięci RAM. Nazwy bibliotek, oraz funkcji są przechowywane w formie tekstowej gdzieś w strukturze plików PE. Tutaj przykładowo wpis funkcji Beep widoczny w hexedytorze:

Oczywiście jest też tablica eksportów i każdy plik PE może ekportować kod (funkcje) lub dane. Po więcej informacji odsyłam do specyfikacji plików PE i COFF.

Wpisy w tablicy importów i eksportów też są to między innymi nazwa funkcji/danych (adresu eksportowanego czegoś) oraz adres, więc tak. Z dll importuje się po nazwach.

W nawiasach trójkątnych OllyDbg wpisał JMP razem z &Kernel32 i Beep, aby powiedzieć, że wykonanie przeskoczy do instrukcji JMP, która natomiast skoczy do funkcji Beep w bibliotece kernel32. Te nawiasy są tam tylko dla ułatwienia czytania kodu, bo gdybyś miał tam adres w hexa, to byś nie wiedział od razu, że chodzi o systemową funkcję Beep.

komentarz 6 września 2015 przez NTXFN Gaduła (3,430 p.)
Ale jak byś tam miał adres hexa to gdzie nazwa  funkcji :)  ? A w zasadzie to ja nawet nie wiedziałemże mam jakąś struktórę plików ! Ale z EXE też jest tablica importów ? Muszę więc się zająć PE (co kolwiek to oznacza :-). )  :) . Widzę że to z moimi informacjami  jest za trudne :-) Czy jest w tych plikach coś więcej niż tylko same expoet i importn ? I jak to wygląda ? W seęsie co jest na początku na końcu i gdzie jest nasz kod ? A ja idę spypytać wójków (Google i Wiki) :-)
komentarz 6 września 2015 przez hit02 Nałogowiec (33,970 p.)

Oczywiście, że pliki mają strukturę, a przynajmniej większość ją ma. Jeśli pierwszy raz się z tym spotykasz, to polecam zająć się jakimś prostrzym formatem np. bmp. Pliki bmp, to zazwyczaj 2 struktury i tablica pikseli, więc jest to naprawdę prosty format.laugh

PE oznacza Portable Executable, czyli przenośny plik wykonywalny. W końcu Windows działa nie tylko na x86, ale też na ARM, MIPS i pewnie kilku innych architekturach.

Co do dokładnej struktury PE, to jescze się jej nie przyglądałem, więc nie powiem ci dokładnie, co jeszcze tam jest. Na pewno są tam sekcje i ich nagłówki. Masz na przykład sekcję kodu, sekcję danych, albo sekcję zasobów. Z tego powodu w asemblerze piszesz na przykład "section .data" dla danych, albo "section .text" dla kodu. smiley

komentarz 6 września 2015 przez NTXFN Gaduła (3,430 p.)
dobra dzięki. mam poradnik o assemblerze i naj[pierw og wyryje na pamięća potem o ReverseEngeringu gdzie te informacje są. Jestem bardzo ciekawy jak powinny wyglądać zapisane dane :-) Dzięki za pomoc. Ale chyba jeszcze tu wrucę :-)
0 głosów
odpowiedź 4 września 2015 przez Patrycjerz Mędrzec (192,320 p.)
WinAPI, jak dobrze wiem, jest biblioteką dostępną tylko na języki wyższego poziomu, czyli C i C++.
komentarz 5 września 2015 przez hit02 Nałogowiec (33,970 p.)

Zauważ, że języki wyższego poziomu są kompilowane do asemblera, a co za tym idzie WinAPI musi być dostępne w asemblerze. smiley

komentarz 5 września 2015 przez Patrycjerz Mędrzec (192,320 p.)

Oczywiście, to prawda, ale wg mnie jest to robota karkołomna. Nie wiem, jak się używa funkcji w asemblerze, więc napisałem to z przymrużeniem oka wink

komentarz 5 września 2015 przez NTXFN Gaduła (3,430 p.)
Właśnie. Jak to działa ? Wszystko jest komplilowane do asm więc jak wywołać wfunkcję z WinApi ? Ale morze jest zamiennik w interrupt  jak nie to przecież jakoś trzeba użyć po assemblerowemu. Może w jmp a kod jest w dll ale jak wogóle dołączyć dll po assemblerowemu ? No bo w NASM się da ale jak w ndisasm to chyba nie extern :-) .
0 głosów
odpowiedź 5 września 2015 przez Ehlert Ekspert (212,670 p.)
.code
start:
       invoke MessageBox, NULL, addr MsgBoxText, addr MsgCaption, MB_OK
       invoke ExitPRocess, NULL
end start

Potrzebujesz user32.dll i kernel32.dll

komentarz 5 września 2015 przez NTXFN Gaduła (3,430 p.)
Pokażesz pełny kod ? I czy to jest NASM assembler ale taki czysty bez doddatków że jak go potroktuje ndisasm to mi to wyświetli co wpisałeś ?
0 głosów
odpowiedź 5 września 2015 przez NTXFN Gaduła (3,430 p.)

Stworzyłem konsolę:

#include <iostream>

using namespace std;

int main()
{
    cout << "Hello world!" << endl;
    return 0;

}

To w efekcie uzyskałem nieskończone linie assemblera w ndisasm (dekompilacji). nie wiem czy to jest jakieś zaciemnienie kody czy coś ale nie mam pojęcia co mi Hallo word wyświetla ! Myślałemże wszystko będzie w int. A kernel 32 też musi być jakoś napisany. W nim juz musi być coś co nie korzysta z kolejnych bibliotek bez końca ! Co naprawdę wywołuje hallo word alebo massageBox czy tworz okna ?!

Podobne pytania

0 głosów
0 odpowiedzi 455 wizyt
pytanie zadane 21 stycznia 2016 w Inne języki przez ziemjok Gaduła (4,160 p.)
+1 głos
2 odpowiedzi 205 wizyt
pytanie zadane 28 listopada 2015 w Inne języki przez Kapi2222 Obywatel (1,220 p.)
0 głosów
1 odpowiedź 154 wizyt
pytanie zadane 12 lutego 2018 w C i C++ przez Hiskiel Pasjonat (22,830 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...