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" :D
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 :wink:

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 :roll:

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é. :oops:

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 ??? :roll:

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 8)

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