OVH Cloud OVH Cloud

Sel-Modifying Code: erf, j'avais oublié de poster un exemple :-(

5 réponses
Avatar
AMcD®
Eh oui, j'ai oublié de filer l'exemple (basique) annoncé il y a quelques
jours. Désolé.

Bon alors, voici. C'est évidemment de l'ultra-basique et utilise le
classique WriteProcessMemory(). On peut évidemment faire bien plus hard et
technique, mais bon, je me méfie now :-).

En prime, quelques commentaires gratuits !

A) Déclarations destinées à l'assembleur

.686
.MODEL FLAT,STDCALL

B) Import des fonctions

EXTERN CloseHandle@4:PROC
EXTERN ExitProcess@4:PROC
EXTERN GetCurrentProcessId@0:PROC
EXTERN MessageBoxW@16:PROC
EXTERN OpenProcess@12:PROC
EXTERN WriteProcessMemory@20:PROC

C) Les données (ouah, de l'Unicode en assembleur :-) )

.DATA
szMessage DW 'H','e','l','l','o',' ','W','o','r','l','d',' ','!',0
szCaption DW 'W','I','N','3','2',' ','A','S','M',0
hProcess DWORD 0
byBytes DB 6Ah,40h,68h,1Ch,20h,40h,00h,68h,00h,20h,40h,00h,6Ah,00h

D) Le code

.CODE
@Begin:

D0) On modifie les droits de notre page de code

CALL GetCurrentProcessId@0
PUSH EAX
PUSH 1
PUSH 000028h ; 0x0020 + 0x0008
CALL OpenProcess@12
MOV hProcess,EAX

D1) Ici, on peut écrire dans le code en train de s'exécuter

PUSH 0
PUSH 0Eh
PUSH OFFSET byBytes
PUSH Yo
PUSH EAX
CALL WriteProcessMemory@20

D2) On écrit les octets du code destiné à MessageBox()

PUSH hProcess
CALL CloseHandle@4

D3) On les écrit ici. Cela dit, on s'en douterait, vu l'improbable CMP DWORD
PTR SS:[EBP-30],0 :-)

Yo:
ADD ESP,208
CMP DWORD PTR DS:[EDX+8],1
CMP DWORD PTR SS:[EBP-30],0

D4) On affiche la boîte de dialogue

CALL MessageBoxW@16
PUSH 0H

D5) C'est fini

CALL ExitProcess@4
END @Begin

--
AMcD®

http://arnold.mcdonald.free.fr/

5 réponses

Avatar
Clément
"AMcD®" a écrit dans le message de news:
42cb1089$0$21738$
Eh oui, j'ai oublié de filer l'exemple (basique) annoncé il y a quelques
jours. Désolé.

Bon alors, voici. C'est évidemment de l'ultra-basique et utilise le
classique WriteProcessMemory(). On peut évidemment faire bien plus hard et
technique, mais bon, je me méfie now :-).

En prime, quelques commentaires gratuits !



Merci !
Même si je comprends pas tout, c'est intéressant !
Est-ce que c'est complètement impossible de faire la même chose en C ? (sans
ASM inline)

Merci encore.
Spoofix.
Avatar
AMcD®
Clément wrote:

Est-ce que c'est complètement impossible de faire la même chose en C
? (sans ASM inline)



Heu, manipuler des opcodes en C ou autre langage, je ne sais pas faire. Cela
se fait, normalement, en langage d'assemblage, pur ou inline. Tu sais,
malgré tout ce qu'on peut lire de-ci, de-là, le hacking, c'est quand même
toujours l'obligation de mettre de l'ASM à un endroit ou un autre.

--
AMcD®

http://arnold.mcdonald.free.fr/
Avatar
Cyrille Szymanski
"AMcD®" wrote in
news:42cd1e39$0$12598$:

Clément wrote:

Est-ce que c'est complètement impossible de faire la même chose en C
? (sans ASM inline)



Heu, manipuler des opcodes en C ou autre langage, je ne sais pas
faire. Cela se fait, normalement, en langage d'assemblage, pur ou
inline. Tu sais, malgré tout ce qu'on peut lire de-ci, de-là, le
hacking, c'est quand même toujours l'obligation de mettre de l'ASM à
un endroit ou un autre.



A partir du moment où tu arrives à obtenir l'adresse de ce qui t'intéresse
c'est faisable.

En C, il faudra jongler judicieusement pour obtenir des adresses de
portions de code situées au beau milieu d'une procédure, mais avec un peu
de jugeotte et une connaissance a priori du compilo c'est jouable.

Le code sera plus ou moins illisible alors qu'en ASM il reste simple.
Partant de là je ne vois pas franchement l'intérêt de se casser la tête.

--
Cyrille Szymanski
Avatar
Alexandre
bonjour,

"AMcD®" a écrit dans le message de news:
42cb1089$0$21738$
Eh oui, j'ai oublié de filer l'exemple (basique) annoncé il y a quelques
jours. Désolé.


<snip>

ça me fait penser à un petit "challenge" vu il y a quelques temps sur je
sais plus quel site, qui est très sympa :
faire un programme (en C par exemple, mais n'importe quel programme évolué
suffit) qui affiche son code source.... (bien entendu, pas seulement en mode
debug...)
Avatar
Patrick 'Zener' Brunet
Bonjour.

Erf : c'est la fonction d'erreur ? :-D

Je réponds à AMcD® qui a écrit :
Clément wrote:

Est-ce que c'est complètement impossible de faire la même chose en C
? (sans ASM inline)



Heu, manipuler des opcodes en C ou autre langage, je ne sais pas
faire. Cela se fait, normalement, en langage d'assemblage, pur ou
inline. Tu sais, malgré tout ce qu'on peut lire de-ci, de-là, le
hacking, c'est quand même toujours l'obligation de mettre de l'ASM à
un endroit ou un autre.



J'avais essayé à une époque de déclarer des tableaux sur la pile et ensuite,
d'utiliser un pointeur de fonction pour plonger dedans. Mais donc en fait
c'est de l'ASM déguisé, quoiqu'avec des tableaux de pointeurs de
fonctions...

Avec cette technique il faut jouer fin avec le compilo + optimiseur : bien
gérer les conventions d'appel. En fait dans ce type de plongée, les
accidents les plus graves sont à la remontée.

Le but de la manip en C était bien sûr de faire du code polymorphe et
portable à la fois.

Tout ceci est très joli (et utilisable aussi à des fins parfaitement
licites).

Pour info, le dernier numéro de MISC est presque entièrement consacré au
polymorphisme du code, et il y est même question de binaire
multi-plate-forme...

Mais je suis sûr que vous l'avez déjà lu vous aussi ;-)

Cordialement,

--
/***************************************
* Patrick BRUNET
* E-mail: lien sur http://zener131.free.fr/ContactMe
***************************************/