2009-02-24 10 views
0

J'ai une DLL C native qui exporte une fonction en plus de DllEntryPoint, FuncX. J'essaie de savoir comment FuncX communique avec son appelant, car il a un type de retour vide et aucun paramètre. Quand je l'appelle à partir d'un harnais C#, j'obtiens une exception AccessViolationException - Tentative de lecture ou d'écriture de la mémoire protégée.Tentative de lecture ou d'écriture de la mémoire protégée lors de l'appel de la DLL C native

J'ai l'intuition que son application client peut allouer un tampon pour envoyer ou recevoir des valeurs de la DLL. Est-ce une intuition valide?

Je ne parviens pas à déboguer l'application client car, pour une raison quelconque, elle ne s'exécute pas, donc je ne peux pas la démarrer et la connecter au processus. Je peux, cependant, le démonter dans IDA Pro, mais je ne sais pas comment, si je peux, essayer et déboguer là-dedans.

Répondre

0

Je voudrais essayer de charger la DLL elle-même dans IDA Pro. Espérons que C# préserve la pile d'appel native, et vous pouvez regarder le code autour de l'endroit où la DLL se bloque.

Note de côté: le Decompiler plugin est assez impressionnant.

+0

Je ne suis qu'à la page 20 d'un didacticiel de 300 pages sur IDA Pro et j'ai commandé un livre de 600 pages, mais pour l'instant, comment charger la DLL dans IDA Pro et l'appeler encore C#? Je vérifie le plug-in Decompiler, merci. – ProfK

+0

Ouch, mes yeux ont vu le prix du décompilateur. Au taux de change actuel, c'est trois fois le paiement de ma maison! Probablement un investissement digne si j'obtiens plus de travail d'ingénierie inverse. – ProfK

+0

Je ne sais pas, je n'ai jamais beaucoup IDA moi-même. Je l'ai seulement vu utilisé à mon ancien travail. Mais lorsque vous obtenez le crash, jetez un coup d'oeil dans le AccessViolationException et voyez si vous pouvez trouver une adresse de mémoire. Je sais que vous pouvez aller directement à une adresse mémoire et voir ce qu'il y a. Peut-être que ça va vous aider à démarrer. – zildjohn01

1

Si la DLL en question a des symboles statiques ou globaux, il est possible que toute la communication se fasse via ces symboles. Avez-vous un code API qui ressemble à cela?

Il est peu probable que la DLL utilise un tampon fourni par le client, car le client et le serveur doivent connaître l'adresse de base de ce tampon, et vous ne pouvez demander à calloc ou à malloc une adresse "préférée" temps.

Vous pouvez également essayer d'exécuter link /dump /symbols et le pointer sur votre DLL. Cela vous montrera la liste des symboles exportés dans votre DLL. Bonne chance!

Questions connexes