Lister les fonctions d'un programme

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Lister les fonctions d'un programme

Message 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 ;)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Lister les fonctions d'un programme

Message 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    

ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Lister les fonctions d'un programme

Message 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
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Lister les fonctions d'un programme

Message 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 
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Lister les fonctions d'un programme

Message 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 ;)
Neosis
Messages : 113
Inscription : dim. 24/févr./2008 20:11

Re: Lister les fonctions d'un programme

Message 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:
La 2D sous PureBasic ... c'est le pied.
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Lister les fonctions d'un programme

Message 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).
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Lister les fonctions d'un programme

Message 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:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Anonyme

Re: Lister les fonctions d'un programme

Message 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.
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Lister les fonctions d'un programme

Message 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 !
Anonyme

Re: Lister les fonctions d'un programme

Message 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.
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Lister les fonctions d'un programme

Message 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 ;)).
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Lister les fonctions d'un programme

Message par Kwai chang caine »

je vous en parlerai plus longuement plus tard
Chouette, c'est le genre de question qui m'interesse 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Lister les fonctions d'un programme

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre