(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