[ASM] Création d'une DLL en MASM32 pour un client VB6

Création d'une DLL en MASM32 pour un client VB6 [ASM] - ASM - Programmation

Marsh Posté le 17-04-2003 à 09:25:15    

Ne criez pas au sacrilège SVP :D
 
J'ai créé une DLL dont le code fonctionne très bien en EXE standalone, il s'agit d'une bête fonction de cryptage de mot de passe.  Voici la déclaration:
 

Code :
  1. Encode proc strPwd:DWORD, strBuf:DWORD, strKey:DWORD, lPwdLen:DWORD, lKeyLen:DWORD, fEncode:BYTE


D'abord les pointeurs vers: un password, un buffer de sortie, une clé de cryptage, la longueur du password, la longueur de clé, et finalement un flag qui dit si on crypte ou décrypte.  Les pointeurs sont supposés déjà alloués, sachant que la taille de strPwd est identique à la taille de strBuf sinon ça foire :D
 
Je me suis basé sur les exemples fournis avec MASM32, le fichier DEF est on ne peut plus simple également:

Code :
  1. LIBRARY dllcrypt
  2. EXPORTS Encode


 
Ensuite... la DLL est destinée à être exploitée par une application cliente VB6 dont voici le code complet:
 

Code :
  1. Option Explicit
  2. Private Declare Sub Encode Lib "dllcrypt.dll" ( _
  3.                      ByRef strPwd As Any, _
  4.                      ByRef strBuf As Any, _
  5.                      ByRef strKey As Any, _
  6.                      ByVal lPwdLen As Long, _
  7.                      ByVal lKeyLen As Long, _
  8.                      ByVal fEncode As Byte)
  9. Public Sub Main()
  10.     Dim strPwd As String
  11.     Dim strKey As String
  12.     Dim strBuf As String
  13.     Dim lPwdLen As Long
  14.     Dim lKeyLen As Long
  15.     ' Initialise strings
  16.     strPwd = "AAAAAAAA"
  17.     strKey = "11111111"
  18.     ' Get string lengths
  19.     lPwdLen = Len(strPwd)
  20.     lKeyLen = Len(strKey)
  21.     ' Initialise output buffer
  22.     strBuf = Space$(lPwdLen)
  23.     ' Encode password
  24.     Call Encode(strPwd, strBuf, strKey, lPwdLen, lKeyLen, 1)
  25.     ' Display buffer
  26.     Debug.Print strBuf
  27.     ' Decode password
  28.     Call Encode(strBuf, strPwd, strKey, lPwdLen, lKeyLen, 0)
  29.     ' Display password
  30.     Debug.Print strPwd
  31. End Sub


 
Pour le Declare, je me suis inspiré de l'API CopyMemory qui prend n'importe quoi en entrée et sortie vu que ce sont des pointeurs void.  J'ai essayé de remplacé le type Any par String mais le résultat est le même :sweat: : une belle GPF des familles.
 
Si vous avez des idées (sauf la corde :whistle:), merci d'avance :)


Message édité par drasche le 17-04-2003 à 09:25:56

---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 17-04-2003 à 09:25:15   

Reply

Marsh Posté le 17-04-2003 à 11:10:30    

Bizarre ton truc :heink:
Un test à faire : tu fais un appel à ta dll à partir d'un programme en C, et tu vois si ça fait la même chose. Ca te permettra de tracer les appels beaucoup mieux qu'avec VB je pense, et tu pourras mieux localiser la GPF. Une fois ceci fait, et le pb cerné, tu pourras réutiliser VB.
 
Moi je vois bien un débordement dans la lecture des 3 premiers paramètres qui sont des chaines. N'oublie pas que VB traite les chaines en Unicode (2 octets donc), il est possible qu'il y ait une merde à ce niveau là.
 
Essaie d'assembler ta dll sans les chaines pour voir si tu obtiens la GPF.


Message édité par Harkonnen le 17-04-2003 à 11:10:59

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 17-04-2003 à 11:27:13    

Je viens d'implémenter une DLL avec une fonction XOR dedans qui retourne une valeur byte, ça marche nickel, donc effectivement, ça doit forcément venir de ces **** de strings comme je le craignais (hey l'unicode j'avais prévu le coup hein, déjà faut être prudent avec CopyMemory :D)
 
Je retourne donc à mes expériences pour trouver une solution.
 
 [:neowen]


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 17-04-2003 à 11:33:16    

Ce qu'il faut savoir, c'est à quoi correspond le type String en VB.
Si ça correspond à l'adresse de la String, alors ça devrait fonctionner vu que tu attends un DWORD. Par contre, si c'est un alias d'une saloperie de Variant, alors la tu es dans la merde :d


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 17-04-2003 à 11:52:13    

J'ai fait un second test, je passe une string et la DLL la modifie, ça passe impec également si je spécifie un ByVal pour forcer la conversion d'unicode vers ascii:

Code :
  1. Call ProcessString(ByVal strString)


 
Je réessaie sur la DLL, j'ai désactivé le code de la fonction juste pour voir si l'appel se passe sans heurt et VB me sort un Bad DLL calling convention :cry:
 
Je retourne insister  [:neowen]  


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 17-04-2003 à 14:18:26    

meeeeeeeeeeerde c'est toujours EBX, EBP, ESI, EDI qui servent à l'adressage indexé :/  j'ai 3 chaînes à adresser ça va pas ça :cry:
 
bon je vais faire autrement :)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 19-11-2004 à 14:20:24    

Pour utiliser une Dll Masm32 en Vb6 le passage de paramètre string est toujours délicat, il ne faut pas passer les paramêtres en ByRef mais en ByVal et ne pas utiliser Any mais String.  
 
De plus le résultat que tu récupérera dans strBuf finira par le chr$(0) qu'il faudra que tu supprime ensuite si tu veux exploiter correctement
la donnée.  
 
Il faut bien veiller à initialiser strBuf ce que tu a d'ailleurs fais correctement.
 
Je ne sais pas si ça peut servir vu la date à laquel je répond !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed