Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Wrapper DLL, własny log danych

Ostatnio zmodyfikowano 2020-01-10 21:20
Autor Wiadomość
luki743
Temat założony przez niniejszego użytkownika
[C++] Wrapper DLL, własny log danych
» 2020-01-09 15:26:24
Witam

Mam pewną aplikacje która łączy się z biblioteką DLL i wykonuje operacje.
Postanowiłem zrobić "wrappera" który udaje tą bibliotekę i łączy się z oryginalną. W celu prześledzenia jej działania.

Projekt wygląda tak:

wrapper.cpp:
C/C++
HINSTANCE mHinst = 0, mHinstDLL = 0;
extern "C" UINT_PTR mProcs[ 14 ] = { 0 };

BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved ) {
    mHinst = hinstDLL;
    if( fdwReason == DLL_PROCESS_ATTACH ) {
       
        mHinstDLL = LoadLibrary( "ORIGINAL.dll" );
        if( !mHinstDLL )
             return( FALSE );
       
        mProcs[ 0 ] =( UINT_PTR ) GetProcAddress( mHinstDLL, "Open" );
       
    } else if( fdwReason == DLL_PROCESS_DETACH ) {
       
        FreeLibrary( mHinstDLL );
       
    }
    return( TRUE );
}

extern "C"
{
    void Open_wrapper();
   
    void testLog( string logMsg ) {
        string filePath = "log.txt";
        ofstream ofs( filePath.c_str(), std::ios_base::out | std::ios_base::app );
        ofs << '\t' << logMsg << '\n';
        ofs.close();
    }
   
    void Open() {
        Open_wrapper();
       
        // testLog("Open");
    }
}

wrapper.def:
C/C++
LIBRARY wrapper.dll
EXPORTS
Open = Open @ 1

wrapper.asm:
C/C++
.code
extern mProcs: QWORD
Open_wrapper proc
jmp mProcs[ 0 * 8 ]
Open_wrapper endp

Biblioteka działa ok. Aplikacja wykonuje poprawnie czynności. Jednak gdy dodam do metody "Open" linijkę:
testLog( "Open" );
która zapisuje do pliku informacje - aplikacja przestaje działać.

- Projekt kompiluje się poprawnie
- Po załadowaniu wrapper.DLL do oryginalnego programu nie wywala błędu
- Plik log.txt zostaje utworzony
- Aplikacja która łączy się z moim wrapperem wywala swój wewnętrzny błąd

Co to może być? Tak jakbym blokował bibliotekę najprostszym kodem. Bez niego wszystko działa ok
P-175999
pekfos
» 2020-01-09 17:29:53
Sprawdzałeś zgodność ABI oryginalnego Open() z nowym? Open_wrapper() musi mieć taką samą deklarację, jak Open(), wliczając w to konwencję wywołania. Zobacz pod debuggerem co dokładnie się dzieje.
P-176000
luki743
Temat założony przez niniejszego użytkownika
» 2020-01-10 20:36:12
da się debugować DLL nie mając źródła projektu aplikacji w której jest wykorzystywana?
P-176008
pekfos
» 2020-01-10 21:20:17
Kod to tylko ułatwienie do debugowania, nie warunek konieczny. Na pewno będzie prościej, jakby udało się odtworzyć problem na aplikacji, do której masz źródła. W tym celu, lub jeśli się nie uda, możesz użyć nawet zwykłego GDB. Tematyka RE jest niezgodna z regulaminem, więc w większe szczegóły nie będę wchodzić.
P-176009
« 1 »
  Strona 1 z 1