IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

[Trucs & Astuces] Injection de code . . .


Sujet :

VB 6 et antérieur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 131
    Par défaut [Trucs & Astuces] Injection de code . . .
    Sep.

    C'est la rentrée et il est temps de retourner au charbon.
    Après la gestion des pointeurs, dans la série «J'aime les trucs tordus», «piqure de rappel», etc.
    bref, plus simplement pour montrer à nouveau l'étendue des possibilités de programmation du langage VB
    au même titre que d'autres langages, voici un exemple connu du principe d'injection de code assembleur.

    L' «injection» du code ASM est effectuée en détournant la fonction CallWindowProc de l'api User32
    que l'on utilise habituellement lors de sous-classement.
    Ici l'argument Function(lpPrevWndFunc) pointe directement sur une chaine de caractères qui sera exécutée comme une procédure à part entière ;
    les autres paramètres servent principalement au retour des valeurs des registres.

    L'exemple suivant utilise la même procédure de code ASM et retourne selon l'opcode défini :
    la valeur du compteur de cycle (RDSTC) ou l'identification du CPU(si possible).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
                Private Declare Function CallWindowProcS Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As String, ByRef hwnd As Long, ByRef Msg As Long, ByRef wParam As Long, ByRef lParam As Long) As Long
     
                Public Function RDTSC()
                    Dim a As Long, b As Long, c As Long, d As Long, ret As Variant
     
                    ' Opcode: 0F 31
                    a = &HF: b = &H31    
                    Call_ASM a, b, c, d
     
                    ret = (d * 4294967296#) + a     ' 2^32=4294967296#
     
                    RDTSC = CDec(ret)
                End Function
     
     
                Public Function CPUID() As String
                    Dim ret As Long, a As Long, b As Long, c As Long, d As Long
     
                    ' Opcode: 0F A2
                    a = &HF: b = &HA2        ' EAX=0:ID vendeur/1:Signature/2:Config/3:Serial'
                    if Call_ASM(a, b, c, d, 1) then CPUID = Right("00000000" + Hex(d), 8) + Right("00000000" + Hex(a), 8)
                End Function
     
                Private Function Call_ASM(eax As Long, ebx As Long, ecx As Long, edx As Long, Optional ID As Long = 1)
                    Dim Asm As String, a As Long, b As Long, c As Long, d As Long
     
                    ' Sauvegarder les registres ESI, EBP
                    Asm = Asm + Chr(&H56)                         '56                 push esi                    '
                    Asm = Asm + Chr(&H55)                         '55                 push ebp                    '
                    Asm = Asm + Chr(&H8B) + Chr(&HEC)             '8B EC              mov ebp,esp                 '
     
                    ' Corps de procédure    
                    Asm = Asm + Chr(&H8B) + Chr(&H75) + Chr(&HC)  '8B 75 0C           mov esi,dword ptr [ebp+0Ch] '    
                    Asm = Asm + Chr(&H8B) + Chr(&H6)              '8B 06              mov eax,dword ptr [esi]     '
     
     
                    Asm = Asm + Chr(eax) + Chr(ebx)               'Opcode                                  '
     
                    Asm = Asm + Chr(&H8B) + Chr(&H75) + Chr(&HC)  '8B 75 0C           mov esi,dword ptr [ebp+0Ch] '
                    Asm = Asm + Chr(&H89) + Chr(&H6)              '89 06              mov dword ptr [esi],eax     '
     
                    Asm = Asm + Chr(&H8B) + Chr(&H75) + Chr(&H10) '8B 75 10           mov esi,dword ptr [ebp+10h] '
                    Asm = Asm + Chr(&H89) + Chr(&H1E)             '89 1E              mov dword ptr [esi],ebx     '
                    Asm = Asm + Chr(&H8B) + Chr(&H75) + Chr(&H14) '8B 75 14           mov esi,dword ptr [ebp+14h] '
                    Asm = Asm + Chr(&H89) + Chr(&HE)              '89 0E              mov dword ptr [esi],ecx     '
                    Asm = Asm + Chr(&H8B) + Chr(&H75) + Chr(&H18) '8B 75 18           mov esi,dword ptr [ebp+18h] '
                    Asm = Asm + Chr(&H89) + Chr(&H16)             '89 16              mov dword ptr [esi],edx     '
     
     
                    ' Restaurer les registres ESI, EBP
                    Asm = Asm + Chr(&H5D)                         '5D                 pop ebp                     '
                    Asm = Asm + Chr(&H5E)                         '5E                 pop esi                     '
     
                    ' Fin
                    Asm = Asm + Chr(&HC2) + Chr(&H10) + Chr(&H0)  'C2 10 00           ret 10h                     '
     
                    eax = ID: ebx = 0: ecx = 0: edx = 0               
                    Call_ASM = CallWindowProcS(Asm, eax, ebx, ecx, edx)
                End Function
    La possibilité d'injecter du code assembleur ouvre toutes les portes imaginables et permet contrairement à l'idée reçue l'accès direct au Bios.
    Evidemment cette méthode est inégalable en terme de vitesse comparativement à une méthode employant WMI (~50 000/1).

  2. #2
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 131
    Par défaut
    Cela n'a pas l'air de passionner les foules !

  3. #3
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Citation Envoyé par DarkVader Voir le message
    Cela n'a pas l'air de passionner les foules !
    Bonjour, DarkVader,

    Détrompe-toi et merci pour cette démonstration . Cette méthode m'évite des tremplins superflus (NASM, bien que gratuit), des lourdeurs (dll résultante ajoutée) et m'intéresse beaucoup.

    EDIT : je suis, par exemple, en train de m'essayer à l'appliquer à l'utilisation de données binaires (de chaînes) au lieu de leur valeur ascii...

  4. #4
    Membre émérite
    Inscrit en
    Décembre 2007
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 512
    Par défaut
    Bonjour,

    Si,si trés intéressant !
    De même que :Lecture Ecriture en mémoire du 17/07/2009

  5. #5
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 131
    Par défaut
    Bonjour,
    VB6 qui est sorti en 98 a été mis au rebus quasiment après sa sortie avec .net en 2002
    (dont en passant l'obsolescence est déjà programmée pour 2012 au profit du seul C# comme il fallait s'y attendre)
    or il faut un temps suffisant pour faire le tour d'un langage et dégager toutes ses possibilités.
    C'est l'idée sous-jacente à cette série [Trucs et Astuces] que de faire connaître des aspects méconnus du langage
    d'où l'intérêt de faire savoir quand le sujet intéresse ou étonne ou même quand cela n'intéresse pas du tout.

  6. #6
    Membre émérite
    Inscrit en
    Décembre 2007
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 512
    Par défaut
    Et dire qu'il y en a qui prétendent ( comme je l'ai lu dans une discussion sur ce forum) que VB6 est un langage pour "gamin de 12 ans"...

    A méditer

    A+

  7. #7
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 131
    Par défaut
    La plupart de ceux qui critique le fait par manque de connaissance.
    A la question «Peut-on faire ... avec VB» que l'on a régulièrement sur ce forum
    (et c'est également vrai pour VBA ou VBS),
    il faudrait répondre : «La bonne question est "Comment faire ..."»
    car jusqu'à maintenant en ce qui me concerne, je n'ai pas rencontré de problème sans solution.

Discussions similaires

  1. injection de code dans une application
    Par youp_db dans le forum C
    Réponses: 16
    Dernier message: 21/07/2006, 12h33
  2. [Excel] Injecter du code VBA par le biais d'un fichier *.cvs
    Par llsn dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/05/2006, 20h42
  3. trucs et astuces XML
    Par grishka dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 09/09/2004, 13h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo