arg_4 rückwertsrechnen..



  • @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 😉



  • thx,
    [ebp + arg_4] ist gleichzusetzen mit [ebp + 4], wenn die arg_4 4 Byte groß ist. Es geht nur um den Speicherort, mehr nicht? Ist das so, dann habe ich es verstanden. :--)



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

    [ebp + arg_4] ist gleichzusetzen mit [ebp + 4], wenn die arg_4 4 Byte groß ist. Es geht nur um den Speicherort, mehr nicht? Ist das so, dann habe ich es verstanden. :--)

    Naja, es ist gleichzusetzen mit [ebp+12], weil 12 bzw. 0x0C nunmal der Wert von arg_4 ist. Die Größe stammt aus dem dword ptr und ... die Größe ist etwas anderers als der Speicherort.


Log in to reply