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


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Análisis y Diseño de Malware (Moderador: fary)
| | |-+  ErrorInvalidParameter en CreateProcessW con EXTENDED_STARTUPINFO_PRESENT
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ErrorInvalidParameter en CreateProcessW con EXTENDED_STARTUPINFO_PRESENT  (Leído 1,745 veces)
nts94

Desconectado Desconectado

Mensajes: 25


Ver Perfil
ErrorInvalidParameter en CreateProcessW con EXTENDED_STARTUPINFO_PRESENT
« en: 4 Junio 2012, 19:21 pm »

Bueeeno, he intentado ser lo más explícito posible con el tema de este post. Primero una introducción (para los que no lo sepan ya):

<INTRO>
A partir de Windows Vista se puede "elegir" el proceso padre para un nuevo proceso (siempre que se tenga permisos para abrir el proceso).
</INTRO>

Corta,ehh? xD El caso es que lo he estado probando en Windows 7 x64 y me funciona con la versión ANSI (CreateProcessA) pero no con CreateProcessW. El código que uso es éste:

Código:
       /* ... */
if(SysGetVersion() < OSV_WIN_VISTA)
{
SetLastError(ERROR_NOT_SUPPORTED);
return FALSE;
}

if(!pwzExePath || lstrlenW(pwzExePath) > MAX_PATH)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}

STARTUPINFOEXW st = { sizeof(STARTUPINFOEXW) };
GetStartupInfoW(&st.StartupInfo);

PROCESS_INFORMATION pci;

SIZE_T cbList = 0;
InitializeProcThreadAttributeList(NULL, 1, 0, &cbList);
st.lpAttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(SYS_HEAP, 0, cbList);
DBG_ASSERT(st.lpAttributeList);
InitializeProcThreadAttributeList(st.lpAttributeList, 1, 0, &cbList);
UpdateProcThreadAttribute(st.lpAttributeList, 0, PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, &hParent, sizeof(HANDLE),
NULL, NULL);

DBG_MSGBOX_TRACE_W(pwzExePath);

BOOL bRet = CreateProcessW(NULL, L"C:\\Windows\\system32\\cmd.exe" /*pwzExePath*/, NULL, NULL, FALSE, EXTENDED_STARTUPINFO_PRESENT,
                                         NULL, NULL, &st.StartupInfo, &pci);

DeleteProcThreadAttributeList(st.lpAttributeList);
HeapFree(SYS_HEAP, 0, st.lpAttributeList);

if(bRet)
{
DBG_MSGBOX_TRACE("No error");
CloseHandle(pci.hProcess);
CloseHandle(pci.hThread);
}
else
DBG_MSGBOX_TRACE("Error");

return bRet;

Nota: supongo que debe de ser algo relacionado con la especificacion del tamaño de las estructuras, pero como todavía no hay un ollydbg para x64 y no me aclaro con el windbg (y se cuelga mucho, no se si solo me pasa a mi), no he podido debuggearlo
« Última modificación: 4 Junio 2012, 20:19 pm por nts94 » En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.419


Se siente observado ¬¬'


Ver Perfil
Re: ErrorInvalidParameter en CreateProcessW con EXTENDED_STARTUPINFO_PRESENT
« Respuesta #1 en: 4 Junio 2012, 20:04 pm »

Para evitar problemas con los cambios de UNICODE a ANSI y viceversa no deberías especificar ninguna y luego definir la directiva correspondiente para el compilador. Ej:

Código
  1. #undef UNICODE
  2. void main(){
  3.   MessageBox(0,_T("PRUEBA"),_T("LOL"),0);
  4. }
Esto te generará una versión ANSI funcional, y si en lugar de desdefinir "UNICODE" lo defines (por defecto está ya definido) te generará la versión UNICODE. Igual con las estructuras, si no defines A/W el compilador automáticamente hará el trabajo.
En línea

nts94

Desconectado Desconectado

Mensajes: 25


Ver Perfil
Re: ErrorInvalidParameter en CreateProcessW con EXTENDED_STARTUPINFO_PRESENT
« Respuesta #2 en: 4 Junio 2012, 20:09 pm »

Ya, el problema es que no se trata de un ejecutable sino de una DLL, y quiero poder usar ambas versiones (como la api de windows) de manera que exporto dos funciones tal que:

Código:
extern "C" {
/* ... */
BOOL SysCreateProcessByParentA(const PSTR pszExePath, HANDLE hParent);
BOOL SysCreateProcessByParentW(const PWSTR pwzExePath, HANDLE hParent);
/* ... */
}

#ifdef _UNICODE
# define SysCreateProcessByParent SysCreateProcessByParentW
#else
# define SysCreateProcessByParent SysCreateProcessByParentA
#endif

La version anterior era la UNICODE. La versión ANSI solo convierte los parametros a UNICODE y llama a la version UNICODE. De todas formas, gracias  :D
« Última modificación: 4 Junio 2012, 20:19 pm por nts94 » En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.419


Se siente observado ¬¬'


Ver Perfil
Re: ErrorInvalidParameter en CreateProcessW con EXTENDED_STARTUPINFO_PRESENT
« Respuesta #3 en: 4 Junio 2012, 20:32 pm »

Yo en el código no veo nada raro, pero siempre puedes compilar a 32bits y debuggear con el Olly si te aclaras con éste mejor.

Saludos
En línea

nts94

Desconectado Desconectado

Mensajes: 25


Ver Perfil
Re: ErrorInvalidParameter en CreateProcessW con EXTENDED_STARTUPINFO_PRESENT
« Respuesta #4 en: 5 Junio 2012, 01:14 am »

Ok, después de unas cuantas (muchas) horas lo encontré: resulta que los de Microsoft todavía no han solucionado el famoso bug de CreateProcessW, y al intentar escribir sobre mi string directamente (es decir, sin buffer intermedio, el string estaría en una pagina de solo lectura) el programa petaba (por eso CreateProcessA sí que iba), y a veces petaba y a veces daba error porque al intentarlo en la de x86, no me dejaba inyectarme en sysprep.exe, saltarme el UAC, conseguir el SeDebugPrivilege y claro, el handle a winlogon.exe era inválido (por algo lo he puesto en la sección de malware) xD

En fin, gracias Karcrack por la ayuda. TEMA SOLUCIONADO
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines