OVH Cloud OVH Cloud

comment utiliser de lassembleur et recupere une valeur en vc++ ?

7 réponses
Avatar
dark poulpo
rebonjour,
je m'explique, je voudrais poser un anti debogueur
le principe est le suivant :

je push une valeur, je pop, et je regarde la valeur dans la pile juste apres
lavoir popé, si la valeur est differente que celle que je vient de poper, ca
veut dire que ya eu un programme dans l'interruption 3. mon probleme est que
je ne sais pas recuperer une valeur de l'assembleur vers le c++

merci de m'aider

7 réponses

Avatar
Thierry
Bonjour,

dark poulpo a écrit :

DWORD dwPOP = 51;
_asm
{
pop dwPOP
push dwPOP
}

Mais j'ai quelques doutes sur l'efficacité de ta méthode...

--
« Always look at the bright side of the life... »
Avatar
dark poulpo
"Thierry" a écrit dans le message news:

Bonjour,

dark poulpo a écrit :

DWORD dwPOP = 51;
_asm
{
pop dwPOP
push dwPOP
}

Mais j'ai quelques doutes sur l'efficacité de ta méthode...

--
« Always look at the bright side of the life... »



merci,

c normal il manque une instruction à la fin et tu as inverse les 2 autres

DWORD dwPOP = 51;
_asm
{
push dwPOP
pop dwPOP
mov DWORD dwPOP , [esp-4] // je sai spas si c bon comme ca?
}
if (dwPOP == 51) ok
else ya un pas a pas

car logiquement, si ya pas eu de debogueur, jai exactement la meme valeur
que jai passer dans le push, et recup dans le pop,
si ya eu un pas a pas qui vient de passer dessus, alors la valeur de la pile
a changé. (c une vieille methode qui a fait c preuve)
Avatar
Thierry
Bonjour,

dark poulpo a écrit :

c normal il manque une instruction à la fin et tu as inverse les 2
autres



Je cherchais pas a comparer mais juste a remettre la pile dans l'état où
je l'ai trouvée...

mov DWORD dwPOP , [esp-4]



DWORD dwPOP = 51;
_asm
{
push dwPOP
pop dwPOP
mov eax, dword ptr [esp-04h]
mov dwPOP, eax
}
if (dwPOP == 51)
{
MessageBox(NULL, "OK", "", MB_OK);
}
else MessageBox(NULL, "Debug", "", MB_OK);

Mais ça ne marche pas... (OK même en debug)

--
« Always look at the bright side of the life... »
Avatar
dark poulpo
"Thierry" a écrit dans le message news:

Bonjour,

dark poulpo a écrit :

> c normal il manque une instruction à la fin et tu as inverse les 2
> autres

Je cherchais pas a comparer mais juste a remettre la pile dans l'état où
je l'ai trouvée...

> mov DWORD dwPOP , [esp-4]

DWORD dwPOP = 51;
_asm
{
push dwPOP
pop dwPOP
mov eax, dword ptr [esp-04h]
mov dwPOP, eax
}
if (dwPOP == 51)
{
MessageBox(NULL, "OK", "", MB_OK);
}
else MessageBox(NULL, "Debug", "", MB_OK);

Mais ça ne marche pas... (OK même en debug)

--
« Always look at the bright side of the life... »




c pas pour regarder si je suis en mode debug, mais pour eviter d'etre tracé
par softice ou autre debogeur, essai plutot avec ca
Avatar
dark poulpo
"dark poulpo" a écrit dans le message news:
cets6d$30p$
"Thierry" a écrit dans le message news:

> Bonjour,
>
> dark poulpo a écrit :
>
> > c normal il manque une instruction à la fin et tu as inverse les 2
> > autres
>
> Je cherchais pas a comparer mais juste a remettre la pile dans l'état où
> je l'ai trouvée...
>
> > mov DWORD dwPOP , [esp-4]
>
> DWORD dwPOP = 51;
> _asm
> {
> push dwPOP
> pop dwPOP
> mov eax, dword ptr [esp-04h]
> mov dwPOP, eax
> }
> if (dwPOP == 51)
> {
> MessageBox(NULL, "OK", "", MB_OK);
> }
> else MessageBox(NULL, "Debug", "", MB_OK);
>
> Mais ça ne marche pas... (OK même en debug)
>
> --
> « Always look at the bright side of the life... »


c pas pour regarder si je suis en mode debug, mais pour eviter d'etre


tracé
par softice ou autre debogeur, essai plutot avec ca





oué, ya que j'ai un probleme de mémoire, mes neuronnes me font faux bon.
effectivement jai testé aussi avec un debogueur pour tracer le code, et ca
marche pas non plus,
je me rapelle l'avoir lu ya plusieurs années dans un texte, et il me
semblait que ca fonctionné vu la logique de la chose.
peut etre cela marcvhait a lepoque ou windows 95 n'existait pas encore.

je vais voir si je retrouve ca
Avatar
dark poulpo
ayé jaio trouve la source de ce que javais lu, effectivement ca fonctionnais
bien avant,, vu la taille des registres, par contre c pour int 1

<!--StartFragment-->Anti-Debugger Techniques: INT 1 Tracing Destroys the
Stack
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When tracing through code, with INT 1, the 6 bytes below SP are
overwritten with the pushed returnig IP, CS, and Flags. There are 2 ways
to take advantage of this fact. The first is to PUSH a value on to the
stack, POP it, and then adjust SP and POP it again to see if it changes.
If it has, the code has been traced. Here is an example:
------------------------------------------------------------------------

PUSH AX
POP AX
DEC SP
DEC SP
POP BX ;BX should point to the pushed AX.
CMP AX,BX
JNE CODE_IS_TRACED
Avatar
Thierry
"dark poulpo" écrivait
news:cetuvi$9uu$:

ayé jaio trouve la source de ce que javais lu, effectivement ca
fonctionnais bien avant,, vu la taille des registres, par contre c
pour int 1



C'est du 16 bits. Et quand bien même ça eut marché c'est assez facile de
voir a quoi ça sert et patcher pour eviter le test.