[ twister @ 16.08.2001. 01:28 ] @
Tema je prilicno glupo formulisana... drugi pokusaj:
Kako da saznam offset na kom pocinje odredjena funkcija u nekom .dll-u?
[ tweeester @ 16.08.2001. 08:48 ] @
Jesi li probao da uradis nesto sa "dumpbin.exe" ??? Mislim da s njim mozes da vidis exportovane funkcije. Isto to mozes da uradis iz C-a samo ako malo pogledas definiciju PE (Portable Executable) formata koji se koristi pod Windows-om.
[ kajla @ 16.08.2001. 18:10 ] @
O ovo me je bilo reci bas na ovom forumu pogledaj temu MessageBoxA in user32.dll, Znaci to radis sa LoadLibrary() pa onda sa GetProcAddress(). Evo jedan program koji sam ja sam ja preradio bas za to:
Code:

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    // initialize MFC and print and error on failure
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
        // TODO: change error code to suit your needs
        cerr << _T("Fatal Error: MFC initialization failed") << endl;
        nRetCode = 1;
    }
    else
    {
        // TODO: code your application's behavior here.
        bool we_loaded_it = false;
        HINSTANCE h;
        FARPROC func;            
        char dllname[254];
        char funcname[254];
        printf("Upisi ime biblioteke: ");
        gets(dllname);
        printf("Upisi ime funkcije: ");
        gets(funcname);
        h = GetModuleHandle((LPCSTR)dllname);    
        if(h == NULL)            
        {
            h = LoadLibrary((LPCSTR)dllname);    
            if(h == NULL)
            {
                fprintf(stderr,"Cannot open library "%s"",
                        dllname);
                exit(1);
            }
            we_loaded_it = true;    
        }

        func = GetProcAddress(h,(LPCSTR)funcname);     

        cout<<funcname<<"() found at 0x"<<func<<" ("<<dllname<<".dll)"<<endl;
        if (we_loaded_it) FreeLibrary(h);    
    }
    getchar();
    return nRetCode;
}


poz.
[ kajla @ 16.08.2001. 20:07 ] @
Zaboravih da kazem, ako oces ofset onda treba da oduzmes modul handle tj. povratnu vrednost funkcije LoadLibrary() odnosno GetModulHandle().

poz.
[ tOwk @ 17.08.2001. 01:27 ] @
kajla> GetProcAddress moze da vrati samo adresu u memoriji, a meni se cini da je pitanje bilo u vezi sa mestom funkcije u fajlu.

Prema tome, potrebno je pronaci dokumentaciju za DLL fajlove, ili koristiti program kao sto je objdump (uz GCC). Naravno, moze se uzeti i source objdump-a i videti kako se to radi (mislim da je objdump u okviru binutils, a ne GCC, ali ko uzme jedno, uglavnom uzme i drugo).

Toliko.
[ kajla @ 17.08.2001. 10:43 ] @
Pa recimo ako GetProcAddress() vrati vrednost BFF5412e u user32.dll, a recimo ovaj .dll pocinje od lokacije BFF00000 u memoriji. Oduzmes ova dva broja i dobijes 5412e sto bi trebalo da bude ofset. (mozda gresim ali mi se to cini logicno)

poz.
[ kajla @ 18.08.2001. 12:38 ] @
Zaboravih da kazem...uvek mozes da disassemblujes .dll file pa da vidis ofset.

poz.
[ tOwk @ 19.08.2001. 14:01 ] @
Citat:
kajla je napisao:
Pa recimo ako GetProcAddress() vrati vrednost BFF5412e u user32.dll, a recimo ovaj .dll pocinje od lokacije BFF00000 u memoriji. Oduzmes ova dva broja i dobijes 5412e sto bi trebalo da bude ofset. (mozda gresim ali mi se to cini logicno)

poz.


Pa moguce je da je tako, ali moram da izrazim sumnje u vezi toga. Kao prvo, pitanje je da li se na taj nacin ucitava DLL u memoriju. A kao drugo, i jos vaznije, sumnjam da sam DLL fajl ima takve karakteristike koje mu omogucavaju da se koristi kao zapis i na disku i u memoriji.

Ali, naravno, moguce je da si u pravu, ali koliko vidim, niko od nas nije siguran u to, pa ko proba, neka izvesti.

Toliko.
[ kajla @ 19.08.2001. 16:59 ] @
Citat:
tOwk je napisao:
Citat:
kajla je napisao:
Pa recimo ako GetProcAddress() vrati vrednost BFF5412e u user32.dll, a recimo ovaj .dll pocinje od lokacije BFF00000 u memoriji. Oduzmes ova dva broja i dobijes 5412e sto bi trebalo da bude ofset. (mozda gresim ali mi se to cini logicno)

poz.


Pa moguce je da je tako, ali moram da izrazim sumnje u vezi toga. Kao prvo, pitanje je da li se na taj nacin ucitava DLL u memoriju. A kao drugo, i jos vaznije, sumnjam da sam DLL fajl ima takve karakteristike koje mu omogucavaju da se koristi kao zapis i na disku i u memoriji.

Ali, naravno, moguce je da si u pravu, ali koliko vidim, niko od nas nije siguran u to, pa ko proba, neka izvesti.

Toliko.

Evo ja cu sad da probam...disassemblovacu file i zapisacu offset proizvoljne funkcije...zatim cu isto da isprobam sa softice (uzmem lokaciju u memoriji iste funkcije zatim oduzmem lokaciju od koje se prostire .dll file)...

poz.
[ Vojislav Milunovic @ 19.08.2001. 17:33 ] @
A sto svi kazu sacu da uradim ;o) Niko ne kaze sta je uradio ;o)
[ kajla @ 19.08.2001. 20:51 ] @
Evo ja sam probao ispalo je da moze onako. Evo sta sam uradio:
Disassemblovao sam user32.dll i video offset za funkciju WinHelpA(),
kod mene je to 0x11c4, zatim sam sa GetProcAddress() (sa gore
pomenutim C programom) video adresu u memoriji za WinHelpA() kod mene
je to 0xbff511c4, posto se user32.dll pocinje od lokacije
0xbff50000 u memoriji, oduzeo sam 0xbff511c4-bff50000
i rezultat je 0x11c4 sto je ustvari tacno.

poz.

PS. predatore samo malo strpljenja...
[ Vojislav Milunovic @ 19.08.2001. 23:15 ] @
p.s. ma ok bre ;o) normalno da je ovo ok...to cak prolazi i na UNIXu sa ELF.jel se program segment ucitava od pocetka pa se i procedure u okviru program (CODE,text) segmenta nalaze na adresi od
trenutna_adresa_procedure - adresa_pocetka_segmenta == offset_procedure_file