VB 5/6-Tipp 0710: Symbolnamen dekodieren
von Dario
Beschreibung
Symbolnamen, wie sie z.B. aus DLLs exportiert werden, liegen nicht in Klartext vor, sondern sind speziell kodiert. Mit ein paar Aufrufen der Win32-API lassen sich diese jedoch leicht in die
ursprüngliche Form als C-Header umwandeln.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: GetCurrentProcess, SymInitialize, SymSetOptions, UnDecorateSymbolName | Download: |
'Dieser Quellcode stammt von http://www.activevb.de 'und kann frei verwendet werden. Für eventuelle Schäden 'wird nicht gehaftet. 'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. 'Ansonsten viel Spaß und Erfolg mit diesem Source! '------------- Anfang Projektdatei Projekt1.vbp ------------- '--------- Anfang Formular "Form1" alias Form1.frm --------- ' Steuerelement: Schaltfläche "cmdDecode" ' Steuerelement: Rahmensteuerelement "Frame1" ' Steuerelement: Textfeld "txtHeader" auf Frame1 ' Steuerelement: Kombinationsliste "cboDecSymbol" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label2" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label1" auf Frame1 ' Steuerelement: Beschriftungsfeld "lblResult" ' Steuerelement: Beschriftungsfeld "Label3" Option Explicit Private Sub cmdDecode_Click() Dim DecSymbolName As String ' "Dekorierter" Symbolname Dim PureSymbol As String ' Dekodierter Name Dim Result As Boolean ' Ergebnis DecSymbolName = cboDecSymbol.Text If DecSymbolName <> "" Then Result = mdlSymbols.DecodeSymbolName(DecSymbolName, PureSymbol) lblResult = IIf(Result, "Aufruf erfolgreich", "Fehler") txtHeader.Text = PureSymbol Else lblResult = "Fehler: Leerer String" End If End Sub Private Sub Form_Initialize() Call mdlSymbols.Initialize Call InitializeCombo End Sub Private Sub InitializeCombo() With cboDecSymbol .AddItem "?MeineFunktion@@YIPAIQBDAAHP6GXAAPBQAUHWND__@@P6APAOI@Z@Z@Z" .AddItem "?Main@@YAHXZ" End With End Sub Private Sub Form_Unload(Cancel As Integer) Call mdlSymbols.Shutdown End Sub '---------- Ende Formular "Form1" alias Form1.frm ---------- '------ Anfang Modul "mdlSymbols" alias mdlSymbols.bas ------ Option Explicit ' API-Funktionen Public Declare Function UnDecorateSymbolName Lib "dbghelp.dll" ( _ ByVal DecoratedName As String, _ ByVal UnDecoratedName As String, _ ByVal UndecoratedLength As Long, _ ByVal Flags As Long) As Long Public Declare Function SymInitialize Lib "dbghelp.dll" ( _ ByVal hProcess As Long, _ ByVal UserSearchPath As String, _ ByVal fInvadeProcess As Long) As Long Public Declare Function SymSetOptions Lib "dbghelp.dll" ( _ ByVal SymOptions As Long) As Long Public Declare Function GetCurrentProcess Lib "kernel32.dll" () As Long ' Konstanten Global Const SYMOPT_UNDNAME As Long = &H2 Global Const SYMOPT_DEFERRED_LOADS As Long = &H4 ' Vorherige Optionen Private PrevOptions As Long ' Handler initialisieren Public Sub Initialize() Dim hProcess As Long ' Unser Prozess ' Optionen setzen und alte Einstellungen sichern PrevOptions = SymSetOptions(SYMOPT_UNDNAME Or SYMOPT_DEFERRED_LOADS) ' Unseren Prozesshandle abfragen hProcess = GetCurrentProcess() ' Symbolhandler initialisieren Call SymInitialize(hProcess, 0&, 1) End Sub ' Vorherige Optionen wiederherstellen Public Sub Shutdown() Call SymSetOptions(PrevOptions) End Sub ' Symbolnamen dekodieren Function DecodeSymbolName(ByVal DecoratedSymbolName As String, ByRef Buffer As String) As Boolean Dim RetVal As Long ' Ergebnis der Funktion Buffer = Space(1024) ' Speicher reservieren ' Funktion aufrufen (Referenz!) RetVal = UnDecorateSymbolName(DecoratedSymbolName, Buffer, 1024, 0&) ' Status der Funktion DecodeSymbolName = (RetVal <> 0) End Function '------- Ende Modul "mdlSymbols" alias mdlSymbols.bas ------- '-------------- Ende Projektdatei Projekt1.vbp --------------
Tipp-Kompatibilität:
Windows/VB-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.