Bonjour,
Oui, ca existe déjà sur le site
EBArtSoft nous avait pondu :
http://www.vbfrance.com/codes/APPELER-FONCTION-DEPUIS-SON-ADRESSE_39481.aspx
Mais bon, j'aime bien implémenter les choses moi même, donc ^^
J'ai juste repiqué ses exemples.
Implémenter soi même, ok, mais quelles sont les différences proposées ?
j'utilises un ParamArray pour transmettre les paramètres aux APIs
Plus simple à utiliser, donc, puisqu'on n'a pas a créer le prototype, mais il faut du coup faire deux fois plus attention au nombre d'arguments passés et à leur taille.
Source / Exemple :
'# BruNews, s'il te vient l'idée de lire ce code ASM,
'# rappelle toi que je suis pas spécialiste, hein ^^
Private Sub Class_Initialize()
Dim pFirstVTEntry As Long
Dim pCode As Long
Dim i As Long
GetMem4 ObjPtr(Me), pFirstVTEntry
mpCode = VirtualAlloc(ByVal 0&, 512, MEM_COMMIT, PAGE_EXECUTE_READWRITE)
'# Invoke et InvokeArr
pCode = mpCode
For i = 0 To 1
PutMem4 pFirstVTEntry + &H1C& + i * 4, pCode
PutMem4 pCode, &H56EC8B55: pCode = pCode + 4 'push ebp
'mov ebp, esp
'push esi
PutMem4 pCode, &H9010758B: pCode = pCode + 4 'mov esi, [ebp+10h]
If i Then '# InvokeArr
PutMem4 pCode, &H9008768D: pCode = pCode + 4 'lea esi, [esi+8h] => Permet de sauter l'entete du Variant (type+2 reserved words)
End If
PutMem4 pCode, &H488B068B: pCode = pCode + 4 'mov eax, [esi]
'mov ecx, [eax+10h]
PutMem4 pCode, &H14483B10: pCode = pCode + 4 'cmp ecx, [eax+14h]
PutMem4 pCode, &H9090267E: pCode = pCode + 4 'jle LBL_CALL (36+2)
PutMem4 pCode, &HEA83D18B: pCode = pCode + 4 'mov edx, ecx
PutMem4 pCode, &H4E2C101: pCode = pCode + 4 'sub edx, 1
'shl edx, 4
'LBL_NEXT_ARG
PutMem4 pCode, &H30C408B: pCode = pCode + 4 'mov eax, [eax+0Ch]
PutMem4 pCode, &H8C083C2: pCode = pCode + 4 'add eax, edx
PutMem4 pCode, &H68B30FF: pCode = pCode + 4 'push [eax]
PutMem4 pCode, &H9001E983: pCode = pCode + 4 'mov eax, [esi]
'sub ecx, 1
PutMem4 pCode, &H3B10EA83: pCode = pCode + 4 'sub edx, 10h
PutMem4 pCode, &H90901448: pCode = pCode + 4 'cmp ecx, [eax+14h]
PutMem4 pCode, &H9090E67F: pCode = pCode + 4 'jg LBL_NEXT_ARG (-24-2)
'LBL_CALL
PutMem4 pCode, &H8B0C55FF: pCode = pCode + 4 'call [ebp+0Ch]
PutMem4 pCode, &H2891455: pCode = pCode + 4 'mov edx, [ebp+14h]
'mov [edx], eax
PutMem4 pCode, &H5D5EC033: pCode = pCode + 4 'xor eax, eax
'pop esi
'pop ebp
PutMem1 pCode, &HC3: pCode = pCode + 4 'ret
Next
'# Invoke 0-4
For i = 0 To 4
PutMem4 pFirstVTEntry + &H24& + 4 * i, pCode
PutMem4 pCode, &H90EC8B55: pCode = pCode + 4 'push ebp
'mov ebp, esp
If i = 4 Then
PutMem4 pCode, &H901C458B: pCode = pCode + 4 'mov eax, [ebp+1Ch]
PutMem4 pCode, &H9018558B: pCode = pCode + 4 'mov edx, [ebp+18h]
PutMem4 pCode, &H90144D8B: pCode = pCode + 4 'mov ecx, [ebp+14h]
PutMem4 pCode, &H90515250: pCode = pCode + 4 'push eax
'push edx
'push ecx
PutMem4 pCode, &H5010458B: pCode = pCode + 4 'mov eax, [ebp+10h]
ElseIf i Then
If i >= 3 Then
PutMem4 pCode, &H9018558B: pCode = pCode + 4 'mov edx, [ebp+18h]
End If
If i >= 2 Then
PutMem4 pCode, &H90144D8B: pCode = pCode + 4 'mov ecx, [ebp+14h]
End If
PutMem4 pCode, &H9010458B: pCode = pCode + 4 'mov eax, [ebp+10h]
If i >= 3 Then
PutMem1 pCode, &H52: pCode = pCode + 1 'push edx
End If
If i >= 2 Then
PutMem1 pCode, &H51: pCode = pCode + 1 'push ecx
End If
PutMem1 pCode, &H50: pCode = pCode + 1 'push eax
Do While (pCode Mod 4)
PutMem1 pCode, &H90: pCode = pCode + 1
Loop
End If
PutMem4 pCode, &H900C4D8B: pCode = pCode + 4 'mov ecx, [ebp+0C]
PutMem4 pCode, &HD1FF9090: pCode = pCode + 4 'call ecx
PutMem4 pCode, &H9000558B + &H10000 * (&H10 + i * 4): pCode = pCode + 4 'mov edx, [ebp+XX]
PutMem4 pCode, &H2899090: pCode = pCode + 4 'mov [edx], eax
PutMem4 pCode, &HC35DC033: pCode = pCode + 4 'xor eax, eax
'pop ebp
'ret
Next
End Sub
Conclusion :
Bon, ben amusez-vous ^^
J'ai pris du plaisir a coder cela, comme quoi, un debugger (IDA), c'est pas fait que pour cracker, mais bien pour débugger :p
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.