comment utiliser de lassembleur et recupere une valeur en vc++ ?
7 réponses
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++
Mais j'ai quelques doutes sur l'efficacité de ta méthode...
-- « Always look at the bright side of the life... »
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)
"Thierry" <yarglah@com.invalid> a écrit dans le message news:
XnF953CB857A5C45pouletetcetc@212.27.42.73...
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)
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)
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...
-- « 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
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
"dark poulpo" <syn-ack@wanadoo.fr> a écrit dans le message news:
cets6d$30p$1@news-reader1.wanadoo.fr...
"Thierry" <yarglah@com.invalid> a écrit dans le message news:
XnF953CC337F8872pouletetcetc@212.27.42.74...
> 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.
"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
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
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
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
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.