Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Java ASM Bytecode Library


Gość povskill

Rekomendowane odpowiedzi

Opublikowano

ASM Bytecode Library

To będzie krótki wprowadzający tutorial do ASM dla początkujących. Dodaję to dlatego, może ktoś kiedyś z tego skorzysta, a ja mam okazję sobie przypomnieć parę rzeczy. Pomysł nadszedł niedawno podczas pisania bota do runescape.

Ten tutorial jest przeznaczony jedynie dla osób które posiadają już jakąś wiedzę odnośnie javy, pozostali prawdopodobnie nic nie zrozumieją.
Miłej lektury.



Na początku chciałbym sprostować nieporozumienia dla nazwy "ASM", mówimy tutaj o ASM jako bibliotece kodu bajtowego, jej oficjalna witryna to : http://asm.ow2.org/.

Ok, zacznijmy od przydatnych linków które pozwolą na zrozumienie rzeczy o wiele łatwiej:
http://docs.oracle.com/javase/specs/jvms/se7/html/index.html - sekcje 4/6
http://pl.wikipedia.org/wiki/Odwiedzający - wzorzec projektowy który jest wykorzystywany w ASM. Jak na razie w tutorialu nie będę go używać, ale jeśli będę rozwijał wątek to dobrze by było go znać.




Gdzie mogę użyć ASM ?
-Boty do runescape (tak jak ja to robię)
-Obfuskatory
-Deobfuskatory
-I wiele innych ciekawych zastosowań ;)

Co potrzebuję?
- Zintegrowanego środowiska programistycznego (IDE), najlepiej IntelliJ IDEA, IDEA ma również plugin do ASM, ale dam sobie rękę uciąć, że jakby dobrze poszukać to znajdziemy wersję dla Eclipse.
- Stabilną wersje ASM : http://forge.ow2.org/projects/asm/
- Cierpliwość, jeśli coś nie wychodzi to nie poddawaj się tylko próbuj dalej.
- Dodatkowy edytor kodu bajtowego, np http://www.cs.ioc.ee/~ando/jbe/


Zaczynamy!

Na początku zaczniemy sobie od podstawowego szukania wartości ciągu charsów (String). Zobaczmy czy potrafimy odszukać "Polish Civil".

public class Main{

public static void main(String[] args) {
System.out.println("Polish Civil");
}
}

To ^ jest kod normalny w javie a teraz zobaczmy jak to wyglada po skompilowaniu:

0 getstatic #2 <java/lang/System/out Ljava/io/PrintStream;>
3 ldc #3 <Polish Civil>
5 invokevirtual #4 <java/io/PrintStream/println(Ljava/lang/String;)V>
8 return

Teraz widzimy w bytecode Polish Civil, to jest instrukcja LDC
Więc potrzebujemy zrobić klasę która nam znajdzie tekst Polish Civil.

Po pierwsze potrzebujemy stworzyć nową instancje klasy ClassReader Która przyjmuje parametr InputStream, więc po prostu robimy:

ClassReader reader = new ClassReader(new FileInputStream("Main.class"));

Po drugie potrzebujemy ClassNode która po prostu reprezentuje klase :F. Więc dodajemy to do naszego kodu, ALE nasza ClassNode nie będzie działać do puki nie zostanie zaakceptowana przez
ClassReader-a. Więc nasz kod bd wyglądać tak:

ClassReader reader = new ClassReader(new FileInputStream("Main.class"));
ClassNode node = new ClassNode();
reader.accept(node,0); /ten 2 parametr jest dla flag , nie ważne na razie ;)

ClassReader akceptował naszą ClassNode aby była naszym Main class, wiec teraz możemy przeczytać wszystko to co potrzebujemy by znaleźć tekst "Polish Civil". No to szukamy:
1. Musimy zlokalizować naszą główna funkcje (main), więc po prostu przelećmy wszystkie metody w klasie :F

for(int i = 0; i < node.methods.size(); i++) {
MethodNode mn = (MethodNode) node.methods.get(i);
if(mn.name.equals("main")) {
System.out.println("Mamy naszą metodę");
}
}

TO BE CONTINUED

Opublikowano

Aktualnie pordnik nie pokazuje kompletnie nic ciekawego, bo identyczna funkcjonalnosc da sie osiagnac przez 3 linijki kodu i uzycie systemu refleksji Javy.

 

 

public class RTest {
 
    public void print() {
        System.out.print("Reflection test");
    }
}
 

public class Example {
 
    public static void main(String... args) throws NoSuchMethodException, ClassNotFoundException, InvocationTargetException, IllegalAccessException, InstantiationException {
 
        Class reflected = Class.forName("RTest");
        Method[] methods = reflected.getDeclaredMethods();
        System.out.print("Mamy wszystkie metody klasy...\n");
        methods[0].invoke(reflected.newInstance(), null);
    }
}
Opublikowano

o fajnie fajnie, ale yyy co? Na początku mnie zaciekawiłeś, ale potem odrazu zacząłeś yy szukać tekstu. A ja nie ogarniam, po co ty szukasz tego tekstu ? Jak zobaczyłeś jak wygląda ten tekst po skompilowaniu ? Ale po co to wgl. robimy ? Gdzie tego tekstu szukamy, na otwartym innym programie czy na jakimś pliku .class ?

 

Nie ogarniam -_-

Opublikowano

o fajnie fajnie, ale yyy co? Na początku mnie zaciekawiłeś, ale potem odrazu zacząłeś yy szukać tekstu. A ja nie ogarniam, po co ty szukasz tego tekstu ? Jak zobaczyłeś jak wygląda ten tekst po skompilowaniu ? Ale po co to wgl. robimy ? Gdzie tego tekstu szukamy, na otwartym innym programie czy na jakimś pliku .class ?

 

Nie ogarniam -_-

 

Na razie szukamy później będziemy podmieniać. Szukamy stringu poprzez program w javie, no chyba ze chcesz otwierać 500 plików i sprawdzać czy jest tam coś czego szukasz.

 

 

 

Aktualnie

pordnik nie pokazuje kompletnie nic ciekawego, bo identyczna

funkcjonalnosc da sie osiagnac przez 3 linijki kodu i uzycie systemu

refleksji Javy.

 

 

public class RTest {

 

public void print() {

System.out.print("Reflection test");

}

}

 

 

public class Example {

 

public static void main(String... args) throws NoSuchMethodException, ClassNotFoundException, InvocationTargetException, IllegalAccessException, InstantiationException {

 

Class reflected = Class.forName("RTest");

Method[] methods = reflected.getDeclaredMethods();

System.out.print("Mamy wszystkie metody klasy...\n");

methods[0].invoke(reflected.newInstance(), null);

}

}

Następnym razem przeczytaj to co napisałem.... poprzez refleksje nic nie osiągniesz bo możesz tylko czytać a nie zapisywać.Temat jest o asm bytecode library, czyli strikte o manipulacji kodu bajtowego ale tego zapewne też nie przeczytałeś.

I btw z reflektem żadnego bota nie zrobisz.

 

Napisałem TO BE CONTINUED to to be continued.

Opublikowano

Uważałem cię tylko spamera, ale jak zobaczyłem co potrafisz to zmieniłem o tobie zdanie SZACUN
Też chcę się nauczyć normalnej Javy, a nie tylko dokumentacji javy LECI +

Jakiś problem? Napisz na PW

backtrack-it_userbar4.png?w=460

Opublikowano

Pisac o funkcjonalnosci czegos, a ja pokazac to dwie rozne rzeczy. Moze i ta biblioteka to potrafi, ale w tucie nie ma tego pokazanego. Na podstawie Twojego kodu dalem kod, z identyczna funkcjonalnoscia jak ta z "poradnika". Jak sie o czyms pisze i nazywa tutorialem, to sie to rowniez pokazuje w uzyciu, a nie tut napisany w 10-15 min, z praktycznie 0 przydatnoscia w tym momencie. Czytalem co robi ta biblioteka i nawet ja znam, chociaz do pisania takich rzeczy duzo bardziej wole c++ i asma. Jesli pokazalbys ta funkcjonalnosc to co innego, ale jej nie pokazales, wiec nie wymagaj ze ktos kto nie zna biblioteki bedzie wierzyl na slowo. Ja pokazalem jak moze osiagnac to samo co zostalo pokazane w krotszy sposob.

Opublikowano

Pisac o funkcjonalnosci czegos, a ja pokazac to dwie rozne rzeczy. Moze i ta biblioteka to potrafi, ale w tucie nie ma tego pokazanego. Na podstawie Twojego kodu dalem kod, z identyczna funkcjonalnoscia jak ta z "poradnika". Jak sie o czyms pisze i nazywa tutorialem, to sie to rowniez pokazuje w uzyciu, a nie tut napisany w 10-15 min, z praktycznie 0 przydatnoscia w tym momencie. Czytalem co robi ta biblioteka i nawet ja znam, chociaz do pisania takich rzeczy duzo bardziej wole c++ i asma. Jesli pokazalbys ta funkcjonalnosc to co innego, ale jej nie pokazales, wiec nie wymagaj ze ktos kto nie zna biblioteki bedzie wierzyl na slowo. Ja pokazalem jak moze osiagnac to samo co zostalo pokazane w krotszy sposob.

Ehh ty chyba nie wiesz co to jest refleksja człowieku -__-.

 

Ja operuje na plikach.class ty potrzebujesz classlaodera do odpalenia swojego kodu. Poducz się trochę zanim zaczniesz coś pisać.

Opublikowano

Widze ze jak zwykle nie potrafisz czytac ze zrozumieniem napisanego tekstu. Ja pisze o jednym Ty odwracasz, wyciagasz z kontekstu i piszesz o czyms calkowicie innym. Nie rozumiesz pojecia funkcjonalnosc widze, albo nie rozumiesz ze kod w tucie nie zrobil nic wiecej z perspektywy obserwatora jak moj. Gdybym nie znal javy to by mi nie pozwolili pisac kodu do duzych projektow dla volkswagena. Wiec schowaj to swoje "poducz sie" i zastosuj sie sam do tego.

Opublikowano

Widze ze jak zwykle nie potrafisz czytac ze zrozumieniem napisanego tekstu. Ja pisze o jednym Ty odwracasz, wyciagasz z kontekstu i piszesz o czyms calkowicie innym. Nie rozumiesz pojecia funkcjonalnosc widze, albo nie rozumiesz ze kod w tucie nie zrobil nic wiecej z perspektywy obserwatora jak moj. Gdybym nie znal javy to by mi nie pozwolili pisac kodu do duzych projektow dla volkswagena. Wiec schowaj to swoje "poducz sie" i zastosuj sie sam do tego.

oo To pan zmyślacz witam pana ponownie. Znowu pan usunie posty ? Bo nie wiem czy jest sens prowadzić tą rozmowę.

 

Kod w 'tucie' daje wprowadzenie do używania podstawowych funkcji w ASM. Funkcjonalność powiadasz? Pisałeś kiedyś deobfuskatora w javie? Ojoj nie? Tak sie sklada że twoja 'funkcjonalność' ma się ni jak do wypisanej listy rzeczy które możemy zrobić za pomocą ASM.

Refleksji się używa tylko wtedy gdy.... żaden szanujący się programista w javie nie będzie używał refleksji do wymienionych przeze mnie rzeczy.

I znowu się zaczyna.

Ja napisałem że twoja refleksja sie ma nijak do tutka bo ja czytam/edytuje bytecode a ty operujesz na metodach w trakcie wykonania programu (ClassLoader) , a ty próbujesz mi powiedzieć że to jest funkcjonalne wtf. I jeszcze wyjeżdżasz z Volswagenem lol. Gdzie jeszcze pracujesz? W MCDonaldzie na dziale programista podawarki kubków do coca-coli.

 

 

Opublikowano

Wroc prosze do podstawowki i naucz sie czytania ze zrozumieniem. Z PERSPEKTYWY OBSERWATORA. Nie mowie o wewnetrznym dzialaniu kodu, ale widze nie rozumiesz tego nadal. Wewnetrznie to sobie moge napisac 10 funkcji robiacych to samo i chociaz wynik koncowy na konsoli bedzie identyczny to powiem ze funkcjonalnie sa rozne bo dzialaja inaczej. Zrobisz cos co rzeczywiscie robi to co zostalo napisane ze robi we wstepie to wtedy sie odzywaj,

 

A pracuje caly czas w tym samym miejscu, ale widze nie rozumiesz tego ze firmy posiadaja klientow i ludzie zazwyczaj pracuja na projektach dla kogo? tak wlasnie dla innych firm. Moze kiedys sie dowiesz.

Opublikowano

Wroc prosze do podstawowki i naucz sie czytania ze zrozumieniem. Z PERSPEKTYWY OBSERWATORA. Nie mowie o wewnetrznym dzialaniu kodu, ale widze nie rozumiesz tego nadal. Wewnetrznie to sobie moge napisac 10 funkcji robiacych to samo i chociaz wynik koncowy na konsoli bedzie identyczny to powiem ze funkcjonalnie sa rozne bo dzialaja inaczej. Zrobisz cos co rzeczywiscie robi to co zostalo napisane ze robi we wstepie to wtedy sie odzywaj,

 

A pracuje caly czas w tym samym miejscu, ale widze nie rozumiesz tego ze firmy posiadaja klientow i ludzie zazwyczaj pracuja na projektach dla kogo? tak wlasnie dla innych firm. Moze kiedys sie dowiesz.

inb4 usuniesz znowu swoje posty wiec nawet nie wdaję się w dyskusję.

Ja piszę o edycji kodu bajtowego ty o refleksji (którą i tak źle napisałeś)

Opublikowano

Ofc ze zle, bo przeciez ja nie mam pojecia co napisalem, w przeciwienstwie do boga, ktory jest tworca javy i zna ja wzdluz i wszerz. Wgl to pracuje dla googla albo nasa i kodzi jakies systemy namierzania dla rakiet.

 

Pozdro

Opublikowano

Ludzie przecież on to pisze dla osób uczących się, gówno wszystkich obchodzi kto co z was umie i jak by to zrobił, tak się składa

że on robi tutorial i zaczyna tak jak chce, czyli od podstawy.

Skoro uważacie się za najlepszych to uważajcie dalej, ale zatrzymajcie to dla siebie.

 

Mógł od razu jebnąć kod bot'a do runescape, nie? o.O

 

Zwątpiłem w ludzkość.

536061453511031953381.png


Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...