(C) MITOSIS #2 E-Zine/GEDZAC 2004

                                              
Tema          : Tecnicas Simples Antidebugging
Autor         : MachineDramon
Válido para   : Microsoft Visual Basic 6.0

Las tecnicas para detectar  un debugger  que  se expondran aqui, son simples y no
detendran a alguien experimentado por  mucho tiempo, pero siempre es mejor que un
virus tenga antidebugging.
Para tecnicas mas avanzadas  consultar el articulo  escrito por Jtag y ErGrone en
mitosis 1 sobre antidebug en asm.

5 Cosejos:
-----------
1: Al crear el sub con las instrucciones anti-debug hay que ponerle un nombre que
no despierte sospechas, pos  si hace un desensamblado y ve "sub anti-debug()", ya
lo descubrio, poner algo como: "sub mircdcc()", etc

2: Encripten todo lo que puedan el sub anti-debug, ya que mientras menos entienda
el analizador que es lo que hacemos mejor.

3: Si es posible coloque  el  sub anti-debug unas 3 veces en el code, con nombres
diferentes, esto para confundir.

4: Llamen al sub o a los sub anti-debug desde diferentes partes del code no sola-
mente al comienzo, llamarlo desde diferentes puntos unas 5 veces minimo.

5: Si usamos valores numericos en el sub, obtengamoslos mediante operaciones, por
ejemplo si queremos poner un -1 no lo pongamos de frente 
sino ((Asc("%") - 1) / -2) + ((8 * 2) + (6 Xor 7)) esta operacion = -1
y puede ayudar a confundir al que analize.
---------------------------------------------------------------------------------

'Declaramos apis
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal _
lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, _
lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal _
dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long

Private Declare Function GetCommandLine Lib "kernel32" Alias "GetCommandLineA" _
() As String

Private Declare Function IsDebuggerPresent Lib "kernel32" () As Long

Sub MircDCC()
'Resumidor de errores
On Error Resume Next

tmpreg = "HKEY_LOCAL_MACHINE\Software"

'Colocamos en un array unas llaves del reg, que pertenecen al Softice
sRg = Array(tmpreg & "\NuMega\SoftICE\InstallDir", _
tmpreg & "\Microsoft\Windows\CurrentVersion\Uninstall\SoftICE\UninstallString", _
tmpreg & "\Microsoft\Windows\CurrentVersion\App Paths\Loader32.Exe\Path")

'Iniciamos bucle for para tratar de leer las llaves del array, si existe 
'alguna Softice esta instalado y terminamos el programa.
For x = 0 To UBound(sRg)
sRr = Rr(sRg(x))
If sRr <> "" Then End
Next

'Estas strings no sirven para identificar los vxd de softice en win9x y NT
sHn = Array("\\\\.\\SICE", "\\\\.\\SIWVID", "\\\\.\\NTICE")

'Bucle for para verificar la existencia en memoria de alguno de los vxd
'si se devuelve un handle valido al llamar a createfile, hay softice
'y terminamos el programa
For i = 0 To UBound(sHn)
sHle = CreateFile(sHn(i), &H40000000, &H1 Or &H2, ByVal 0&, 3, 0, 0)
If sHle <> -1 Then End
Next

'Esta api nos permite saber si nuestro programa se ejecuta desde un debugger
'devuelve 0 si no y 1 si hay debugger, si hay debugger terminamos el programa
If IsDebuggerPresent() <> 0 Then End

'Si no se ha creado antes, creamos el objeto ws
Set Bw = CreateObject("WScript.Shell")

'Iniciamos un bucle for para listar las variables de entorno, definidas en
'el equipo, si softice esta instalado habra una como: "cmdline=winice"
'si la encontramos terminamos el programa
For Each strEnv In Bw.Environment("PROCESS")
   If InStr(LCase(strEnv), "cmdline") And InStr(LCase(strEnv), "winice") Then End
Next

'Llamamos a GetCommandLine para obtener el path del virus, se ob-
'tiene por ejemplo: "C:\virus.exe"  ,si se ejecuta desde un debugger:
'C:\virus.exe  ,observese que desde un debugger no tiene comillas
'entonces obtenemos el codigo ASCII del primer caracter de la izquierda
'que deberia ser 34, osea el codigo de una comilla, si es diferente hay 
'debugger y terminamos el programa
If Asc(Left(GetCommandLine(), 1)) <> 34 Then End
End Sub
---------------------------------------------------------------------------------

(C) MITOSIS #2 E-Zine/GEDZAC 2004