elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


  Mostrar Mensajes
Páginas: 1 2 3 4 5 [6] 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ... 28
51  Programación / Programación C/C++ / Re: contraseña disimulada con * en: 25 Agosto 2011, 05:38 am
mi versión simplificada  :xD

Código
  1. #include <windows.h>
  2. #include <stdio.h>
  3.  
  4. char *getpass(char *pass,unsigned int length){
  5.  DWORD num,modo,i=0;
  6.  HANDLE input=GetStdHandle(STD_INPUT_HANDLE);
  7.  HANDLE output=GetStdHandle(STD_OUTPUT_HANDLE);
  8.  GetConsoleMode(input,&modo);
  9.  SetConsoleMode(input,modo&~(ENABLE_ECHO_INPUT|ENABLE_LINE_INPUT));
  10.  do{
  11.    ReadConsole(input,&pass[i],1,&num,NULL);
  12.    if(pass[i++]=='\r')break;
  13.    WriteConsole(output,"*",1,&num,NULL);
  14.  }while(i<length);
  15.  pass[i]=0;
  16.  WriteConsole(output,"\n",1,&num,NULL);
  17.  SetConsoleMode(input,modo);
  18.  return pass;
  19. }
  20.  
  21. int main(void){
  22.  char pass[32]={0};
  23.  printf("ingrese clave: ");
  24.  getpass(pass,sizeof(pass));
  25.  puts(pass);
  26.  return 0;
  27. }

S2
52  Programación / Programación C/C++ / Re: ERROR - Process Hollowing en: 16 Agosto 2011, 20:28 pm
el problema se da a la hora de resumir el hilo para continuar la ejecucion, por lo que sospecho que hay algun fallo cuando el exe2 se copia en la memoria del exe1, pero no se a ciencia cierta cual podria ser el fallo, pues cuando intento ejecutar, por ej, el bloc de notas en la calculadora lo hace sin problemas, el fallo lo da cuando intento con otra app.

para "ese código" tenes que asegurarte que ambos ejecutables tengan la misma imagebase, dado que el código no comprueba la imagebase del ejecutable original, en caso de no ser iguales tendrías que asegurarte que el segundo ejecutable tenga el directorio reloc's y realizar el relocado manual... acá tenes un ejemplo de como hacerlo:

Código
  1. #include <windows.h>
  2. #include <stdio.h>
  3.  
  4. typedef ULONG (WINAPI *tNtUnmapViewOfSection)(HANDLE ProcessHandle, PVOID BaseAddress);
  5. typedef ULONG (WINAPI *tNtQueryInformationProcess)(HANDLE ProcessHandle,DWORD ProcessInformationClass,
  6. PVOID ProcessInformation,ULONG ProcessInformationLength,PULONG ReturnLength);
  7.  
  8. typedef struct{
  9.   PIMAGE_DOS_HEADER dos_header;
  10.   PIMAGE_NT_HEADERS nt_headers;
  11.   PIMAGE_SECTION_HEADER section_header;
  12.   LPBYTE file_data;
  13. }NEW_PROCESS_INFO, *PNEW_PROCESS_INFO;
  14.  
  15. typedef struct _PEB {
  16.  BYTE   Reserved1[2];
  17.  BYTE   BeingDebugged;
  18.  BYTE   Reserved2[1];
  19.  PVOID  Reserved3[1];
  20.  PVOID  ImageBaseAddress;
  21.  PVOID  Ldr;
  22.  PVOID  ProcessParameters;
  23.  BYTE   Reserved4[104];
  24.  PVOID  Reserved5[52];
  25.  PVOID  PostProcessInitRoutine;
  26.  BYTE   Reserved6[128];
  27.  PVOID  Reserved7[1];
  28.  ULONG  SessionId;
  29. } PEB, *PPEB;
  30.  
  31. typedef struct _PROCESS_BASIC_INFORMATION {
  32.  PVOID Reserved1;
  33.  PPEB PebBaseAddress;
  34.  PVOID Reserved2[2];
  35.  ULONG_PTR UniqueProcessId;
  36.  PVOID Reserved3;
  37. } PROCESS_BASIC_INFORMATION;
  38.  
  39. BOOL get_replacement_info(const char* full_file_path, PNEW_PROCESS_INFO new_process_info){
  40.  DWORD bytes_read;
  41.  HANDLE hFile=CreateFileA(full_file_path,GENERIC_READ,FILE_SHARE_READ,NULL,
  42.    OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
  43.  if(hFile==INVALID_HANDLE_VALUE)
  44.  return FALSE;
  45.  DWORD file_size=GetFileSize(hFile,NULL);
  46.  new_process_info->file_data=(LPBYTE)malloc(file_size*sizeof(LPBYTE));
  47.  if(ReadFile(hFile,new_process_info->file_data,file_size,&bytes_read,0)){
  48.    new_process_info->dos_header = (PIMAGE_DOS_HEADER)(&new_process_info->file_data[0]);
  49.    new_process_info->nt_headers = (PIMAGE_NT_HEADERS)(&new_process_info->file_data[new_process_info->dos_header->e_lfanew]);
  50.    return TRUE;
  51.  }
  52.  free(new_process_info->file_data);
  53.  CloseHandle(hFile);
  54.  return FALSE;
  55. }
  56.  
  57. BOOL RunPE(LPSTR file, LPSTR host){
  58.  NEW_PROCESS_INFO new_process_info;
  59.  HMODULE hNtdll=GetModuleHandleA("ntdll.dll");
  60.  tNtUnmapViewOfSection NtUnmapViewOfSection=(tNtUnmapViewOfSection)
  61.  (GetProcAddress(hNtdll,"NtUnmapViewOfSection"));
  62.  tNtQueryInformationProcess NtQueryInformationProcess=(tNtQueryInformationProcess)
  63.  (GetProcAddress(hNtdll,"NtQueryInformationProcess"));
  64.  if(!NtUnmapViewOfSection||!NtQueryInformationProcess)
  65.    return FALSE;
  66.  if(get_replacement_info(file,&new_process_info)){
  67.    PROCESS_INFORMATION process_info;STARTUPINFOA startup_info;
  68.    RtlZeroMemory(&startup_info,sizeof(STARTUPINFOA));
  69.    if(CreateProcessA(NULL,host,NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,&startup_info,&process_info)){
  70.      //Get client base address
  71.      PEB Peb;PROCESS_BASIC_INFORMATION pbi;/*ProcessBasicInformation*/
  72.      NtQueryInformationProcess(process_info.hProcess,0,&pbi,sizeof(pbi),NULL);
  73.      ReadProcessMemory(process_info.hProcess,(LPCVOID)pbi.PebBaseAddress,&Peb,sizeof(Peb),NULL);
  74.      //Reloc new process
  75.      if(new_process_info.nt_headers->OptionalHeader.ImageBase!=(DWORD)Peb.ImageBaseAddress){
  76.        DWORD Delta=((DWORD)Peb.ImageBaseAddress-new_process_info.nt_headers->OptionalHeader.ImageBase);
  77.        if(new_process_info.nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress){
  78.          PIMAGE_BASE_RELOCATION pIBR=NULL;
  79.          DWORD pRVAIBR=(DWORD)new_process_info.nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress;
  80.          for(int i=0;i<new_process_info.nt_headers->FileHeader.NumberOfSections;i++){
  81.            PIMAGE_SECTION_HEADER pimage_section_header=(PIMAGE_SECTION_HEADER)(
  82.              (LPBYTE)&new_process_info.nt_headers->OptionalHeader+new_process_info.nt_headers->FileHeader.SizeOfOptionalHeader+
  83.              (i*sizeof(IMAGE_SECTION_HEADER))
  84.            );
  85.            if((pRVAIBR>=pimage_section_header->VirtualAddress)&&(pRVAIBR<=(pimage_section_header->VirtualAddress+pimage_section_header->SizeOfRawData))){
  86.              PIMAGE_SECTION_HEADER section=(PIMAGE_SECTION_HEADER)pimage_section_header;
  87.              pIBR=(PIMAGE_BASE_RELOCATION)(pRVAIBR+section->PointerToRawData-section->VirtualAddress+new_process_info.file_data);
  88.              break;
  89.            }
  90.          }
  91.          PBYTE dest=NULL;
  92.          for(;pIBR->VirtualAddress>0;){
  93.            DWORD pRVAIBR=(DWORD)pIBR->VirtualAddress;
  94.            for(int i=0;i<new_process_info.nt_headers->FileHeader.NumberOfSections;i++){
  95.              PIMAGE_SECTION_HEADER pimage_section_header=(PIMAGE_SECTION_HEADER)(
  96.                (LPBYTE)&new_process_info.nt_headers->OptionalHeader+new_process_info.nt_headers->FileHeader.SizeOfOptionalHeader+
  97.                (i*sizeof(IMAGE_SECTION_HEADER))
  98.              );
  99.              if((pRVAIBR>=pimage_section_header->VirtualAddress)&&(pRVAIBR<=(pimage_section_header->VirtualAddress+pimage_section_header->SizeOfRawData))){
  100.                PIMAGE_SECTION_HEADER section=(PIMAGE_SECTION_HEADER)pimage_section_header;
  101.                dest=(PBYTE)(pRVAIBR+section->PointerToRawData-section->VirtualAddress+new_process_info.file_data);
  102.                break;
  103.              }
  104.            }
  105.            if(dest){
  106.              PWORD relInfo=(PWORD)((PBYTE)pIBR+IMAGE_SIZEOF_BASE_RELOCATION);
  107.              for(DWORD i=0;i<((pIBR->SizeOfBlock-IMAGE_SIZEOF_BASE_RELOCATION)/2);i++,relInfo++){
  108.                if((*relInfo>>12)==IMAGE_REL_BASED_HIGHLOW){
  109.                  PDWORD pAddress=(LPDWORD)(dest+(*relInfo&0xfff));
  110.                  *pAddress+=Delta;
  111.                }
  112.              }
  113.            }
  114.            pIBR=(PIMAGE_BASE_RELOCATION)(((DWORD)pIBR)+pIBR->SizeOfBlock);
  115.          }
  116.        }else{
  117.          puts("no reloc table");
  118.          TerminateProcess(process_info.hProcess,0);
  119.          return FALSE;
  120.        }
  121.        new_process_info.nt_headers->OptionalHeader.ImageBase=(DWORD)Peb.ImageBaseAddress;
  122.      }
  123.      //Remove target memory code
  124.      NtUnmapViewOfSection(process_info.hProcess,(PVOID)new_process_info.nt_headers->OptionalHeader.ImageBase);
  125.      //Allocate memory in target process starting at replacements image base
  126.      VirtualAllocEx(process_info.hProcess,(PVOID)new_process_info.nt_headers->OptionalHeader.ImageBase,
  127.        new_process_info.nt_headers->OptionalHeader.SizeOfImage,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
  128.      //Copy in PE header of replacement process
  129.      WriteProcessMemory(process_info.hProcess,(PVOID)new_process_info.nt_headers->OptionalHeader.ImageBase,
  130.        &new_process_info.file_data[0],new_process_info.nt_headers->OptionalHeader.SizeOfHeaders,NULL);
  131.      //Write in all sections of the replacement process
  132.      for(int i=0;i<new_process_info.nt_headers->FileHeader.NumberOfSections;i++){
  133.        //Get offset of section
  134.        int section_offset=new_process_info.dos_header->e_lfanew+sizeof(IMAGE_NT_HEADERS)+(sizeof(IMAGE_SECTION_HEADER)*i);
  135.        new_process_info.section_header=(PIMAGE_SECTION_HEADER)(&new_process_info.file_data[section_offset]);
  136.        //Write in section
  137.        WriteProcessMemory(process_info.hProcess,(LPVOID)((DWORD_PTR)new_process_info.nt_headers->OptionalHeader.ImageBase+
  138.          new_process_info.section_header->VirtualAddress),&new_process_info.file_data[new_process_info.section_header->PointerToRawData],
  139.          new_process_info.section_header->SizeOfRawData,NULL);
  140.      }
  141.      //Get CONTEXT of main thread of suspended process, fix up EAX to point to new entry point
  142.      CONTEXT thread_context;
  143.      thread_context.ContextFlags=CONTEXT_FULL;
  144.      GetThreadContext(process_info.hThread,&thread_context);
  145.      thread_context.Eax=new_process_info.nt_headers->OptionalHeader.ImageBase+new_process_info.nt_headers->OptionalHeader.AddressOfEntryPoint;
  146.      SetThreadContext(process_info.hThread,&thread_context);
  147.      //Resume the main thread, now holding the replacement processes code
  148.      ResumeThread(process_info.hThread);
  149.      free(new_process_info.file_data);
  150.      return TRUE;
  151.    }else
  152.      puts("createprocess fail!");
  153.  }else
  154.    puts("get_replacement_info fail!");
  155.  return FALSE;
  156. }
  157.  
  158. int main(void){
  159.  RunPE("C:\\WINDOWS\\explorer.exe","C:\\CodeBlocks\\Examples\\MyApp.exe");
  160.  system("pause");
  161.  return 0;
  162. }

S2
53  Programación / Programación C/C++ / Re: Problema: Tamaño de Puntero char en: 16 Agosto 2011, 04:22 am
Luego de inicializarlo con strcpy, voy agregando cadenas con strcat, pero al ser la variable cad de 10 elementos, ¿no deberia haber un error?

te lo explico brevemente, cuando haces uso de malloc/new con valores pequeños la memoria reservada está en el heap (un espacio ya reservado para ser usado de esta forma), por lo que es posible que puedas desbordar el buffer hasta cierto límite (mientras lo que sobreescribas no afecte directamente a otro proceso/función, ya que si lo haces terminará provocando un error [los cuales son los más complicados de encontrar]), tb tienes que tener en cuenta que los tamaños son "redondeados" a tamaños prácticos para el CPU (en el caso del heap son alineados a sizeof(*void) [cuyo tamaño es distinto si es 32 o 64 bits] si mal no recuerdo) y en caso de espacios grandes de memoria a una página (512 bytes aprox), entonces si reservas 10 bytes, el redondeo será de 12 [en 32 bits] (3*sizeof(*void)=3*4=12)

S2
54  Programación / Programación C/C++ / Re: MingWin - libcurl - compilacion estatica [SOLUCIONADO] en: 11 Agosto 2011, 14:25 pm
de nadas  :), aunque me parece raro... yo pude compilarlo sin parchear nada (debe ser distinta la versión de la librería que tenemos  :rolleyes:)

S2
55  Programación / Ingeniería Inversa / Re: Ayuda con OllyDBG y Themida, leyendo memoria en: 10 Agosto 2011, 20:03 pm
no, lo que debe detectar es cuando el CE intenta tener acceso a la memoria del juego (lo más probable es una protección por driver: ntprotectvirtualmemory, ntreadvirtualmemory), puedes probar lo siguiente: utiliza algún programa como process hacker o el process explorer para suspender el proceso del juego, luego trata de descargar el driver mediante el RU y recién ahí intenta usar el CE (puedes probar tb sin descargar el driver).

S2
56  Programación / Programación C/C++ / Re: MingWin y la compilacion estatica en: 10 Agosto 2011, 19:53 pm
si te tira ese error es porque están mal los nombres de los archivos (el que dice dll es el estático y el otro el dinámico), probá renombrando los archivos o bajándolos de nuevo... luego para compilar estáticamente tuve que agregar esto:

En el código:
Código
  1. #define CURL_STATICLIB
  2. #include <curl/curl.h>

En el linker (dependencias de curl):
Citar
curl
idn
rtmp
ssh2
ssl
crypto
wldap32
gdi32
wsock32
z
winmm

S2
57  Programación / Programación C/C++ / Re: MingWin y la compilacion estatica en: 10 Agosto 2011, 15:55 pm
En el caso de dos de las que mencionas ("zlib" y "libcurl") en mi caso en la carpeta libs de mi compilador tengo:

Citar
libcurl.a -> 483kb
libcurldll.a -> 103kb
libz.a -> 92kb
libzdll.a-> 39kb

Donde por el nombre te darás cuenta que una es para linkeo estático y la otra es para linkeo dinámico (si, ambos se hacen a través de un archivo ".a"), lo que puede estar pasando es que no tengas la versión estática de la librería o la tengas con otro nombre, si no la tienes debes ir a la página del creador de la librería y descargarla desde ahí.



Lo mismo se aplica para cualquier librería.

S2
58  Programación / Ingeniería Inversa / Re: Ayuda con OllyDBG y Themida, leyendo memoria en: 10 Agosto 2011, 04:31 am
Themida no tiene protección contra inyección, dicha protección debe estar dentro del código del anticheat (si tiene un driver suelen hookear ntcreatesection o ntcreatethread para detectar inyecciones), fuera de eso, que te detecte el CE puede ser por varios motivos (detectar el driver del CE [si está corriendo] o detección del proceso del CE), podrías (si es que se puede, dado que nunca usé el CE) desactivar el driver y ver si te lo sigue detectando, si no es así, prueba cambiar el nombre del ejecutable, si cambiando el nombre lo sigue detectando puede ser por el nombre de la ventana... etc... de todas formas, para ver el código del programa puedes utilizar algún antirootkit como el Rootkit Unhooker o alguno parecido para dumpear el proceso (con eso ya puedes ver parte del código [que no esté virtualizado]), si está virtualizado hasta hoy no hay ningún método 100% funcional para desvirtualizar así que esa parte no podrás verla... je

S2
59  Programación / Programación C/C++ / Re: Punteros estaticos , Existen ¿? en: 9 Agosto 2011, 05:48 am
En realidad es sin el asterisco (*)...

Código
  1. int punt::a = NULL;
  2.  

Ahí asignas que el puntero es NULL osea que no apunta a nada, en tu caso estabas asignando que el valor de la dirección donde apunta es NULL.

antes de tratar "enseñar" a los demás deberías leer un poco  :silbar:

Hola , al intentar solucionar un problema de un puntero que uso con muchos objetos, lo puse estatico pero el compilador no me deja siquiera definirlo .

Sera que el operador static no puede ser aplicado a un puntero ?¿

EDIT: Me autorespondo . Ya encontré como solucionarlo , era algo muy simple....

si tenia un miembro estatico como puntero ej
 
Código
  1. class punt
  2.  {
  3.      public:
  4.          static int *a;
  5.  };
  6.  
  7. // la forma de definirlo era asi
  8. int *punt::a = NULL;
  9.  
  10. // Y no
  11. int punt::*a;  // Como estaba intentando  :¬¬

 ;D

La sintaxis de los miembros estáticos es: "<type> <class_name>::<static_variable>;" o "<type> <class_name>::<static_variable> = <value>;" si quieres darle un valor inicial, por lo tanto en tu caso quedaría:

Código
  1. int* punt::a;

o

Código
  1. int* punt::a=NULL;

S2

EDIT: con respecto al acceso, sigue las mismas reglas que los miembros no estáticos (solo para miembros, no para métodos estáticos)
60  Seguridad Informática / Análisis y Diseño de Malware / Re: ¿alguna forma de modificar el resultado de una ejecucion? en: 8 Agosto 2011, 07:54 am
no es necesario inyectar ni nada por el estilo, simplemente tienes que encontrar la dirección de la comparación y "nopearla"  o modificarla como te sea conveniente mediante writeprocessmemory...

S2

PD: la inyección de código se utiliza más cuando se quieren agregar comportamientos más que modificarlos.
Páginas: 1 2 3 4 5 [6] 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ... 28
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines