Funktions-Addresse, addieren, dividieren, Run-Time



  • Hiho Leute,
    platform: c++, vista x64,vs2008
    bräuchte dringend hilfe 😃

    zum Problem:
    ich will mit VirtualAllocEx Speicher reservieren.
    dieser Speicher muss so groß sein wie der Bereich zwischen 2 Funktionen, z.b Funktion1 , Funktion2:
    ich versuche schon 3h, irgendwie aus diesen verdammten Funktionen-Addressen normale int32 zu machen, NO CHANCE!
    der verdammte compiler nimmt für jügliche zuweisung der Funktions-Addresse einfach das offset vom jmp table.....was ja falsch ist,

    ich habe ein makro von Petriek:
    #define MakePtr( cast, ptr, addValue ) (cast)( (DWORD_PTR)(ptr) + (DWORD_PTR)(addValue))
    dies funktioniert aber nur in C nicht C++, zumindest nicht bei mir....

    ich weiß nicht was ich flasche mache.... versucht schon seit 3h den compiler austricksen, irgendwie ohne erfolg.... jegliche zuweisung endet mit einem offset.... egal ob cast nach TYPE*,TYPE........

    hat jmd ne idee?????
    vielen dank für eure hilfe!!!!!

    edit: sogar reinterpret_cast bau shice.....
    edit: nur im dbg modus baut geht über jmp table, nicht im release ? vllt jmd noch ne möglichkeit dass im dbg modus abzuschalten???



  • ich weiß nicht was ich flasche mache

    😃

    habe auch vista, c++ und vc2008 und das gleiche problem:

    vc legt vor dem code eine art "jumptable" an die ungefähr so aussieht:

    ...
    04000000  jmp function1(04567EFh)
    04000004  jmp function2(0654352h)
    ....
    

    die addresse der funktion, also das was der cast ausspuckt ist ein zeiger in
    diese tabelle. dieses blöde verhalten macht den code sicherer, aber auch
    schwerer den funktionscode zu bekommen (CreateRemoteThread).

    eine wirkliche lösung hab ich noch nicht, da bei mir im release modus alles
    wieder auf die funktion zeigt. 😡

    int getrightaddr(void *fp)
    {
        return *reinterpret_cast<int *>(reinterpret_cast<char>(fp) + 1);
    }
    

    damit hol ich mir das sprungziel was hinter dem jump befehl steht.
    allerdings kann es sein (bei mir wars so) das die reihenfolge sich ändert,
    sprich die "afterfunc" steht in der tabelle nach der ersten funktion.
    was man machen kann ist eine dll mit den funktionen und mit GetProcAddress
    die wahren addressen holen.

    MfG helferlein(mitleidender)



  • edit:

    du willst nicht zufällig das SAS-window handle holen? 😃

    wenn du virtualallocex nimmst allocier einfach ein kb oder mehr das muss ja nur reinpassen und nicht speichersparen. da die funktion sowieso auf die nächste page aufrundet



  • int getrightaddr(void *fp)
    {
        return *reinterpret_cast<int *>(reinterpret_cast<char>(fp) + 1);
    }
    

    aber nichtmal der code, bringt irgendwie etwas.... komisch ?

    damit hol ich mir das sprungziel was hinter dem jump befehl steht.
    allerdings kann es sein (bei mir wars so) das die reihenfolge sich ändert,
    sprich die "afterfunc" steht in der tabelle nach der ersten funktion.
    was man machen kann ist eine dll mit den funktionen und mit GetProcAddress
    die wahren addressen holen.

    MfG helferlein(mitleidender)[/quote]

    heho, vielen dank DIR!
    scheinbar keine ""schnelle"" lösung......
    ehrlich gesagt einfach nur zum ****** 😡.........

    aber nochmals vielen dank, an ne dll hät ich auch schon gedacht, aber naja ist ja net wirklich komfortabel 😃

    jmd vllt ne alternative um den compiler "auszutricksen"???

    edit: zum SAS, nee...... 🙂



  • falls der thread noch aktuell ist, mit

    static
    

    vor den funktionen klappt alles so wie es soll, im release und im debug


Anmelden zum Antworten