Du kan ringe en funksjon til hvilken som helst adresse. Så last inn det dynamiske biblioteket i prosessadresseområdet, finn ut basen til det nylig lastede biblioteket og ta forskyvningen fra bunnen av biblioteket til funksjonen du ikke vil ringe og legg det sammen.
Så hvis IDA sier at basen til binærfilen er 0x4000
og funksjonen din er på adressen 0x4100
, så har du en forskyvning på 0x100
. Så hvis du laster inn biblioteket ditt, blir det lastet inn ved adresse 0x8000
, lager du en funksjonspeker (med riktig signatur selvfølgelig) som peker på adresse 0x8000 + 0x100
og ringer den. Avhengig av plattformen din, kan basen du får for det dynamiske biblioteket ditt fra plattformlasteren bli ytterligere forskjøvet fra den faktiske basen som IDA viser.
Et annet alternativ er selvfølgelig å legge til en ny eksportdefinisjon for sub_xxx () -funksjon til det dynamiske biblioteket og å ha lasteren til å håndtere eventuelle flyttinger. Det vil være langt mer pålitelig, og la deg gi funksjonen noe sunt, slik at du kan håndtere fremtidige oppdateringer til biblioteket der funksjonsadressen endres, ganske enkelt ved å legge den nye eksporten til den nye versjonen på nytt. Bruk noe sånt som BinDiff for å finne den nye plasseringen av funksjonen.
Det tredje populære alternativet er å bruke noe som ligner IDAs FLIRT signaturer for å skann det lastede dynamiske biblioteket for funksjonen direkte i minnet. Det kalles vanligvis signaturskanning og her er en grundigere forklaring av konseptet på Windows-plattformen. Veldig forenklet, det er en teknikk for å finne en funksjon basert på mønster hentet fra funksjonsprologen.
I ditt tilfelle styrer du applikasjonen fra det jeg kan se og vil ringe til et dynamisk bibliotek du ikke har kilden til. I så fall vil jeg sannsynligvis gå med det andre alternativet eller det første hvis du vet at biblioteket aldri vil endres.