DLL Analyzer

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

DLL Analyzer

Beitrag von hardfalcon »

Ich habe während den letzten 2 Tagen u.a. auch einen DLL analyzer zusammengeproggt... Hier ist das ergebnis, allerdings nur als Source... Werde bei Gelegenheit eventuell noch eine fertige EXE auf meinen Webspace uppen und den Link posten, mal sehen...

Und noch eine Frage: Welchen praktischen Wert hat eigentlich die "LibraryID"?

Code: Alles auswählen

DesktopPath$ = Space (#MAX_PATH+1)
SHGetSpecialFolderLocation_ (0,0, @*itemid)
SHGetPathFromIDList_ (*itemid, @DesktopPath$)
If  "\" <> Right(DesktopPath$,1)
  DesktopPath$ + "\"
EndIf
LibraryPath$ = OpenFileRequester("Please select the DLL file you want to examine!",DesktopPath$,"DLL |*.dll | *.*|All files",-1)
Library$ = GetFilePart(LibraryPath$)
If OpenLibrary(0,LibraryPath$)
  hwnd = OpenWindow(0,0,0,300,410,#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered,"hardfalcon's DLL analyzer")
  If CreateGadgetList(hwnd)
    LibraryFunctions = CountLibraryFunctions(0)
    TextGadget(0,5,5,290,20,"Analyzing " + Library$ + "...",#PB_Text_Border)
    ProgressBarGadget(1,5,30,290,20,0,LibraryFunctions,#PB_ProgressBar_Smooth)
    TextGadget(2,5,55,290,20,"DLL ID: " + Str(LibraryID(0)),#PB_Text_Border)
    TextGadget(3,5,80,290,20,"MD5 hash: " + MD5FileFingerprint(LibraryPath$),#PB_Text_Border)
    ListIconGadget(4,5,105,290,300,"Function name",177,#PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_HeaderDragDrop)
    AddGadgetColumn(4,1,"Function address",93)
  Else
    CloseLibrary(0)
    End
  EndIf
  If ExamineLibraryFunctions(0)
    LibraryFunctionsString$ = Str(LibraryFunctions)
    LoadFont(0,"Tahoma",8)
    StartDrawing(WindowOutput())
    DrawingFont(UseFont(0))
    FrontColor(255,255,255)
    DrawingMode(1)
    While NextLibraryFunction()
      Counter + 1
      CounterString$ = Str(Counter)
      SetGadgetText(0,"Analyzing " + Library$ + "...")
      Select Counter
      Case LibraryFunctions
        ProgressBarString$ = LibraryFunctionsString$ + " functions found"
      Default
        ProgressBarString$ = "Function " + CounterString$ + " of " + LibraryFunctionsString$
      EndSelect
      Locate(150 - (TextLength(ProgressBarString$)/2),33)
      DrawText(ProgressBarString$)
      SetGadgetState(1,Counter)
      AddGadgetItem(4,-1,LibraryFunctionName() + Chr(10) + Hex(LibraryFunctionAddress()))
    Wend
    StopDrawing()
    SetGadgetText(0,"Analyzing of " + GetFilePart(LibraryPath$) + " finished.")
    Repeat
      Delay(1)
    Until #PB_Event_CloseWindow = WindowEvent()
  EndIf
  CloseLibrary(0)
EndIf
//EDIT: Und vielen Dank an Rings, der mich heute im englischen Chat dazu bewegt hat, den Text in der Progressbar mit DrawText() umzusetzen... Ich hätte sonst noch jahrelang nach einem API-Befehl gesucht...
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Ach gott, das ist ein Programm für Anfänger :mrgreen:. Du kannst doch sicher mehr. Wie wärs, wenn du statt die PB funktionen zu benutzen mal selber eine Funktion schreibst welche die Funktionen aus der DLL ausliest. So schwer ist das garnicht. Die Funktionen stehen in reiner Textform in der DLL. mal ein kleines Beispiel aus einer meiner DLLs:

Code: Alles auswählen

              h†jB    P            (   8   H   ’  d    «  [   h   u   „        MsgBox.dll Library_Exit Library_Init Library_MsgBox Library_Parm        
Suchst du halt als 1. nach den Namen der DLL und dann ist der rest nicht mehr schwer :twisted:
Bild
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

und zu welchem Zweck schlägst du das vor MVXA? Und warum äußerst du dich einzig auf diese Weise? Da hilft auch der Smiley nicht, das ist einfach nur nervend, wenn man so eine Antwort bekommt, und wenn du ehrlich bist: so eine Antwort magst du auch nicht, oder?
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> Und noch eine Frage: Welchen praktischen Wert hat eigentlich die "LibraryID"?
Diese ID brauchste, wenn Du API-Funktionen anwenden möchtest

Den Pattern Deines OpenFileRequesters solltest Du noch so abändern, das die Auswahl einer DLL möglich ist :D

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: DLL Analyzer

Beitrag von Danilo »

hardfalcon hat geschrieben:Ich habe während den letzten 2 Tagen u.a. auch einen DLL analyzer zusammengeproggt...
Hier ist meine alte Version für sowas: PE-Viewer.zip

Funktioniert mit EXE, DLLs, OCX, etc.

Zum analysieren gibt es 3 Wege:
1. Dateiname als Argument zum PE-Viewer angeben
2. PE-Viewer öffnen und Datei über Menü "Open File" öffnen
3. Drag&Drop einer Datei auf den PE-Viewer

Ich hab da eine Verknüpfung aufm Desktop, und wenn ich eine
DLL oder EXE mal schnell anschauen will, dann zieh ich die Datei
einfach auf die Verknüpfung.
IMHO ziemlich praktisch um mal schnell die Im- und Exports
anzuschauen. :)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

Kann man eigentlich auch irgendwie die Anzahl der Parameter auslesen? Das wäre ganz witzig für den DLL Importer :D
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

ts-soft hat geschrieben:>> Und noch eine Frage: Welchen praktischen Wert hat eigentlich die "LibraryID"?
Diese ID brauchste, wenn Du API-Funktionen anwenden möchtest

Den Pattern Deines OpenFileRequesters solltest Du noch so abändern, das die Auswahl einer DLL möglich ist :D

Gruß
Thomas
Welche API Befehle zum Beispiel?Hat das irgendwas mit der CSLID zu tun?

@Danilo: Dein Programm ist zwar sehr interessant, aber *ich persönlich* finde es etwas unübersichtlich... Könntest du mir eventuell den Source geben, dann würde ich das ganze mit TreeGadget() darstellen...

@MXVA: Jemand, der die falsche CPU für sein Motherboard kauft, und damit seinen PC zum Abrauchen bringt, kann mich nicht beleidigen... :twisted:

Hoffe, jetzt bricht hier kein Flamewar aus... :freak:

cya
Pascal

//EDIT: @125: Sicher geht das:

Code: Alles auswählen

Procedure CountParameters()
  Repeat
    a+1
    Parameter$=ProgramParameter()
  Until ""=Parameter$
  ProcedureReturn a-1
EndProcedure

//Andere Edits: Link zu MVXA's "krepierte CPU"-Thread gesetzt... :freak:
Zuletzt geändert von hardfalcon am 07.09.2005 11:01, insgesamt 3-mal geändert.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3875
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

nicht nur die Anzahl der Parameter wäre vonnöten sondern
auch das Datenformat der Parameter


Glaub aber nicht dass das irgendwie geht wenn man die
entspr. DLL nicht "kennt"


Da lass ich mich aber mal gerne belehren.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Also die Anzahl der Parameter wird zum Beispiel von diesm Code von Stefan Moebius ermittelt:

Code: Alles auswählen

; Author: Stefan Moebius
; Date: 03. January 2004

;PBL-Creator
;~~~~~~~~~~~
;Mit dem PBL-Creator kann man die PBL-Dateien erstellen, die
;man für den DLL-Importer benötigt, um eine DLL in Purebasic zu importieren.

Procedure.l hex2dec(h$)
  h$=UCase(h$)
  For r=1 To Len(h$)
    d<<4 : a$=Mid(h$,r,1)
    If Asc(a$)>60
      d+Asc(a$)-55
    Else
      d+Asc(a$)-48
    EndIf
  Next
  ProcedureReturn d
EndProcedure
Procedure GetNumberOfParam(Pointer)
  Repeat
    Pointer=DisASMCommand(Pointer)
    ASM_Code.s=UCase(GetDisASMString())
  Until FindString(ASM_Code.s,"RET",1)
  Bytes=hex2dec(Right(ASM_Code.s,Len(ASM_Code.s)-4))
  If Bytes%4 Or Bytes>200:Bytes=-1:EndIf
  If Bytes>=0:Bytes=Bytes>>2:EndIf
  ProcedureReturn Bytes
EndProcedure
Procedure BadName(Name.s)
  result=0
  If FindString(UCase(Name.s),"DLLENTRYPOINT",1):result=-1:EndIf
  If FindString(UCase(Name.s),"DLLCANUNLOADNOW",1):result=-1:EndIf
  If FindString(UCase(Name.s),"DLLGETCLASSOBJECT",1):result=-1:EndIf
  If FindString(UCase(Name.s),"DLLREGISTERSERVER",1):result=-1:EndIf
  If FindString(UCase(Name.s),"DLLUNREGISTERSERVER",1):result=-1:EndIf
  If UCase(Name.s)="ATTACHPROCESS":result=-1:EndIf
  If UCase(Name.s)="DETACHPROCESS":result=-1:EndIf
  If UCase(Name.s)="ATTACHTHREAD":result=-1:EndIf
  If UCase(Name.s)="DETACHTHREAD":result=-1:EndIf
  If UCase(Name.s)="DLLINITIALIZE":result=-1:EndIf
  If Len(Name.s)>100:result=-1:EndIf
  If Left(Name.s,1)="?":result=-1:EndIf
  If UCase(Name.s)="DUMMY":result=-1:EndIf
  ProcedureReturn result
EndProcedure
DLL.s=ProgramParameter()
If DLL.s="":DLL.s="PureBasic.dll":EndIf
flags=#PB_Window_ScreenCentered|#PB_Window_SystemMenu
OpenWindow(1,0,0,200,115,flags,"PBL-Creator v1.1")
CreateGadgetList(WindowID())
StringGadget  (1, 10, 30,170, 20, DLL)
TextGadget    (2, 10, 10, 30, 20, "DLL:")
CheckBoxGadget(3, 10, 60,150, 20, "Fehler anzeigen")
ButtonGadget  (4, 10, 90, 70, 20, "&Weiter")
ButtonGadget  (5,110, 90, 70, 20, "&Beenden")
ButtonGadget  (6,180, 30, 20, 20, "...")
SetGadgetState(3,1)
Ok=0
Repeat
  result=WaitWindowEvent()
  Select result
    Case #PB_Event_CloseWindow
      End
    Case #PB_Event_Gadget
      If EventGadgetID()=6
      SetGadgetText(1,OpenFileRequester("DLL laden","PureBasic.dll","Dynamic Link Library(*.dll)|*.DLL",0))
      EndIf
      If EventGadgetID()=5:End:EndIf
      If EventGadgetID()=4:DLL=GetGadgetText(1):DisplayErrors=GetGadgetState(3):Ok=-1:EndIf
  EndSelect
Until Ok
If FindString(DLL,".",1)=0:DLL=DLL+".dll":EndIf
Pbl.s=DLL
Point=FindString(Pbl,".",1)
Pbl=Left(Pbl,Point-1)+".pbl"
Inst=OpenLibrary(1,DLL.s)
If Inst=0
  MessageRequester("Fehler","Die DLL "+DLL+" wurde nicht gefunden.")
  End
EndIf
If CreateFile(1,Pbl)=0
  MessageRequester("Fehler","Die Datei "+Pbl+" konnte nicht erstellt werden.")
  End
EndIf
WriteStringN(";Erstellt mit PBL-Creator v1.1")
WriteStringN(GetFilePart(DLL))
If ExamineLibraryFunctions(1)
  While NextLibraryFunction()<>0
    Name.s=LibraryFunctionName()
    Addr=GetProcAddress_(Inst,Name)
    Param=GetNumberOfParam(Addr)
    BadName=BadName(Name)
    If DisplayErrors
      If Param=-1
        Text$="Falsche Parameteranzahl bei der Funktion "+Name+" ."+Chr(13)
        Text$=Text$+"Möchten sie die Anzahl der Parameter manuell eingeben ?"
        If MessageRequester("Fehler",Text$,#MB_YESNO)=#IDYES
          Param=Val(InputRequester(LibraryFunctionName()+":","Parameteranzahl","0"))
        EndIf
      EndIf
      If BadName
        Text$="Es wird nicht empfohlen, die Funktion "+Name.s+" zu exportieren."+Chr(13)
        Text$=Text$+"Soll sie dennoch exportiert werden ?"
        If MessageRequester("Frage",Text$,#MB_YESNO)=#IDYES:BadName=0:EndIf
      EndIf
    EndIf
    If BadName=0 And Param>=0
      WriteStringN(Name+" "+Str(Param))
      Anz+1
    EndIf
    AnzGes+1
  Wend
Else
  MessageRequester("Fehler","Die DLL "+DLL+" konnte nicht überprüft werden.")
  End
EndIf
CloseLibrary(1)
CloseFile(1)
MessageRequester("Information:",Pbl+" wurde erfolgreich erstellt."+Chr(13)+Str(Anz)+"/"+Str(AnzGes)+" Funktionen exportiert.",#MB_ICONINFORMATION)
End
Nützlich im Zusammenhang mit dem Lib-Importer z. B.

@hardfalcon
Die LibraryID ist lediglich ein Windows-Handle
Wirste nicht viel mit anfangen können, denke ich mal

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Also werde ichs aus dem DLL Analyzer streichen... Kostet bloss unnötig Rechenzeit...
Antworten