@Shell Root: Más bien sería no abrir el chat para hablar con Ark
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ú#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
invoke<%TIPO_DE_RETORNO%,%ALGORITMO_USADO%>(%NOMBRE_DLL%,%NOMBRE_FUNCION%)(%N_PARAMETROS%,%PARAMETRO1%,%PARAMETRO2%,...,%PARAMETRON%);
#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);
}
http://foro.h-sec.org/programacion/(template)-cryptapi-cifra-la-llamada-a-las-apis-d
http://foro.elhacker.net/analisis_y_diseno_de_malware/srccasm_clshookapi-t281292.0.html
Cita de: Eternal Idol 7D en 21 Enero 2013, 20:59 PMNo la función que yo quiero
No, una cadena vacia tiene un tamaño de 0 caracteres.
Cita de: mDrinky en 21 Enero 2013, 21:04 PMDevuelve 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
La mia si funciona con una cadena nula