Czy ktoś może mi wyjaśnić, jak poznać konwencję wywołania biblioteki DLL bez pobierania i przetwarzania nazw metod? Powiedzmy, że nasza aplikacja ładuje dll strony trzeciej i aby sobie z tym poradzić, czy istnieją skuteczne sposoby na poznanie konwencji wywołania biblioteki DLL? (__stdcall, __cdecl, __fastcall)Jak znaleźć konwencję wywołania biblioteki DLL innej firmy?
17
A
Odpowiedz
23
Jeśli symbol zaczyna się od _
, ale nie ma @
, to jest __cdecl
. Jeśli zaczyna się od _
i ma @
, to jest __stdcall
. Jeśli zaczyna się od @
i ma inną @
, jest to __fastcall
.
1
Starając się zrozumieć, dlaczego byłem coraz symbole nierozwiązanych podczas łączenia przed dll trzecich natknąłem się (w pewnym sensie) rozwiązania programowe.
napisałem mały program przeciwko API Windows przy użyciu UnDecorateSymbolName
z Dbghelp.h
zdekodować schemat maglowania:
#include "Windows.h"
#include "Dbghelp.h"
#include "tchar.h"
int _tmain(int argc, _TCHAR* argv[])
{
CHAR out[512];
UnDecorateSymbolName(
// Mangled symbol
"[email protected]@[email protected]@[email protected]@XZ",
out,
// Length of symbol
46,
UNDNAME_32_BIT_DECODE);
}
Są zdecydowanie ładniejsze sposobów, aby to zrobić. Po prostu uruchamiam go w debugerze i sprawdzam jego zawartość.
Warto również zauważyć, w przeciwieństwie do odpowiedzi Ignacio jest różnica między zniekształconych nazw dla cdecl
metod w DLL i metod stdcall
poszukiwane był YAAAV
vs. YGAAV
.
Powiązane problemy
- 1. Odsyłacz do biblioteki DLL z innej biblioteki DLL
- 2. Strategia tworzenia interfejsów implementacji biblioteki innej firmy?
- 3. Najlepszy sposób na integrację biblioteki innej firmy w studiu Android
- 4. Ostrzeżenie: Nie można znaleźć biblioteki dll
- 5. Kod innej firmy i Git
- 6. Jak znaleźć klucz PublicKeyToken dla określonej biblioteki dll?
- 7. Określanie katalogu instalacji aplikacji innej firmy
- 8. Jak dodać manifest do biblioteki .NET DLL?
- 9. Wyśmiewanie biblioteki Microsoft DLL
- 10. ObjC: Jak skompilować bibliotekę statyczną, która zawiera opcjonalne klasy zależne od biblioteki innej firmy
- 11. C#: Jak radzić sobie z wyjątkami finalizera z biblioteki innej firmy?
- 12. Regsvr32 nie może znaleźć biblioteki dll w bieżącym folderze
- 13. C++ podłączenie biblioteki DLL?
- 14. Aktualizacja biblioteki DLL
- 15. funkcja z jednego dll wywołującego tę samą funkcję nazwy innej biblioteki dll
- 16. SQLite.Interop.DLL Jak używać nie zarządzanego biblioteki DLL
- 17. Jak znaleźć wywołania procedur składowanych?
- 18. Jak serializować obiekt + skompresować go, a następnie rozpakować + deserializować bez biblioteki innej firmy?
- 19. Używanie biblioteki DLL Delphi w C#
- 20. sprawdzanie autentyczności Androida na serwerze innej firmy
- 21. Uwierzytelnianie Symfony2 przez REST API innej firmy
- 22. Przesłanianie/rozszerzanie szablonu komponentu innej firmy
- 23. Importowanie frameworka innej firmy w "SupportCode.swift" Playground
- 24. Wywołanie metody VB6 z biblioteki .NET DLL
- 25. Jak mogę uzyskać HINSTANCE z biblioteki DLL?
- 26. jak korzystać z ILspy debugowania biblioteki dll?
- 27. Jak wyeksportować klasę C++ z biblioteki dll?
- 28. Krojenie klasy obsługi biblioteki DLL
- 29. jak określić konwencję wywoływania lambda vc11
- 30. Zdebuguj błędny błąd wywoływania biblioteki DLL
Bardzo dziękuję Ignacio Vazquez-Abrams. Czy istnieje inny skuteczny sposób, aby to sprawdzić? czy są jakieś funkcje biblioteczne, aby uzyskać konwencję wywoływania? – RoboAlex
Zakłada to oczywiście, że biblioteka DLL została skompilowana przez MSVC, o czym wspomina artykuł na wstępie. Zakłada się także, że nie ma pliku DEF. Po prostu spróbuj znaleźć konwencję wywołania używaną przez USER32.DLL za pomocą tej metody - nie działa. – MSalters