Page 1 sur 1
Lister les fonctions d'un programme
Publié : ven. 02/oct./2009 11:06
par Cls
Salut à tous,
Voilà j'ai un petit problème, sans doute assez simple à résoudre. J'aimerais lister toutes les fonctions du programme en cours d'exécution afin d'appeler dynamiquement telle ou telle fonction. Or ce bout de code me donne un joli 'Invalid memory access' :
Code : Tout sélectionner
library = OpenLibrary(#PB_Any, ProgramFilename())
If library
If ExamineLibraryFunctions(library)
While NextLibraryFunction()
Debug LibraryFunctionName()
Debug LibraryFunctionAddress()
Wend
EndIf
CloseLibrary(library)
EndIf
L'idée c'est d'appeler la fonction via son adresse avec un CallFunctionFast. Si quelqu'un a une idée, je suis preneur.
Merci

Re: Lister les fonctions d'un programme
Publié : ven. 02/oct./2009 11:23
par Kwai chang caine
Bonjour mon bon CLS
Pour une fois que KCC il va pouvoir te renvoyer "l'escalier"

Je sais pas si ça peut te depanner...mais j'ai ces codes
Code : Tout sélectionner
; German forum: http://robsite.de/php/pureboard/viewtopic.php?t=1600&highlight=
; Author: Herbi
; Date: 04. July 2003
;
; ------------------------------------------------------------
;
; DLL Spion
;
; Vorsicht : Geht nicht bei allen DLLs
; ist aber für den normalen Gebrauch geeignet
;
; ------------------------------------------------------------
;
Global datei.s, zeile.s, fname.s, fadress.l, open.l, count.l
#dll = 0
If OpenWindow(0, 100, 100, 600, 460, "DLL - Spion", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered )
If CreateGadgetList(WindowID(0))
ButtonGadget(1, 5, 20, 80, 25, "DLL Laden")
ButtonGadget(2, 105, 20, 80, 25, "Anzeigen")
ButtonGadget(3, 305, 20, 80, 25, "Ende")
TextGadget(4, 5, 70, 300, 25, "")
ListIconGadget(30, 5, 110, 590, 320, "Funktions - Adresse", 120, #PB_ListIcon_GridLines)
AddGadgetColumn(30, 1, "Funktions - Name", 280)
AddGadgetColumn(30, 2, "lfd. Nummer", 170)
EndIf
Repeat
EventID.l = WaitWindowEvent()
Select EventID
Case #PB_Event_CloseWindow
Quit = 1
Case #PB_Event_Gadget
Select EventGadget()
Case 1
; DLL laden
datei = ""
datei = OpenFileRequester("DLL laden", "", "DLL Dateien | *.dll", 1)
If datei <> ""
open = OpenLibrary(#dll, datei)
EndIf
Case 2
; Funktionen anzeigen
If open <> 0
count = 0
anz.l = CountLibraryFunctions(#dll)
SetGadgetText(4, "Anzahl der Funktionen : " + Str(anz))
ClearGadgetItemList(30)
If ExamineLibraryFunctions(#dll)
While NextLibraryFunction() <> 0
fname = LibraryFunctionName()
fadress = LibraryFunctionAddress()
count = count + 1
zeile = Str(fadress) + Chr(10) + fname + Chr(10) + Str(count)
AddGadgetItem(30, -1, zeile)
Wend
EndIf
CloseLibrary(#dll)
EndIf
Case 3
; Button 4
Quit = 1
EndSelect
EndSelect
Until Quit = 1
EndIf
End
Re: Lister les fonctions d'un programme
Publié : ven. 02/oct./2009 11:25
par Kwai chang caine
Celui la il est de OLLIVIER
Code : Tout sélectionner
DLLFichierNom$ = "USER32.DLL"
Debug("Ouverture de la librairie " + DLLFichierNom$)
If OpenLibrary(0, DLLFichierNom$)
If IsLibrary(0)
Debug("Librairie valide")
QFB = CountLibraryFunctions(0)
Debug(Str(QFB) + " fonction(s) détectées")
If ExamineLibraryFunctions(0)
N = 0
Debug("L'examen des fonctions est possible")
For N = 0 To QFB
Result = NextLibraryFunction()
If Result
FNom$ = LibraryFunctionName()
Adr = LibraryFunctionAddress()
Debug(Str(N) + ": " + FNom$ + " >> [" + Hex(Adr) + "]")
Else
Debug("Fin de la liste des fonctions!")
EndIf
Next
Else
Debug("Impossible d'examiner les fonctions!")
EndIf
Else
Debug("Librairie invalide!")
EndIf
CloseLibrary(0)
EndIf
Re: Lister les fonctions d'un programme
Publié : ven. 02/oct./2009 11:26
par Kwai chang caine
Celui la de LionelOM
Code : Tout sélectionner
dll$ = OpenFileRequester("Selectionnez une DLL", "D:\Projets\ALib\DLL\", "*.dll", 0)
If OpenLibrary(1, dll$) = 0
End
EndIf
OpenWindow(1, 0, 0, 640, 480, "DLLView par Aranoth-ND", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(1))
ListViewGadget(1, 0, 0, 640, 480)
AddGadgetItem(1, - 1, "-----------------------------------------------")
AddGadgetItem(1, - 1, "Nom de la DLL: " + dll$)
AddGadgetItem(1, - 1, "Nbr de fonctions: " + Str(CountLibraryFunctions(1)))
AddGadgetItem(1, - 1, "-----------------------------------------------")
ExamineLibraryFunctions(1)
While NextLibraryFunction()
AddGadgetItem(1, - 1, LibraryFunctionName()) ;+" @ "+Str(LibraryFunctionAddress()))
Wend
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
CloseLibrary(1)
End
Celui la de NETMAESTRO
Code : Tout sélectionner
OpenLibrary(0, "c:\nlsxbe.dll")
ExamineLibraryFunctions(0)
While NextLibraryFunction()
Debug LibraryFunctionName()
Wend
Re: Lister les fonctions d'un programme
Publié : ven. 02/oct./2009 14:01
par Cls
Merci pour tes codes KCC. Malheureusement aucun ne résout le problème. Ils reprennent tous les fonctions que j'ai utilisé et je crois que, dans mon cas, ce n'est pas la bonne manière de faire.
Si quelqu'un a une idée, je suis toujours preneur

Re: Lister les fonctions d'un programme
Publié : ven. 02/oct./2009 17:04
par Neosis
Pas complètement sur d'avoir compris ce que tu voulais ...
Code : Tout sélectionner
library = OpenLibrary(#PB_Any, ProgramFilename())
If library
If ExamineLibraryFunctions(library)
While NextLibraryFunction()
Debug LibraryFunctionName()
Debug LibraryFunctionAddress()
Wend
EndIf
CloseLibrary(library)
EndIf
Effectivement : "invalid memory access"
Mais si tu remplace ta fonction "ProgramFilename()" par le nom dela DLL exacte, ça fonctionne déjà mieux, exemple :
Code : Tout sélectionner
library = OpenLibrary(#PB_Any,"USER32.DLL")
If library
If ExamineLibraryFunctions(library)
While NextLibraryFunction()
Debug LibraryFunctionName()
Debug LibraryFunctionAddress()
Wend
EndIf
CloseLibrary(library)
EndIf
Pour spécifier le nom de ta DLL qui abrite les fonctions utiles à ton programme essaye :
GetCurrentDirectory()+"NomDeTaDLL.dll" avec ta DLL dans le même répertoire que ton programme.
Dit moi si c'est mieux comme ça

Re: Lister les fonctions d'un programme
Publié : ven. 02/oct./2009 17:28
par Cls
Je souhaite lister dynamiquement les fonctions contenues dans mon programme avec leurs adresses afin de les exécuter à la volée.
Concrètement, j'ai une appli que je lance, donc qui est en cours d'exécution ; et je souhaite avoir l'ensemble des fonctions contenues en son sein. C'est donc bien ProgramFilename() qu'il faut utiliser. Par contre je ne sais pas comment lister les fonctions, et leurs adresses (c'est ce qui m'intéresse).
Re: Lister les fonctions d'un programme
Publié : ven. 02/oct./2009 18:11
par Kwai chang caine
Ouyaillyaille !!!
Ca m'etonnais un peu que quelqu'un de ton niveau est besoin de ce genre de code
Je suppose que evidemment tu n'as plus le code source sous la main, quand tu veux editer la liste ????
Autrement tu pourrais faire au moins la liste en lisant le code source.
Mais tu y a surement pensé.
Et encore, je ne sais pas si tu pourrais demander l'adresse si tu avais le nom ????
Pour le listing des fonctions, je pensais que c'etait que pour une DLL...
C'est peut etre pour ça que ça plante ???

Re: Lister les fonctions d'un programme
Publié : sam. 03/oct./2009 10:03
par Anonyme
C'est impossible , ton programme une fois compilé est "aplati" en serie de byte , il me semble que les fonctions ne sont que des saut
au sein du code. il te faut pour cela connaitre en détail l'ASM , et le format PE 32 pour windows 32 bits et PE 64 pour windows 64 bits
donc pas simple ton histoire.
Re: Lister les fonctions d'un programme
Publié : sam. 03/oct./2009 12:01
par Cls
Humm je vais ressortir un post sur le PE alors (j'ai travaillé dessus il y a quelques temps).
Merci pour ta réponse, sinon je vais devoir trouver une astuce... Pas simple tout ça !
Re: Lister les fonctions d'un programme
Publié : sam. 03/oct./2009 14:04
par Anonyme
Essaye aussi de voir pour "reperer" l'adresse d'une fonction , je ne connais pas le Format PE , peut être il possède une table
d'adresse des fonctions comme les DLL's ?
une fois que tu as repéré une fonction , va falloir modifié en direct le registre IP pour lui indiqué un saut vers tel adresse...
a mon avis , tu perds ton temps , je te laisse imaginé les invalid access memory & autre buggage en tout genre.
Re: Lister les fonctions d'un programme
Publié : sam. 03/oct./2009 16:24
par Cls
Cpl.Bator a écrit :peut être il possède une table d'adresse des fonctions comme les DLL's ?
Oui il y a également ce fonctionnement dans le format PE. Je vais faire quelques investigations car c'est l'une des fonctions principales de mon programme (je vous en parlerai plus longuement plus tard

).
Re: Lister les fonctions d'un programme
Publié : sam. 03/oct./2009 17:34
par Kwai chang caine
je vous en parlerai plus longuement plus tard
Chouette, c'est le genre de question qui m'interesse

Re: Lister les fonctions d'un programme
Publié : sam. 03/oct./2009 20:02
par Le Soldat Inconnu
Je dis peut-être une grosse connerie mais je la dis quand même (na !)
Si on mets une dll avec tes fonctions dans les ressources de ton programme, ça ne marche pas ?
En gros, ton code d'un coté que tu compile normalement
Puis en ressource de l'exe une version DLL du programme