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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
procCheckDebugger = (MYPROC_2)GetProcAddress(hKernel32, "IsDebuggerPresent");
j'utilise :

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
__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.