arg_4 rückwertsrechnen..



  • in der Zeile mov esi,[ebp+arg_4]
    nächste Zeile push edi

    ich habe einen breakpoint in der erste Zeile gesetzt und in der nächsten.

    1. breakpoint: esi:10184 ebp 8078f49c---zeigt auf--->>807d1bc0
      2.breakpoint: esi: 10ff0 ebp 8078f49c---zeigt auf--->>8078f4e8

    wenn ich das gegenrechne kommt eine riessen Zahl raus, das kann nicht sein, was mache ich falsch?

    wie berechne ich arg_4 ?



  • ich weiß nicht was du da rechnen willst.



  • thx,
    die Rechnung sieht doch so aus:
    esi = ebp + arg_4 // so sieht der Original Code aus.

    Jetzt will ich wissen was für ein Wert arg_4 ist.
    arg_4 = esi - ebp
    esi(10ff0) -ebp( 8078f49c) = komischenr Wert ,kann nicht sein.
    esi(10ff0) -ebp_poi(8078f4e8) = komischenr Wert, kann nicht sein.

    Mit windbg kann man... esi ebp eax ebx ecx edx ... ausgeben lassen aber nicht arg_4
    Desweben wenn ich den Wert nachträglich berechnen.
    Du verstehst mich?



  • esi = ebp + arg_4 // so sieht der Original Code aus.

    Echt? Eben war's noch mov esi,[ebp+arg_4].

    Und es ergibt keinen Sinn, arg_4 ausrechnen zu wollen.



  • Genau, denn dies ist eine Dereferenzierung, d.h. es entspricht

    esi = *(ebp+arg_4);
    


  • @Bashar,
    es gibt einen Sinn, weil ich die Funktion verstehen möchte und ohne zuwissen was arg_4 ist, kann ich nicht weiterarbeiten.

    @Th69,
    ok, aber was mache ich falsch bei der Berechnung? Ich weis was ebp und esi ist, aber wenn ich den einen Wert vom anderen abziehe kommt Käse raus.



  • Hast du nicht mal das Wort Dereferenzierung verstanden?



  • @tomycat2009 sagte in arg_4 rückwertsrechnen..:

    @Bashar,
    es gibt einen Sinn, weil ich die Funktion verstehen möchte und ohne zuwissen was arg_4 ist, kann ich nicht weiterarbeiten.

    arg_4 ist eine Konstante, die muss im Programm irgendwo definiert sein.



  • @Mechanics ,
    ja das stimmt, ich habe mich noch nicht gekümmert, weil ich erstmal die Werte brauche mit denen ich rechnen muss. Ich sattel gerne das Pferd von hinten auf. Werde aber gleich danach googlen. 🙂

    @Bashar
    arg_4 ist eine Konstante, das ist richtig. Ich würde die gerne abgreifen, aber windbg kommt zu crash. Das ist der Grund warum ich die 2 Werte abgreifen möchte und danach den Wert von arg_4 berechnen will. Aber ich lasse mich gerne von einem besserem belehren.

    Das geht mit eax...
    bp meineFunktion + 0x5 ".printf "\tAusgabe: %p\n",eax;g;"

    Das geht leider nicht 🙂
    bp meineFunktion + 0x5 ".printf "\tAusgabe: %p\n",arg_4;g;"



  • @tomycat2009 sagte in arg_4 rückwertsrechnen..:

    danach den Wert von arg_4 berechnen will

    Bitte, was immer Du da machst. Lass den Schmarrn und lern assembler wenn Du assembler lernen willst.



  • @tomycat2009 sagte in arg_4 rückwertsrechnen..:

    ja das stimmt, ich habe mich noch nicht gekümmert, weil ich erstmal die Werte brauche mit denen ich rechnen muss.

    Das wird nicht funktionieren, bis du das verstanden hast 😉
    Tipp: die eckigen Klammern sind nicht zum Spass da, sie haben eine Bedeutung.



  • @tomycat2009 sagte in arg_4 rückwertsrechnen..:

    @Bashar
    arg_4 ist eine Konstante, das ist richtig. Ich würde die gerne abgreifen, aber windbg kommt zu crash. Das ist der Grund warum ich die 2 Werte abgreifen möchte und danach den Wert von arg_4 berechnen will. Aber ich lasse mich gerne von einem besserem belehren.

    Man kann die nicht "abgreifen". Das ist eigentlich nicht schwer zu verstehen, ich kann mir das hier nur so erklären, dass du dich mit irgendwelchen Tools in irgendwas reinstürzt, ohne die Grundlagen halbwegs verstanden zu haben. Da ich deine Tools nicht kenne, kann ich dir nicht sagen, wie du herausfindest, was arg_4 ist. In deinem anderen Thread über IDA stand das einfach drüber: var_8 = dword ptr -8. Jetzt machst du anscheinend was anderes, aber was? WinDbg? Wusste gar nicht dass das sowas kann... Vielleicht ist arg_4 ja einfach +4?



  • Ich nehme IDA Free um mir eine Übersicht mit Diagramme zubekommen. Mit Windbg verbinde ich mich Win 7. Dann setzte meine breakpoint´s und lese die Werte aus. Hat bisher gut geklappt.

    Ein ASM Buch habe ich gelesen und zu 90 % verstanden. Über die Eckige Klammer habe ich nichts gefunden. Google sagt, das hat mit dem Intel Sytax zu tun.

    Nach IDA Free wird:
    arg_4= dword ptr 0Ch
    zugeordnet. Ich will vom Prinzip her wissen welche Werte die Funkiton bekommt, bzw Parameter.
    Befehle wie mov push sub... sind mir klar, notfalls kann ich die Nachschlagen.

    Gerade habe ich ein Video mit Dereferenzierung angeschaut.
    Jetzt wurde mir Das Thema Zeiger klarer.



  • @tomycat2009 sagte in arg_4 rückwertsrechnen..:

    Ich will vom Prinzip her wissen welche Werte die Funkiton bekommt

    Dann schau auf den Stack. SP-4, SP-8, SP-12 ... Dein arg_4 liegt bei SP-0x0c (SP-12), aber das habe ich Dir im anderen Thread schon gesagt.



  • @tomycat2009 sagte in arg_4 rückwertsrechnen..:

    Ein ASM Buch habe ich gelesen und zu 90 % verstanden. Über die Eckige Klammer habe ich nichts gefunden. Google sagt, das hat mit dem Intel Sytax zu tun.

    Das Buch benutzt doch sicher auch Intel-Syntax? Wie dem auch sei, wenn du 90% von dem Buch verstanden hast, hast du auch indirekte Adressierung verstanden. Oder es ist ein seeeeeehr schlechtes Buch.

    Nach IDA Free wird:
    arg_4= dword ptr 0Ch

    Wunderbar, Frage beantwortet.

    zugeordnet. Ich will vom Prinzip her wissen welche Werte die Funkiton bekommt, bzw Parameter.

    Hier muss ich Swordfish widersprechen. Du musst an der Speicherstelle, die durch ebp+0x0c adressiert wird, nachgucken.

    Wobei es da viele Konventionen gibt... es kann auch rbp sein in 64-bit Code, es kann auch tatsächlich über den Stackpointer esp gehen. Weiß man nicht. Hier steht im Programm vielleicht irgendwo tatsächlich ein Zugriff auf [ebp+0x0c], und deshalb rät IDA, dass das ein Argument ist. Ich weiß nicht, wie es das macht.

    Gerade habe ich ein Video mit Dereferenzierung angeschaut.
    Jetzt wurde mir Das Thema Zeiger klarer.

    Hmja, kann nicht schaden ein bisschen was von C zu verstehen.



  • @Bashar sagte in arg_4 rückwertsrechnen..:

    Hier muss ich Swordfish widersprechen. Du musst an der Speicherstelle, die durch ebp+0x0c adressiert wird, nachgucken.

    Ich meinte den Wert von arg_4 selbst, nicht das was dann durch [ebp+arg_4] adressiert wird.



  • Versteh ich nicht. Der Wert von arg_4 ist 0x0C, wozu das mit dem SP, was hat SP-0x0C damit zu tun?



  • @Bashar Dann habe ich IDA und die Anzeige falsch verstanden. Kann auch gut sein.



  • Es kann ja auch sein, dass ich es falsch verstehe, ich kenn ja IDA nicht näher, allerdings ergibt es doch auch nur so Sinn, oder? 🙂



  • thx all,
    ok klingt ihrgendwie logisch,
    Im ersten Block der Funktion wird als erstes...

    arg_0 dword ptr 8
    arg_4 dword ptr 0Ch
    arg_8 dword ptr 10h

    ... angelegt, sprich einfach auf den Stafel geschissen. mit esp -0Ch sehe ich arg_4. usw

    Aber die Klammer macht mir noch Kummer 😞
    mov esi, [ebp+arg_4]

    Zitat aus Assembler Lowlevel:
    Speicherzugriffe werden mit eckigen Klammern angedeutet. <asm>mov ax, [ebp] ; lädt ein word (2 Byte Zahl) von der Adresse in ebp nach ax
    Zitat Ende

    ebp Adresse + arg_4 Adresse wird Addiert?! ähhh Das macht doch keinen Sinn?



  • @tomycat2009 sagte in arg_4 rückwertsrechnen..:

    ebp Adresse + arg_4 Adresse wird Addiert?! ähhh Das macht doch keinen Sinn?

    Stell dir vor, du hast dein Lager ("Basislager") im Wald bei der 17. Tanne aufgeschlagen. Deine Freundin wohnt eine Tanne weiter, Tanne 18 - und ihre Eltern wohnen noch ein Tanne weiter, also an der 19. Tanne. Eines Tages beschließt ihr umzuziehen, aber eure generelle Wohnsituation soll gleich bleiben, d.h. deine Freundin soll weiterhin 1 Tanne weiter entfernt wohnen und ihre Eltern noch eine Tanne weiter weg.
    Wenn nun Fremde die Eltern deiner Freundin besuchen wollen, müssen sie erst wissen, wo du dein Basislager aufgeschlagen hast und dann einfach 2 Tannen weiter gehen.
    So ist das hier auch. Bei jedem Funktionsaufruf verlegt ihr das Basislager. Aber die Distanz untereinander bleibt gleich. arg_Freundin=1 ist einfach nur die Distanz vom "Basislager" ebp zu deiner Freundin und arg_Eltern_der_Freundin=2 ist auch fest. Daher sind die Arg_x-Zahlen hier auch so klein, die Daten liegen nur "etwas" neben dem Basislager, welches selbst "irgendwo" im Wald liegt.

    Dein Ursprungsvorhaben scheitert, weil du nun aus den Eigenschaften deiner Freundin (wie z.B. Haarfarbe) und der Lagerposition die Distanz zu dir berechnen willst. Die Distanz hat damit aber nichts zu tun.

    PS: mal einen Waldvergleich gewählt, da Autovergleiche ja immer hinken 😉


Anmelden zum Antworten