| |
|
|
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 |
|
|
| |
|
|
|
| Die Anzahl der Params könnte man vielleicht mit einer art Brute-Force-Angriff feststellen.
Salve. |
|
|
| |
|
|
|
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 |
|
|
| |
|
|
|
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 |
|
|
| |
|
|
|
| Na da kommwa der Sache schon bisl näher,- vielleicht hilft uns ein freeware-disassembler auf Consolenbasis das Problem zu fixn.
Salve. |
|
|
| |
|
|
|
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 |
|
|
| |
|
|
|
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 |
|
|
| |
|
|
|
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:
Wie Du siehst werden verschiedene Variablentypen (Byte und Long) übergeben. Andreas Programm generiert daraus folgendes Listing:
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 |
|
|
| |
|
|
|
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. |
|
|
| |
|
|