Deutsch
SDK-Helfer/ Tools

DLL2Include für Profan

 

Stefan
Schnell
Hallo Community,
anbei ein kleines Programm, dass es einfacher machen soll, Include-Dateien für Profan aus DLL-Dateien zu erstellen:  [...] 

Mit diesem Programm kann eine beliebige DLL geöffnet werden und dann wird aus dieser eine Include-Datei für Profan, im gleichen Verzeichnis, generiert.
Einziges Manko, die Anzahl der übergebenen Parameter können nicht ermittelt werden und müssen daher von Hand nachgetragen werden, aber um Tipparbeit zu sparen schon mal ein Anfang.
Gruß
Stefan
 
19.10.2004  
 



Die Anzahl der Params könnte man vielleicht mit einer art Brute-Force-Angriff feststellen.

Salve.
 
20.10.2004  
 




Stefan
Schnell
Hallo Community,
anbei eine verbesserte Version, die neben Include- auch Header-Dateien aus DLL-Dateien erzeugen kann.
Gruß
Stefan

P.S. Dank dem Code von Andreas werden jetzt auch die Parameter ermittelt
 
20.10.2004  
 




Stefan
Schnell
Hallo David, hallo Community,
hast Du denn eine Idee wie wir das in Angriff nehmen können? (Im wahrsten Sinne des Wortes)

Gleich noch eine andere Frage hinterher:
Soweit ich es verstanden habe, kann über den (E)SP [=Stackpointer] ja die Anzahl notwendigen Bytes einer Funktion in einer DLL ermittelt werden. Hat da jemand einen Ansatz wie das zu realisieren ist? Bin für Hinweise und Tips dankbar.

Gruß
Stefan
 
20.10.2004  
 



Na da kommwa der Sache schon bisl näher,- vielleicht hilft uns ein freeware-disassembler auf Consolenbasis das Problem zu fixn.

Salve.
 
20.10.2004  
 




Andreas
Miethe


[quote:65da66e5a3=Stefan Schnell]Hallo David, hallo Community,
hast Du denn eine Idee wie wir das in Angriff nehmen können? (Im wahrsten Sinne des Wortes)

Gruß
Stefan[/quote:65da66e5a3]
Hallo Stefan,

noch nicht gefunden auf meiner Seite ?? [...] 
 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
20.10.2004  
 




Stefan
Schnell
Hallo Andreas,
nein, noch nicht gesehen oder gehört... aber toll...

Kannst Du mal den Code-Snippet, für die Ermittlung der Anzahl der Parameter, hier publizieren oder eine Quelle nennen? Interessiert mich wie das gemacht wird.

Danke und Gruß
Stefan
 
20.10.2004  
 




Andreas
Miethe


[quote:046234beca=Stefan Schnell]Hallo Andreas,
nein, noch nicht gesehen oder gehört... aber toll...

Kannst Du mal den Code-Snippet, für die Ermittlung der Anzahl der Parameter, hier publizieren oder eine Quelle nennen? Interessiert mich wie das gemacht wird.

Danke und Gruß
Stefan[/quote:046234beca]
Kann ich gerne machen. Das ist Pure-Basic Code, keine Ahnung, ob Du damit etwas anfangen kannst.

kompletter Code :
!DisplayErrors.l = 1
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() ;<- executable erstellen und einfach Dll droppen.

                                                            If DLL = ""

                                                                MessageRequester("Include_Generator","Die gewünschte Dll per Drag&Drop auf INC_Gen.Exe ziehen!",64)
                                                                End

                                                            EndIf

                                                            Pbl.s=DLL
                                                            Point=FindString(Pbl,".",1)
                                                            Pbl=Left(Pbl,Point-1)+".Inc"
                                                            DllName.s = GetFilePart(Dll)
                                                            FullPath.s = Space(#MAX_PATH)
                                                            GetModuleFileName_(0,FullPath,#MAX_PATH)
                                                            ;MessageRequester(Fullpath,GetPathPart(Fullpath),0)
                                                            FullPath = GetPathPart(Fullpath)
                                                            Inst=OpenLibrary(1,DLL.s)

                                                            If Inst=0

                                                                MessageRequester("Fehler","Die DLL "+DLL+" konnte nicht geöffnet werden.")
                                                                End

                                                            EndIf

                                                            If CreateFile(0,FullPath+ReplaceString(GetFilePart(DLL),GetExtensionPart(DLL),"Inc"))=0

                                                                MessageRequester("Fehler","Die Datei "+Pbl+" konnte nicht erstellt werden.")
                                                                End

                                                            EndIf

                                                            WriteStringN("############################################")
                                                            WriteStringN("generiert von Include-Generator für XProfan")
                                                            WriteStringN("############################################")
                                                            WriteStringN("Original-PB-Code von Stefan Möbius")
                                                            WriteStringN("bearbeitet für XProfan von Andreas Miethe")
                                                            WriteStringN("############################################")
                                                            WriteStringN(FormatDate("%dd.%mm.%yyyy", Date()) )
                                                            WriteStringN("############################################")
                                                            WriteStringN("")

                                                            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("DEF "+ Name+"("+Str(Param)+") ! "+Chr(34)+Dllname+Chr(34)+","+Chr(34)+Name+Chr(34))
                                                                            ;      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)
                                                                RunProgram("Notepad.exe", FullPath+ReplaceString(GetFilePart(Dll),GetExtensionPart(Dll),"Inc"), "", 0)
                                                                End
 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
20.10.2004  
 



Sag ich doch,- disassembling.

Sehe ich das falsch Andreas,- oder ermittelt die Proc nur Longints ?

Salve,- iF
 
21.10.2004  
 




Stefan
Schnell
Hallo Andreas,
3,14159267 mal Dank für das Listing, das ist wirklich sehr interessant und wird mir sicherlich einiges zum Nachdenken geben.

Hallo David,
>Sehe ich das falsch Andreas,- oder ermittelt die Proc nur Longints ?

Hmm, folgende DLL habe ich eben ausprobiert:
;-Begin-----------------------------------------------------------------
ProcedureDLL Test2x4(Var1.b, Var2.b)
EndProcedure
ProcedureDLL Test4(Var1.l)
EndProcedure
ProcedureDLL Test8(Var1.l, Var2.l)
EndProcedure
;-End-------------------------------------------------------------------
End

Wie Du siehst werden verschiedene Variablentypen (Byte und Long) übergeben. Andreas Programm generiert daraus folgendes Listing:
############################################
generiert von Include-Generator für XProfan
############################################
Original-PB-Code von Stefan Möbius
bearbeitet für XProfan von Andreas Miethe
############################################
21.10.2004
############################################
DEF Test2x4(2) ! "test.dll","Test2x4"
DEF Test4(1) ! "test.dll","Test4"
DEF Test8(2) ! "test.dll","Test8"

Und das ist ja richtig so.

Das disassemblierte Listing sieht so aus:
Test2x4
=========
:100013A7 53                      push ebx
:100013A8 51                      push ecx
:100013A9 55                      push ebp
:100013AA 56                      push esi
:100013AB 57                      push edi
:100013AC 89E6                    mov esi, esp
:100013AE 83EC04                  sub esp, 00000004
:100013B1 89E0                    mov eax, esp
:100013B3 89C2                    mov edx, eax
:100013B5 83C204                  add edx, 00000004
---------
:100013B8 C70000000000            mov dword[eax], 00000000
:100013BE 83C004                  add eax, 00000004
:100013C1 39D0                    cmp eax, edx
:100013C3 75F3                    jne 100013B8
:100013C5 8B4618                  mov eax, dword[esi+18]
:100013C8 880424                  mov byte[esp+esp], al
:100013CB 8B461C                  mov eax, dword[esi+1C]
:100013CE 88442401                mov byte[esp+01], al
:100013D2 31C0                    xor eax, eax
:100013D4 83C404                  add esp, 00000004
:100013D7 5F                      pop edi
:100013D8 5E                      pop esi
:100013D9 5D                      pop ebp
:100013DA 59                      pop ecx
:100013DB 5B                      pop ebx
:100013DC C20800                  ret 0008

Das überrascht mich jetzt etwas, da sich die Parameterermittlung auf das RET bezieht und hier, trotz zweier Byte-Variablen, die Zahl 8 übergeben wird, verstehe ich nicht.
Genauso sieht es nämlich bei der Prozedur Test8 aus:
Test8
=========
:10001414 53                      push ebx
:10001415 51                      push ecx
:10001416 55                      push ebp
:10001417 56                      push esi
:10001418 57                      push edi
:10001419 89E6                    mov esi, esp
:1000141B 83EC08                  sub esp, 00000008
:1000141E 89E0                    mov eax, esp
:10001420 89C2                    mov edx, eax
:10001422 83C208                  add edx, 00000008
---------
:10001425 C70000000000            mov dword[eax], 00000000
:1000142B 83C004                  add eax, 00000004
:1000142E 39D0                    cmp eax, edx
:10001430 75F3                    jne 10001425
:10001432 8B4618                  mov eax, dword[esi+18]
:10001435 890424                  mov dword[esp+esp], eax
:10001438 8B461C                  mov eax, dword[esi+1C]
:1000143B 89442404                mov dword[esp+04], eax
:1000143F 31C0                    xor eax, eax
:10001441 83C408                  add esp, 00000008
:10001444 5F                      pop edi
:10001445 5E                      pop esi
:10001446 5D                      pop ebp
:10001447 59                      pop ecx
:10001448 5B                      pop ebx
:10001449 C20800                  ret 0008

Werden vielleicht bei DLLs, egal welcher Variablentyp angegeben wird, immer LongInts übergeben? Dann ist Davids Annahme korrekt.
Wer kann meinen Geist erhellen?
Danke und Gruß
Stefan
 
21.10.2004  
 




Andreas
Miethe


Hallo Stefan,

ich habe mir jetzt schon so einige Dlls angesehen ( Dependency Walker ) und bei einigen kann man es ganz gut erkennen. Pro Parameter wird immer 4 dazugezaehlt, egal um was fuer einen Parameter es sich handelt.
 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
21.10.2004  
 



Jepp,- kann ich bestätigen.

Salve.
 
21.10.2004  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

14.260 Betrachtungen

Unbenanntvor 0 min.
Klaus Kohlhepp08.02.2021
Uwe Lang27.05.2020
Hanibal196319.02.2017
Ernst17.05.2016
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie