Título: Obtener Informacion acerca del modulo correspondiente al StartAdress del Thread. Publicado por: **Aincrad** en 8 Junio 2022, 19:13 pm Hola, tengo una duda que no he resuelto todavia. y es como obtener esta info :
(https://i.ibb.co/4ZzKjGR/ss1.png) Bien, Por mi cuenta he podido obtener, esos campos, pero en el campo StartAdress , no se como obtener ese tipo de informacion (Modulename + Adress) . Esto es lo que tengo hasta ahora : Código
Como ven la informacion que obtengo de StartAdress, es del tipo intptr . no string . Esta es la informacion que he encontrado hasta ahora : Getting module name from thread information (https://stackoverflow.com/questions/5157083/getting-module-name-from-thread-information) How to retrieve starting address of a thread in windows? (https://stackoverflow.com/questions/11147846/how-to-retrieve-starting-address-of-a-thread-in-windows) Pero no entiendo ni pito. Ayudaa.... Gracias de antemano. Título: Re: Obtener Informacion acerca del modulo correspondiente al StartAdress del Thread. Publicado por: RayR en 8 Junio 2022, 23:59 pm La forma en que lo hacen en el segundo link (NtQueryInformationThread) es sencilla en C++, pero no tengo mucha experiencia llamando a funciones de la API desde .NET, y nunca he programado en Vb.Net. De cualquier forma, van algunos consejos que te podrían servir al menos darte una idea general.
En C# sería algo más o menos así: Obtener handle a cada hilo mediante la función de la API OpenThread (kernel32.dll): Código
Luego llamas a NtQueryInformationThread (ntdll.dll): Código
Cierras el handle con la función de API CloseHandle (kernel32.dll): Código
Obviamente habría que hacer manejo de errores y demás, pero para empezar podrías probar a ver si te sirve de esta manera. Título: Re: Obtener Informacion acerca del modulo correspondiente al StartAdress del Thread. Publicado por: **Aincrad** en 9 Junio 2022, 01:32 am Si , exactamente lo estaba haciendo asi, hasta que no pude encontrar el equivalente a NtQueryInformationThread en .net. basado en lo que busque de c++ , el pinvoke deberia ser asi :
Código
'Deberia' , esto lo hice basado en la documentacion de c++ , y el ThreadInfoClass me parece que esta incompleto. si funciona , es un milagro. Elektro se te estraña ... Título: Re: Obtener Informacion acerca del modulo correspondiente al StartAdress del Thread. Publicado por: RayR en 9 Junio 2022, 02:59 am Más o menos, aunque la función devuelve un simple entero, y alguno de los parámetros no es del todo exacto. En C# sería algo así:
Código
Para conseguir el StartAddress no importa si el enum está incompleto, ya que el único valor que necesitas es 9 (ThreadQuerySetWin32StartAddress). Por lo demás, y aunque no lo he probado, no veo por qué no habría de funcionar. Título: Re: Obtener Informacion acerca del modulo correspondiente al StartAdress del Thread. Publicado por: **Aincrad** en 14 Junio 2022, 00:59 am Más o menos, aunque la función devuelve un simple entero, y alguno de los parámetros no es del todo exacto. En C# sería algo así: Código
Para conseguir el StartAddress no importa si el enum está incompleto, ya que el único valor que necesitas es 9 (ThreadQuerySetWin32StartAddress). Por lo demás, y aunque no lo he probado, no veo por qué no habría de funcionar. Ya lo hice, pero para nada, esto obtiene el StartAdress. Lo mismo que yo obtengo en el codigo que puse al principio. Pero no obtiene El startAdress en la forma que quiero, (ModuleName+Offset adress) como por ejemplo : CodeSmart.exe+0xb426ee Sigo necesitando ayuda. se agradece cualquier sugerencia. Título: Re: Obtener Informacion acerca del modulo correspondiente al StartAdress del Thread. Publicado por: RayR en 14 Junio 2022, 17:22 pm Sí, en lo que yo me enfoqué es sólo en la dirección, porque pensé que te referías a eso. Pero ¿seguro que es lo mismo que ya obtenías? Que yo recuerde, pT.StartAddress no te da exactamente lo que quieres. O sea, según yo, el resultado que obtienes es distinto al que te da NtQueryInformationThread, y sólo este último es el que se corresponde con lo que te muestran herramientas como Process Explorer o PocessHacker. Prueba a mostrar los hilos de Process.GetCurrentProcess() de una forma y la otra y verás (o no, si es que me falla la memoria).
Para conseguir los nombres creo que sí necesitarías dbghelp.dll, como dicen en el segundo link que pusiste. Si más tarde tengo tiempo, reviso bien la información y posteo lo que encuentre. Título: Re: Obtener Informacion acerca del modulo correspondiente al StartAdress del Thread. Publicado por: RayR en 15 Junio 2022, 19:15 pm Le di una revisada rápida a la documentación de la API Debug Help y no es muy difícil, siempre que lo que quieras sea algo básico. Eso sí, hacerlo desde .NET será engorroso porque las funciones de esta API toman varias estructuras que tendrías que definir en tu programa. De cualquier forma, te explico más o menos como lo podrías hacer, con una mezcla de pseudocódigo y C. En este ejemplo se mostraría la información para el proceso actual:
Primero deberías inicializar el manejador de símbolos y luego cargar las tablas de cada módulo cargado por el proceso. Esto carga los nombres de funciones de las dll y demás: Código
A SymInitialize le podrías pasar como segundo parámetro una cadena con rutas separadas por punto y coma, como se explica en: https://docs.microsoft.com/en-us/windows/win32/debug/symbol-paths . Esto te serviría, por ejemplo, para usar el servidor de símbolos de Microsoft, pero es opcional. Después, iteras a través de los hilos del proceso: Código
Y dentro del for, por cada hilo, obtienes un contexto: Código
Llamamos a NtQueryInformationThread() para obtener la dirección de inicio: Código
Obtenemos el nombre del módulo (dll/exe) que contiene la función. Dos opciones: Opción 1. Llamas a StackWalk64(): Código
Luego a SymGetModuleInfo64(): Código
Opción 2 (recomendada). Obtenemos directamente el nombre del módulo pasandole startAddress: Código
Luego obtenemos el nombre de la función: Código
Con esto, ya podrias mostrar la información que quieres: Código
Lo anterior mostraría algo tipo: Código: miEjecutable!mainCRTStartup+0 Por supuesto, esto sólo es un ejemplo para darte una idea. No es nada robusto, no verifico errores, etc., y no es nada limpio, pero lo hice así para que fuera lo más simple posible, además de que sólo le di una leída muy deprisa a la documentación y apenas le dediqué unos minutos al ejemplo. Si lo conviertes correctamente a VB, debería funcionar en general, pero probablemente haya casos límite donde podría fallar. Obviamente, para implementarlo bien, deberías revisar con calma la documentación de las funciones usadas, pero creo que este ejemplo puede servir como punto de partida. Editado para hacer unas cuantas correcciones. Título: Re: Obtener Informacion acerca del modulo correspondiente al StartAdress del Thread. Publicado por: **Aincrad** en 15 Junio 2022, 23:26 pm Hola, De tanto buscar encontre este codigo Fuente : https://github.com/itsmeny/Process_Thread_Info (https://github.com/itsmeny/Process_Thread_Info) basicamente todo lo que necesito pero , hay un pequeño detalle , no funciona, o al menos a mi no me funciona, el error esta en la funcion del dbghelp SymFromAddr .
No se si son los parametros correctos , de verdad no se por que me da el error. Coloco la funcion importante : Código
Falla justo aqui : Código
No se que podria estar mal, alguna Idea ? Título: Re: Obtener Informacion acerca del modulo correspondiente al StartAdress del Thread. Publicado por: RayR en 16 Junio 2022, 21:21 pm No lo he probado pero ¿lo estás compilando para x86, x64, o Any CPU? Y si es este último, ¿tienes activado "Prefer 32-bit"? Te lo digo porque las funciones de depuración son muy quisquillosas en cuanto a la arquitectura. Te recomendaría primero que nada meterle al programa PIDs de procesos tanto de 32 como de 64 bits a ver si falla con ambos o no. Y luego recompilarlo a otra arquitectura y probar de nuevo. Y es que si compilas para 32 o con prioridad a 32, probablemente no podrías usarlo con procesos de 64 y quizás tampoco al revés (digo probablemente porque no he revisado ese código).
Hablando de eso, y por si acaso, me faltó decir que el ejemplo que puse funcionaría en 32 bits. Para 64, habría que hacer unos pocos cambios, como sustituir los campos Eip, Ebp y Esp de context por sus variantes para x64 (Rip, Rbp, Rsp), pasar IMAGE_FILE_MACHINE_AMD64 a StackWalk64() y cambiar el tipo de la variable startAddress y su tamaño a 64 bits en vez de DWORD (de hecho, sería mejor usar un tipo que cambie con la arquitectura, como un puntero, size_t, etc.). De cualquier forma, veré si luego tengo tiempo de revisar el código que encontraste y buscar el error. Título: Re: Obtener Informacion acerca del modulo correspondiente al StartAdress del Thread. Publicado por: RayR en 17 Junio 2022, 23:28 pm Descargué el código y parece funcionar correctamente, pero como imaginaba, sólo en una misma arquitectura. Si lo compilas para x86 (o ANY + "Prefer 32-bit") sólo admite id de procesos de 32 bits, y lo mismo para 64.
Eso sí, la excepción de la que hablabas no tiene razón de ser, ya que es normal que SymFromAddr falle a veces. Eso sólo significa que no encontró el símbolo (nombre de función) porque el ejecutable del proceso fue compilado sin información de depuración (no hay archivo .pdb, etc.). Es justamente lo que pasa en la imagen que pusiste en tu mensaje original, donde pone: CodeSmart.exe+0xb426ee. Como no encontró el símbolo (SymFromAddr falló), simplemente pone el offset. Si quisieras hacer algo similar, ese offset lo calcularías: Código
donde module es el módulo (.dll o .exe) que contiene la función, y lo obtienes mediante la función de la API SymGetModuleInfo64. Así, simplemente harías que aquí: Código
se devuelva una cadena con el offset. O simplente devuelves "No se encontro simbolo" o lo que quieras. Edito: Me entró curiosidad por ver por qué si se compila para x64 no puede aceptar procesos de 32 bits, ya que desde la API en C++ es sencillo hacerlo (pasando los flags adecuados a CreateToolhelp32Snapshot). Resulta que cuando el programa se ejecuta en 64 bits, no carga módulos de 32 bits, y no sé si haya forma de especificar en .NET que lo haga. Probé hacerlo manualmente mediante la API de Windows (como lo hago en C++) y funciona. Por si te interesa (o alguien más que le llame la atención el tema), lo harías así: Primero, eliminar esta línea de la función GetThreadStartAddress(): Código
Pues SymInitialize() sólo se debe llamar una vez por proceso, y aquí se está llamando por cada hilo. Y en este caso, lo correcto es llamar a SymCleanup() al final. Luego, definir esta estructura y dllimports: Código
Finalmente, el código, que puse dentro de get_process_thread_Click() sólo por simplicidad: Código
Con esto, al compilar para x64 (o ANY con "Prefer 32-bit" deshabilitado) ya aceptaría procesos de ambas arquitecturas. Título: Re: Obtener Informacion acerca del modulo correspondiente al StartAdress del Thread. Publicado por: **Aincrad** en 18 Junio 2022, 19:43 pm Que demonios!! Funciona. ;-) Gracias por tomarte el tiempo en esto .
Ayer lo logre de esta manera, Primero me descargue el codigo del ProcessHacker y me puse a analizarlo. Al final, tome todo el proyecto del PH y lo puse en 1 API : https://github.com/DestroyerDarkNess/Xylon.PH (https://github.com/DestroyerDarkNess/Xylon.PH) , Despues facilmente use el codigo del PH al final asi quedo : https://github.com/DestroyerDarkNess/ProcessThreadInfo (https://github.com/DestroyerDarkNess/ProcessThreadInfo) Código
(https://github.com/DestroyerDarkNess/ProcessThreadInfo/raw/main/ssa.png?raw=true) Bueno espero que este post ayude a alguien mas que pase por esta duda. Gracias @RayR |