¬°Huellas digitales del autor de ZeuS Botnet!

El código fuente de ZeuS Botnet ya está disponible para Descargar. Derek Jones (el autor de este artículo) imagina que hay algunas organizaciones a las que les gustaría hablar con los autores de este código.
¬°Huellas digitales del autor de ZeuS Botnet! 1

Todos los desarrolladores tienen h√°bitos de codificaci√≥n, es decir, generalmente tienen una forma particular de escribir cada construcci√≥n de codificaci√≥n. Los diferentes desarrolladores tienen diferentes conjuntos de h√°bitos y, a veces, los desarrolladores individuales tienen una forma de escribir una construcci√≥n de lenguaje que rara vez utilizan otros desarrolladores. ¬ŅSon los h√°bitos del desarrollador lo suficientemente √ļnicos como para que puedan usarse para identificar a las personas a partir de su c√≥digo? No tengo suficientes datos para responder esa pregunta. Leyendo a trav√©s de la fuente C ++ de ZeuS, vi algunos patrones de uso inusuales (no s√© lo suficiente sobre los patrones de uso comunes en PHP para decir mucho sobre esta fuente) que los lectores pueden buscar en el c√≥digo que encuentran, tal vez poniendo nombre a El autor de este c√≥digo.

La fuente est√° escrita en C ++ (32.5 KLOC de origen del cliente) y PHP (7.5KLOC de la fuente del servidor) y es de alta calidad (el c√≥digo C ++ podr√≠a hacer m√°s comentarios, digamos al nivel dado en el c√≥digo PHP), muchas compa√Ī√≠as podr√≠an aumentar la calidad de su c√≥digo siguiendo el est√°ndar de codificaci√≥n que este autor parece estar siguiendo La fuente est√° bien dise√Īada y hay muchos nombres de variables significativos.

Entonces, ¬Ņqu√© podemos decir sobre las personas que escribieron este c√≥digo?

  • Hay un autor; basado en patrones de uso consistentes y nada me llama la atenci√≥n lo suficientemente diferente como para que alguien m√°s pueda escribirlo,
  • El autor habla ingl√©s con fluidez; basado en el hecho de que no detect√© ning√ļn identificador deletreado usando combinaciones de palabras inusuales que a menudo ocurren cuando un desarrollador no sabe ingl√©s,
  • El uso que m√°s me llam√≥ la atenci√≥n es:
    for(;; p++)if(*p == '\' || *p == "https://thehackernews.com/" || *p == 0)
      {
    ...
    

    Esto lleva al extremo la idea de que si un ‘encabezado de control’ tiene una sola declaraci√≥n asociada, entonces ambos aparecen en la misma l√≠nea; este uso ocurre com√ļnmente con declaraciones if y esto declaraci√≥n for / while el uso es muy raro (este uso tambi√©n ocurre en el c√≥digo PHP),

  • El uso de verdadero / falso en condicionales es similar al de los desarrolladores novatos, por ejemplo escribiendo:
    return CWA(kernel32, RemoveDirectoryW)(path) == FALSE ? false : true;
    // and
    return CWA(shlwapi, PathCombineW)(dest, dir, p) == NULL ? false : true;
    // also
    return CWA(kernel32, DeleteFileW)(file) ? true : false;
    

    en una función que devuelve bool en lugar de:

    return CWA(kernel32, RemoveDirectoryW)(path);
    //and
    return CWA(shlwapi, PathCombineW)(dest, dir, p) != NULL
    // and
    return CWA(kernel32, DeleteFileW)(file);
    

    El autor no es un desarrollador novato, quiz√°s en alg√ļn momento en el pasado fueron mordidos gravemente por un error del compilador C ++ de Microsoft, descubrieron que este uso solucion√≥ el problema y lo han usado desde entonces,

  • El autor alinea verticalmente el operador de asignaci√≥n en secuencias de instrucciones pero no en una secuencia de definiciones que contienen un inicializador:
    // = not vertically aligned here
        DWORD itemMask = curItem->flags & ITEMF_IS_MASK;
        ITEM *cloneOfItem = curItem;
    // but is vertically aligned here:
        desiredAccess       |= GENERIC_WRITE;
        creationDisposition  = OPEN_ALWAYS;
    

    La alineaci√≥n vertical no es com√ļn y hubiera dicho que la alineaci√≥n se ve√≠a con mayor frecuencia en definiciones que en declaraciones, al contrario de lo que se ve en este c√≥digo,

  • Los bucles sin terminaci√≥n se crean utilizando for (;;) en lugar de los m√°s comunes (TRUE),
  • El autor est√° feliz de usar goto para saltar al final de una funci√≥n, no es un h√°bito raro, pero a muchos desarrolladores se les ha ense√Īado que ese uso es una mala pr√°ctica (dir√≠a que depende, pero esa discusi√≥n pertenece en otra publicaci√≥n),
  • Las conversiones innecesarias a menudo aparecen en constantes negativas (innecesarias en el sentido de que el compilador debe realizar la conversi√≥n impl√≠citamente). Esta podr√≠a ser otra instancia de un error anterior del compilador de Microsoft que hace que un desarrollador adopte un h√°bito de codificaci√≥n para solucionar el problema.

¬ŅPodr√≠a la fuente haber sido procesada por un formateador de c√≥digo para eliminar la informaci√≥n de huellas digitales? Yo creo que no. Hay peque√Īas inconsistencias en el dise√Īo aqu√≠ y all√° que sugieren un error humano, tambi√©n el dise√Īo autom√°tico tiende a tener una apariencia de ‘plantilla’ que este c√≥digo no tiene.