1 x 1 Assembler



  • Ein NOP wird durch ein Byte mit dem Wert 90h
    erzielt.
    Was heisst das ??
    wie errechnet man den Wert?
    Kann mir das bitte jemand erläutern!
    Gibt es hierzu eine allgemeine Regel?
    _______________________________________________________________________________

    :004116A4 E857830000 call 00419A00

    Im linken Bereich befinden sich neben der Adressangabe :004116A4 die Prozessor-
    anweisungen in der Form von hexadezimalen Opcodes, d.h. die einzelnen Bytes,
    die die Befehle repraesentieren, naemlich E857830000, rechts ist die Bedeutung
    der Instruktion gelistet (call 00419A00).

    Da die vorliegende Instruktion (E857830000) 5 Bytes lang ist, muessen
    auch 5 NOPs gesetzt werden, um den Call wegzupatchen, also muss E857830000
    durch 9090909090 ersetzt werden

    Und hier verstehe ich auch nicht viel.
    004116A4 was ist das?
    E857830000 was ist das?
    call 00419A00 was ist das?
    Warum ist E857830000 5 Bytes lang??
    warum ergibt E857830000 (wenn durch5 NOPs gesetzt wird) 9090909090

    _______________________________________________________________________________

    danke im voraus
    Grüße



  • Der Wert 0x90 ist eine Art Adresse für das Steuerwerk im Professor.
    da die CPU ja nur mit bits rechnen kann (alles andere kennt er nicht mal wirklich namentlich), werden sämtliche Befehle durchnummerriert. nop hat bei intel dann wohl die Nummer 0x90 bekommen.
    freuet euch! Nach einger errechenbaren Regel ist man da nicht wirklich vorgegangen. Man kann nur folgendes erkennen.
    Beispielsweise ist das Bewegen von Werten von einem Register zu einem anderen durch den Befehl 0x89 festgelegt. Welches Register wohin kopiert wird, steht in einem Byte dahinter. 0x89c3 steht beispielsweise für mov bx, ax; 0x89c0 steht für mov ax, ax.
    Um einem register einen konstanten Wert zuzuweisen gibt es wieder andere Befehle.
    ^

    Was deine zweite frage angeht, weiß ich echt nicht, was du meinst..

    cYa
    DjR



  • 004116A4 was ist das?
    E857830000 was ist das?
    call 00419A00 was ist das?

    schau mal ein ein bisschen im Assembler Forum rum, da findest du irgend wo ein paar Links zu Opcode Listen ansonsten nimm google

    Warum ist E857830000 5 Bytes lang??

    weil es 5byte lang ist. Ich weiss nicht wie ich dir die Frage beantworten soll. E857830000 besteht nun mal aus 5byte 🙄

    warum ergibt E857830000 (wenn durch5 NOPs gesetzt wird) 9090909090

    wie oft würdest du 90 über E857830000 schreiben, bis nur noch 90ige da sind 🙄

    ich glaub du hast überhaupt keine Peilung von Assembler und Opcodes, da würde ich an deiner Stelle nicht versuchen mit Cracken anzufangen (zumindest glaube ich, dass du mit Cracken anfangen willst 🙄)

    @Doc

    Der Wert 0x90 ist eine Art Adresse für das Steuerwerk im Professor.

    Ja das Steuerwerk im Professor ist oft wirklich unverständlich 😃 😃



  • Im Vorfeld sei gesagt, daß diese Zahlenwerte sowohl Daten, Adressen im Speicher als auch Befehle sein können.

    004116A4 was ist das?

    Das ist die Adresse des folgenden Befehls (d.h. wo er im Codesegment steht).

    E857830000 was ist das?

    Das ist der Befehl an sich. Kein Mensch lernt heut mehr die Opcodes auswendig, deshalb solltest du mal einen Disassembler drüberlaufen lassen oder, wenn es nur ein kurzes Codefragment ist, mit einer Tabelle von Hand in Mnemonik übersetzen.

    call 00419A00 was ist das?

    Der Aufruf eines Unterprogramms, welches an der angegebenen Adresse (im Codesegment 0041h) steht.

    So würde ich es jetzt interpretieren. Natürlich weiß ich weder, wo du diese Werte herhast (aus Datei/Speicher, von Debugger/Hexeditor), noch, ob du im Real oder Protected Mode arbeitest. Also sonderlich präzise kann man deine Fragen ohne weitere Informationen nicht beantworten...



  • NOP == xchg ax,ax 😃



  • @malfunction: 😃
    du hast was vergessen:
    nop ==

    • mov ax, ax
    • add ax, 0
    • sub ax, 0
    • mul 1
    • div 1
    • idiv 1
    • imul 1
    • and ax, 0FFFFh
    • rol ax, 0
    • ror ax, 0
    • sar ax, 0
    • shl ax, 0
    • shr ax, 0

    btw: die meisten dieser Befehle verändern die Flags.



  • Wie du schon sagtest: die meisten der Befehle, die du aufgefürt hast, verändern die Flags (ich glaube sogar alle außer mov ax,ax). XCHG AX,AX erstellt übrigens wirklich den Opcode 90h, also ein echtes NOP.



  • Hi Jungs!
    Es ist zwar sehr schön wie ihr euch über Assembler unterhaltet.
    Wie gut dass ich mal einst der Jenige war der hier einige Fragen
    gestellt hat und nun aber von dem gar nichts versteht wörüber
    Ihr hier redet. Kann mir vielleicht im Ernst irgendjemand wirklch
    meine Fragen beantworten.
    Weil das hier ist z.B keine Antwort.
    Frage:
    Warum ist E857830000 5 Bytes lang??
    Antwort
    weil es 5byte lang ist.

    Sorry aber ich hätte es mir gleich sparen können. Foren gibt es
    denke ich nicht deswegen damit ein Neuling eine Frage stellt
    und tausend andere nachher über alles diskutieren aber nur über das
    was sie villeicht sollten.
    Grüße
    tauboga



  • deine frage ist so grundsätzlich... die kann man fast garnicht anders beantworten. (das ist etwa wie wenn man frag warum ist 6 mal ein meter 6 meter lang?)
    ich versuche es trozdem:
    E857830000
    ist eine hexadezimaldarstellung. d.h. es wird in einem system zur basis 16 gerechet.
    0f ist dezimal 15
    10 ist 16 und ff also die grösste darstellbare zahl ist 255

    so haben wir von 00 bis FF die 256 möglichen die ein byte annehmen kann.
    alle zwei stellen sind also ein byte.
    E857830000 hat 10 ziffern 10/2=5 byte



  • Super!
    Na also so verstehe ich es ja sogar.
    Vielen Dank mehr will ja garnicht.
    Grüße



  • Sorry, aber es ist manchmal echt schwer, ein Maß für das Wissen des Fragenden zwischen den Zeilen herauszulesen. Wenn man deinen Text liest (ich meine die urprüngliche Frage), kriegt man den Eindruck - wie kingruedi bereits erwähnte - daß du ein Programm Cracken willst, wofür allerdings weit mehr als nur elementare Assembler-Kenntnisse, die u.a. ich voraussetzte, vonnöten sind.



  • Original erstellt von Cocaine:
    Sorry, aber es ist manchmal echt schwer, ein Maß für das Wissen des Fragenden zwischen den Zeilen herauszulesen. Wenn man deinen Text liest (ich meine die urprüngliche Frage), kriegt man den Eindruck - wie kingruedi bereits erwähnte - daß du ein Programm Cracken willst, wofür allerdings weit mehr als nur elementare Assembler-Kenntnisse, die u.a. ich voraussetzte, vonnöten sind.

    genau meine Meinung! Außerdem weiss ich dich (Tauboga) daraufhin, dass es da auch zu einigen rechtlichen Problemen kommen kann! Also lass die Finger davon und lern lieber richtig Assembler, Hexzahlensystem uvm.



  • 😃
    Ich bin auf Asssembler gekommen, indem ich ein Programm das eh niemand kennt gecrackt habe. Ich hatte das Programm vor nem jahr legal gekauft und wollte einfach mal testen ob ich es schaffe es zu cracken.
    Aber danach hab ich es gelassen und versuche mehr oder weniger sinnvolles in Assembler zu schreiben. 😃
    Ich finde man kann schon einiges Lernen wenn man ein Programm crackt. Man sollte den Crack halt nicht öffentlich rumgeben und man sollte das Programm legal besitzen. 🙂
    Naja, etwas mehr Ahnung als Tauboga hatte ich schon. 😉



  • Hi!
    Ich glaube man mißversteht mich. Ich will gar kein Program
    cracken. Das was Ihr hier liest ist ein Crack Tutorial was
    ich zufällig beim Surfen entdeckt habe. Mich interessierte
    nur das Assemblertechnische an dem Ganzen weil ich eben
    einfach verstehen wollte was diese ganze Zahlen sein sollen
    usw. Es ist absolut unwahr das ich ein Program cracken will
    oder so etwas.

    z.B Sachen wie in der hier aufgeführten Zeile unten:
    :004116A4 E857830000 call 00419A00
    Ich meine das FORMAT EINER ASSEMBLER-ZEILE
    :=mache etwas 004116A4=mache etwas E857830000=mache etwas call=mache etwas 00419A00 = mache etwas
    So könnte ich es verstehen.
    Stellt euch mal vor ich bin ein absoluter Anfänger.
    Da stehen ganze Menge von hexadezimale Zahle die wiederrum
    etwas bedeuten und dann wird da was von OPCodes gesagt.
    Ich lediglich einiges über Assembler verstehen und nicht etwas
    cracken.
    Grüße



  • Na gut, dann will ich mal versuchen das zu erklären. Du wirst da wahrscheinlich einen Blick auf einen Disassembler geworfen haben. Schauen wir uns die Zeile '004116A4 E857830000 call 00419A00' mal Stück für Stück an:

    004116A9: Das ist eine Speicheradresse. Vertausche dies nicht mit dem Offset, an dem die Instruktion in der Datei steht! Nachdem Windows die EXE geladen hat, wird die Instruktion an dieser Stelle stehen. Diese Adresse ist übrigens virtuell. Windows kümmert sich schon ums Speichermanagement 😉

    E857830000: Das ist die Instruktion selbst, in Form von Zahlen repräsentiert (nennt sich auch Opcode). Genau diese Zahlenfolge steht irgendwo in der EXE drin.

    call 00419A00: Das ist die Instruktion in Assembler ausgedrückt. Dies ist ein Prozeduraufruf. Die Zahl hinter dem CALL ist die Adresse wo hingesprungen werden soll. Der Disassembler hat hier die absolute Adresse, die wir hier sehen, für uns berechnet. In dem Opcode steht nämlich eine relative Angabe: E857830000. Dies ist nach Intel Reversed Byte Order gespeichert (ich weiß nun nicht mehr ob sich das Little oder Big Endian nennt). Dreht man die einzelnen Bytes um, erhält man: 00008357. Und das ist die Distanz um die gesprungen werden soll. Die neue Adresse, wo der Code ausgeführt wird, ist dann: 004116A9 + 00008357 = 00419A00.

    Ich hoffe mal, das war halbwegs verständlich. Wenn du die CALL Instruktion (oder irgendeine andere) erklärt haben willst, dann solltest du besser ein Assembler Tutorial lesen.

    Ach ja, das NOP steht wirklich für ein XCHG AX,AX und hat den Opcode 90. Diese Instruktion tauscht das AX Register mit dem AX Register aus, macht also faktisch überhaupt nichts.

    [ Dieser Beitrag wurde am 03.06.2002 um 00:31 Uhr von malfunction editiert. ]



  • hm. Also in einem Assembler Quellcode schreibst du natuerlich nicht so viele Zahlen. In einer .asm-Datei wurde das Ganze dann vermutlich so aussehen:
    call IrgendeineProc

    Diese ganzen Zahlen davor setzten einige Debugger und Disassembler zur besseren Uebersicht. Ich versuche jetzt mal diese Zeile zu interpretieren:
    : <- hat hier eigentlich nichts zu bedeuten. einen Doppelpunkt setzt man zwischen Segment und Offset. Segment steht dabei vor dem Doppelpunkt. In Windowsprogrammen wird dieses Segment aber eigentlich nie angegeben, deshalb steht hier vor dem Doppelpunkt nichts. Das Segment kannst du dir in diesem Zusammenhang als eine ID-Nummer des gesamten Speichers vorstellen, in dem der ausfuehrbare code liegt. Der Daten-Speicher (fuer Bilder sounds usw) des Programms hat dann wahrscheinlich eine andere solche ID-Nummer...

    004116A4 <-die Addresse, an der diese Zeile im Speicher liegt. Vereinfacht liegt diese Zeile also beim 004116A4.(hex) byte im Speicher. Diese Speicheraddresse wird auch Offset genannt.

    E857830000 <- Der Opcode fuer das, was hinter dieser zahl steht. (also call...) Diese Zahl ist also sozusagen die ID dieses Befehls

    call 00419A00 <- Der Befehl selbst. Hier wird an Addresse 00419A00 gesprungen. Dort wird dann das Programm weiter ausgefuehrt, also der code, der an Addresse 00419A00 und dahinter steht.

    Hoffe das war verstaendlich, sonst bitte nochmal fragen 😉



  • Hi!
    Malfunction vielen Dank für deine freundlichen Bemühungen.
    Ich habe es jetzt wriklich in der Tat besser kapiert.
    Könnstest du mir vielleicht sagen woher ich so eine
    Opcode Liste beziehen kann. Und steht dann wirklich hier auch
    nachher drin NOP = 90h usw oder muss man hier wieder etwas berechnen?
    Grüße



  • In der Opcode-Liste steht entweder direkt nop oder xchg eax, eax (= tausche eax mit eax was ja nunmal nichtstun ist :)) oder beides 🙂



  • Wie TriPhoenix schon sagte: In einer Opcode Liste stehen nicht die komplette Instruktionen drin. Dort sind meist nur die eigentlichen Opcodes drin, die Bytes, die die benutzen Register/Speicheradressen und ähnliches angeben, sind dort nicht aufgeführt. Wirf doch mal einen Blick auf: http://www.c-plusplus.net/ubb/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=17&t=000397


Anmelden zum Antworten