Bonjour, j'ai fait une DLL que je souhaite protéger de tentative de reversing, de débogage, j'aurais donc deux questions.
La première : j'utilise la plus basique (et la plus simple à bypasser), celle du IsDebuggerPresent, cependant, en reversant la DLL on retrouve très facilement l'utilisation de cette API et une modification "on the fly" du binaire permettrait de bypasser cette protection, j'essaie donc de camoufler l'utilisation de cette API, comme je peux, par exemple j'utilise deja GetProcAddress pour une liaison dynamique avec cette API, pour éviter qu'elle n'apparaisse dans la table IAT, et ensuite je n'utilise pas directement la string "IsDebuggerPresent" en paramètre :
au lieu de procéder ainsi :
procCheckDebugger = (MYPROC_2)GetProcAddress(hKernel32, "IsDebuggerPresent");
j'utilise :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| __asm {
push 0x00000074
push 0x6E657365
push 0x72507265
push 0x67677562
push 0x65447349
lea eax, [esp]
push eax
push hKernel32
call GetProcAddress
mov procCheckDebugger, eax
add esp, 0x14
} |
Je ne sais pas si c'est une solution très efficace, mais j'essaie au mieux de cacher la string "IsDebuggerPresent" passée en paramètre. Mais en utilisant cette seconde solution, la DLL ne fonctionne pas, pourtant je restaure la pile comme il faut, c'est là que j'aurais notamment besoin de vous ...
Seconde question : je pensais également déranger de potentiels débuggueurs en modifiant les DRx, donc en les effaçant, pour cela j'utilise GetThreadContext et SetThreadContext.. mais à quel moment "privilégié" je pourrais effacer ces registres de deug DRx ?? parce que le but est d'empêcher au debugger de placer des breakpoints, donc à quel moment effacer les DRx ??
J'attends de vos lumières, merci.
Partager