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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 [7] 8 9 10 11 12
61  Programación / Programación C/C++ / Re: BSOD con Kernel mutex en: 25 Febrero 2011, 16:29 pm
Buaaaa ;-)

'Arreglado' ya no peta:
Código:
LARGE_INTEGER tiempo;

tiempo.QuadPart= 0x0;

KeWaitForSingleObject(syncEventK,Executive,KernelMode, FALSE, &tiempo);

Bueno ahora no da error ni nada, pero claro, no hace lo que quiero, no me espera :rolleyes:

Entonces he pensado en detectar el nivel de IRQL en  el que corre el threat y entonces si es APC_LEVEL esperar y si es otro retornar la función original sin esperar.
Esto lo hago con:
if(KeGetCurrentIrql() == DISPATCH_LEVEL);
   return OldIrpMjDeviceControl(DeviceObject, Irp);

Sorpresa, esto me dice que SIEMPRE esta en DISPATCH_LEVEL, así que mi filtro no hace nada. No lo entiendo :( Si no petaba siempre, solo cuelgues aleatorios, suponía que de vez en cuando entraba un threat en DISPATCH_LEVEL y petaba, pero ahora resulta que siempre esta en DISPATCH_LEVEL, entonces como es que esperaba aveces si y aveces BSOD?

Alguna solución o luz sobre el asunto? :huh:

Saludos y gracias :-*


----Edit-----

A lo mejor es que así obtengo el IRQL del driver y debería sacar el IRQL del DeviceObject o Irp que me entran por parámetros?
 :o
62  Programación / Programación C/C++ / Re: BSOD con Kernel mutex en: 25 Febrero 2011, 01:06 am
Buaaa perdona mi garrulez pero es que no estoy muy familiarizado con esto.

Se supone que uno de los programas que llama al KeWaitForSingleObject tienen que estar en el APC_LEVEL?

Mañana le echare un vistazo y buscare información, a ver como solucionarlo o un método alternativo, si me pudieras echar un poco de luz al asunto te lo agradecería.

Muchas gracias!! ;-)
63  Programación / Programación C/C++ / BSOD con Kernel mutex en: 24 Febrero 2011, 22:31 pm
Buenas,


tengo echo un hook a un major de un driver, en concreto al tcpip.sys, para controlar los programas que se conectan a internet.

Básicamente esta es la función que sustituye el major del driver:

Obtengo el PID
si esta en la lista de permitidos devuelvo major original

sino:
mutex up
   evento para que el programa de usuario lea el PID
   espero con un evento si el usuario permite o deniega el acceso a internet a la aplicación
  cuando la aplicación modo user relesea el evento:
  permito o deniego el acceso a la aplicación
release mutex





Pongo los mutex para que los demas threats que quieren conectarse esperen su turno para que el usuario decida, ademas la respuesta del usuario se escribe en el driver como un device, así tampoco se pisan las respuestas.

Vale el problema es que me peta aleatoriamente con un BSOD aunque ponga try and catch.


ATTEMPTED_SWITCH_FROM_DPC (b8)
A wait operation, attach process, or yield was attempted from a DPC routine.
This is an illegal operation and the stack track will lead to the offending
code and original DPC routine.
Arguments:
Arg1: 87cf6d48, Original thread which is the cause of the failure
Arg2: 83177280, New thread
Arg3: 93cb7fd0, Stack address of the original thread
Arg4: 00000000

Debugging Details:
------------------


FAULTING_THREAD:  87cf6d48

DEFAULT_BUCKET_ID:  VISTA_DRIVER_FAULT

BUGCHECK_STR:  0xB8

PROCESS_NAME:  System

CURRENT_IRQL:  2

LAST_CONTROL_TRANSFER:  from 830b2c25 to 830abaa6

STACK_TEXT: 
8078abc0 830b2c25 87cf6d48 00000000 8316dd20 nt!KiSwapContext+0x26
8078abf8 830b1523 87cf6e08 87cf6d48 8611b260 nt!KiSwapThread+0x266
8078ac20 830ab40f 87cf6d48 87cf6e08 00000000 nt!KiCommitThreadWait+0x1df
8078ac98 a53de3d6 8611b260 00000000 00000000 nt!KeWaitForSingleObject+0x393
8078ace4 830804ac 86eac360 85fff990 c68ea158 tcpHook!HookedDeviceControl+0xcc [c:\driver\limpiofull\codigo\driver\filtro.h @ 73]
8078acfc 91e7c199 91e98ec4 888d8410 88b03bf4 nt!IofCallDriver+0x63
8078ad18 91e78897 00000000 88b03bf4 00000032 netbt!TdiSendDatagram+0x14e
8078ad5c 91e78c74 88b03af8 c0a801ff 91e7a376 netbt!UdpSendDatagram+0x18c
8078ada4 91e797fc 88b03af8 85fe3298 02ea4498 netbt!SendNameServiceRequest+0x2a1
8078ade8 91e78065 02ea4498 00000000 88d98628 netbt!MSnodeCompletion+0x227
8078ae08 830ae16d 85c63d80 85c63d38 caf59f40 netbt!TimerExpiry+0x60
8078ae4c 830ae111 8316dd20 8078af78 00000002 nt!KiProcessTimerDpcTable+0x50
8078af38 830adfce 8316dd20 8078af78 00000000 nt!KiProcessExpiredTimerList+0x101
8078afac 830ac34e 0000cfc6 93cb7ac4 00000000 nt!KiTimerExpiration+0x25c
8078aff4 830abb1c 93cb7a74 00000000 00000000 nt!KiRetireDpcList+0xcb
8078aff8 93cb7a74 00000000 00000000 00000000 nt!KiDispatchInterrupt+0x2c
WARNING: Frame IP not in any known module. Following frames may be wrong.
830abb1c 00000000 0000001a 00d6850f bb830000 0x93cb7a74


STACK_COMMAND:  .thread 0xffffffff87cf6d48 ; kb

FOLLOWUP_IP:
tcpHook!HookedDeviceControl+cc [c:\driver\limpiofull\codigo\driver\filtro.h @ 73]
a53de3d6 57              push    edi

FAULTING_SOURCE_CODE: 
    69:    
    70:       KeSetEvent(syncEvent, 0, FALSE);
    71:       
    72:       KeWaitForSingleObject(syncEventK,Executive,KernelMode,FALSE,NULL);
>   73:       KeReleaseMutex(&mutex,FALSE);
    74: /*      if(control=='y'){
    75:          PIDS[(int)PID] = 'y';
    76:          return OldIrpMjDeviceControl(DeviceObject, Irp);
    77:       }else{
    78:          PIDS[(int)PID] = 'n';


SYMBOL_STACK_INDEX:  4

SYMBOL_NAME:  tcpHook!HookedDeviceControl+cc

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: tcpHook

IMAGE_NAME:  tcpHook.sys

DEBUG_FLR_IMAGE_TIMESTAMP:  4d62ceb6

FAILURE_BUCKET_ID:  0xB8_tcpHook!HookedDeviceControl+cc

BUCKET_ID:  0xB8_tcpHook!HookedDeviceControl+cc

Followup: MachineOwner



En el log sale que peta el programa System, pero System no entra en ese pedazo de código, al ser llamada la función comprueba el PID del programa que la llama, si es 4 (System) devuelve inmediatamente la función original.

Así que mi deducción es que System es quien controla los mutex de todo el sistema y peta al controlar uno de los mutex que llama otro programa al pasar por mi función, el porque? es lo que intento averiguar.... A lo mejor es que demasiados threats esperan ese mutex o nose.

Alguna sugerencia o manera alternativa?

Gracias por la ayuda!!


64  Programación / Programación C/C++ / Re: Obtener ruta y nombre de archivo por el PID en: 13 Enero 2011, 15:11 pm
Solucionado! Ya se ponerle privilegios de depuración, el problema es que tengo que darle al botón derecho y ejecutar como administrador, alguna solución a eso? Sino es un engorro si quiero automatizar la ejecución.

Gracias ;-)
65  Programación / Programación C/C++ / Re: Obtener ruta y nombre de archivo por el PID en: 13 Enero 2011, 02:01 am
Es verdad :-[ No era la misma función :-[ Ya lo he solucionado, aunque los procesos en modo system no puedo listar su ubicación, no puedo usar openproces correctamente y nose como ajustar los privilegios de mi aplicación a system :-[

Lo he querido hacer en modo usuario por que no he encontrado la manera de hacerlo en el driver, tengo un el major de un driver hookeado y no he sido capaz de sacar el path de las aplicaciones que lo usan, solo sacar el PID con PsGetCurrentProcessId().

Gracias por la ayuda ;-)
66  Programación / Programación C/C++ / Re: Obtener ruta y nombre de archivo por el PID en: 12 Enero 2011, 16:28 pm
Código:
#include <windows.h>
#include <psapi.h>
#include <tchar.h>

#include <stdio.h>


int main()
{
  HANDLE processHandle = NULL;
  TCHAR filename[MAX_PATH];

  processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 3468);
  if (processHandle) {
    if (GetModuleFileName(processHandle, filename, sizeof(filename))) {
printf("Ruta: %s\n", filename);
    }
    CloseHandle(processHandle);
  } else {
    printf("error\n");
  }
  getchar();
  return 0;
}

Ya lo intente con este código, pero no me devuelve una ruta ni nada, me falla la función :(

Igualmente de esta manera hay que hacer un openproces con lo que no podre abrir cualquier proceso, por ejemplo el lsa.exe y no podre obtener su ruta.

Para solucionar esto ultimo estoy pensando en lanzar la aplicación en modo system, que nos e como, o directamente sacar la ruta desde el driver, ya que el pid lo saco desde el driver y lo comunico a una aplicación en modo usuario.

Gracias por la ayuda.
67  Programación / Programación C/C++ / Obtener ruta y nombre de archivo por el PID en: 12 Enero 2011, 15:26 pm
Buenas,

estoy obteniendo unos PIDs de proceso y me gustaría obtener la ruta y el nombre del archivo en modo usuario. He estado buscando pero no he visto una API que lo haga directo, alguien conoce alguna? O tendré que recorrer la lista de procesos buscando el proceso que coincida con el PID y buscarme la vida?


Gracias ;-)
68  Programación / Programación C/C++ / Re: Sincronizar modo kernel y modo usuer. en: 28 Diciembre 2010, 16:45 pm
Muchas gracias! He estado leyendo y codeando y todo ok ;-)
69  Programación / Programación C/C++ / Sincronizar modo kernel y modo usuer. en: 25 Diciembre 2010, 14:23 pm
MI idea es que el modo kernel envié información al modo usuario y entonces se quede bloqueado asta recibir la respuesta del modo user.

He buscado como crear eventos pero o no se buscarlo o no hay nada.
Alguna idea o cacho de codigo?

Felices fiestas!! :)
70  Seguridad Informática / Análisis y Diseño de Malware / Re: Introducción a la programación de drivers en Windows en: 23 Septiembre 2010, 22:02 pm
Estoy liado con la comunicación entre modo kernel y user  >:D

Tal como esta en el ejemplo puedes dar una orden desde modo user y al acabar la operación en el kernel devolver un resultado ya que segun creo la funcion:
DeviceIoControl(hDevice,(DWORD)Escribe,iBuffer,(DWORD)sizeof(iBuffer),(LPVOID)oBuffer,(DWORD)sizeof(oBuffer),&a,NULL)==true)

es bloqueante y espera a que desde el kernel se envié una repuesta.

Pero yo soy un caprichoso y me gustaría al revés, que el kernel enviara un int y se quedara esperando la respuesta del modo usuario, otro int. Pero claro creo que con el DeviceIoControl no es posible.

A alguien se le ocurre algo?¿
 ;)
 
Páginas: 1 2 3 4 5 6 [7] 8 9 10 11 12
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines