Appel de pointeur de fonctions - api sans les declarer

Description

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

Codes Sources

A voir également

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.