2013-11-28 3 views
0

PVONG ID를 ULONG으로 변환하려고하는데 항상 실패하고 잘못된 데이터를 제공하며 int, ulong 또는 cast 변수에 캐스트하지 말 것을 권합니다. ULONG client = (ULONG) pvoidVar 같은 MSDN에서 같은 다른 데이터 유형하지만 난 같은 다른 기술과 사전 정의 된 기능을 시도 :Windows 커널 드라이버에서 PVOID를 ULONG으로 변환하거나 Windows 커널 드라이버에서 PVOID를 HANDLE로 사용합니다.

ULONG client = PtrToUlong(pvoidVar); 
ULONG client = (ULONG) PtrToUlong(pvoidVar); 

어떤 일이 일어나고 것은 내가 드라이버하지만 잡 부분에 커널하는 사용자 모드 응용 프로그램에서 클라이언트 ID를 보내려고하고 있다는 것입니다 커널 드라이버는 PVOID Irp->UserBuffer으로 처리한다. 또한 내가 사용하고자하는 프로세스 ID를 HANDLE으로 보내면 지금 핸들은 PVOID과 같고 직접 사용하는 것으로 생각한다.

HANDLE processID = (HANDLE) Irp->UserBuffer; 
HANDLE processID = Irp->UserBUffer; 

내가 사방 읽었으며 모든 PtrToUlong를 사용하는 adviced하고 PVOID은 내가 잘못로 HANDLE은 동일합니다하지만 여전히 같은 작동하지 않는 이유는 무엇입니까? ULONGPVOID를 변환하는 방법을 나에게 조언이나 방법은 내가 여기

가 충돌하지 않는 내 주요 드라이버의 코드는하지만 나에게 잘못 출력을 제공 --- HANDLE

EDIT로 PVOID을 사용할 수 있습니다하십시오

여기
#include <ntddk.h> 
#include <wdm.h> 

#define DEVICE L"\\Device\\TEST" 
#define DOSDEVICE L"\\DosDevices\\TEST" 

VOID Unload(PDRIVER_OBJECT DriverObject) { 
    UNICODE_STRING DosDeviceName; 

    DbgPrint("Driver Unloaded"); 

    RtlInitUnicodeString(&DosDeviceName, DOSDEVICE); 
    IoDeleteSymbolicLink(&DosDeviceName); 

    IoDeleteDevice(DriverObject->DeviceObject); 
} 

NTSTATUS IODispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp) { 
    Irp->IoStatus.Status = STATUS_SUCCESS; 
    IoCompleteRequest(Irp, IO_NO_INCREMENT); 
    return STATUS_SUCCESS; 
} 

NTSTATUS IOManager(PDEVICE_OBJECT DeviceObject, PIRP Irp) { 

    PIO_STACK_LOCATION StackLocation = IoGetCurrentIrpStackLocation(Irp); 
    ULONG IRPcode = StackLocation->Parameters.DeviceIoControl.IoControlCode; 

      // Here i cannot convert pvoid as ULONG if i try to do that it gives me some other value 
    DbgPrint("%lu", (ULONG)Irp->AssociatedIrp.SystemBuffer); 


    NTSTATUS ntStatus = STATUS_SUCCESS; 
    HANDLE hProcess; 
    OBJECT_ATTRIBUTES ObjectAttributes; 
    CLIENT_ID ClientId; 

      // Here i cannot use pvoid directly as a handle nor cast it as a handle as it fails 
    ClientId.UniqueProcess = (HANDLE)Irp->AssociatedIrp.SystemBuffer; 
    ClientId.UniqueThread = NULL; 

    InitializeObjectAttributes(&ObjectAttributes, NULL, OBJ_INHERIT, NULL, NULL); 

    ntStatus = ZwOpenProcess(&hProcess, PROCESS_ALL_ACCESS, &ObjectAttributes, &ClientId); 
    if(NT_SUCCESS(ntStatus)) { 
     ZwClose(hProcess); 
    } 

    Irp->IoStatus.Status = STATUS_SUCCESS; 
    IoCompleteRequest(Irp, IO_NO_INCREMENT); 

    return STATUS_SUCCESS; 
} 

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath) { 
    NTSTATUS status = STATUS_SUCCESS; 
    int uiIndex = 0; 
    PDEVICE_OBJECT pDeviceObject = NULL; 
    UNICODE_STRING DriverName, DosDeviceName; 

    DbgPrint("Driver Loaded"); 

    RtlInitUnicodeString(&DriverName, DEVICE); 
    RtlInitUnicodeString(&DosDeviceName, DOSDEVICE); 

    pDriverObject->DriverUnload = Unload; 

    status = IoCreateDevice(pDriverObject, 0, &DriverName, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDeviceObject); 

    if (!NT_SUCCESS(status)) { 
     DbgPrint("IoCreateDevice failed: %x", status); 
     return status; 
    } 

    status = IoCreateSymbolicLink(&DosDeviceName, &DriverName); 

    if (!NT_SUCCESS(status)) { 
     IoDeleteDevice(pDeviceObject); 
     DbgPrint("IoCreateSymbolicLink failed"); 
     return status; 
    } 

    pDriverObject->MajorFunction[IRP_MJ_CREATE] = IODispatch; 
    pDriverObject->MajorFunction[IRP_MJ_CLOSE] = IODispatch; 
    pDriverObject->MajorFunction[IRP_MJ_READ] = IODispatch; 
    pDriverObject->MajorFunction[IRP_MJ_WRITE] = IODispatch; 
    pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IOManager; 

    return status; 

} 

내 사용자 모드 응용 프로그램

#define SYSFILE L"C:\\TEST.sys" 
#define SERVICENAME L"TEST" 

BOOL GetProcessList(); 
VOID startServ(DWORD processID); 

int _cdecl main(void) { 
    GetProcessList(); 
    return 0; 
} 

BOOL GetProcessList() { 
    HANDLE hProcessSnap; 
    PROCESSENTRY32 pe32; 

    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    if (hProcessSnap == INVALID_HANDLE_VALUE) { 
     printf("CreateTool"); 
     getchar(); 
     return(FALSE); 
    } 

    pe32.dwSize = sizeof(PROCESSENTRY32); 

    if(!Process32First(hProcessSnap, &pe32)) { 
     CloseHandle(hProcessSnap); 
     printf("Process32"); 
     getchar(); 
     return(FALSE); 
    } 

    do { 
     if (wcscmp(L"test.exe", pe32.szExeFile) == 0) { 
      startServ(pe32.th32ProcessID); 
     } 

    } while(Process32Next(hProcessSnap, &pe32)); 

    CloseHandle(hProcessSnap); 
    return(TRUE); 
} 

VOID startServ(DWORD processID) { 

    SC_HANDLE hSCManager; 
    SC_HANDLE hService; 
    SERVICE_STATUS ss; 

    hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE); 

    printf("Load Driver\n"); 

    if(hSCManager) 
    { 
     printf("Create Service\n"); 

     hService = CreateService(hSCManager, SERVICENAME, 
      SERVICENAME, 
      SERVICE_ALL_ACCESS, 
      SERVICE_KERNEL_DRIVER, 
      SERVICE_DEMAND_START, 
      SERVICE_ERROR_IGNORE, 
      SYS_FILE, 
      NULL, NULL, NULL, NULL, NULL); 

     printf("CreateService: %d\r\n", GetLastError()); 

     if(!hService) { 
      hService = OpenService(hSCManager, SERVICENAME, SERVICE_ALL_ACCESS); 
     } 

     printf("OpenService: %d\r\n", GetLastError()); 

     if(hService) { 
      printf("Start Service\n"); 

      StartService(hService, 0, NULL); 

      printf("StartService: %d\r\n", GetLastError()); 

      HANDLE hFile; 

      hFile = CreateFile(L"\\\\.\\Global\\TEST\0", GENERIC_READ|GENERIC_WRITE, 0, NULL, 
       OPEN_EXISTING, 0, NULL); 

      printf("CreateFile: %d\r\n", GetLastError()); 

      wchar_t pid[1024]; 

      wsprintf(pid, L"%d", processID); 

      if(hFile) { 
       char ret[1024]; 
       DWORD bytes; 

       DeviceIoControl(hFile, 4092, pid, (wcslen(pid)+1)*2, &ret, sizeof(ret), &bytes, NULL); 
       CloseHandle(hFile); 
      } 

      printf("Press Enter to close service\r\n"); 
      getchar(); 
      ControlService(hService, SERVICE_CONTROL_STOP, &ss); 

      DeleteService(hService); 

      CloseServiceHandle(hService); 

     } 

     CloseServiceHandle(hSCManager); 
    } 

} 

이제 모든 일이 충돌하거나 중단하지 않는 것입니다 또는 나에게 블루 스크린을 줘라. 그러나 그것은 나에게 운전자에게서 나에게 틀린 출력을 준다. 내가 그것을 던지면, 그것을 쓰지 않고, 단지 그것을 사용하는 정확하게 그 때까지 그것이 정확한 출력을주는

+0

32 비트 또는 64 비트입니까? –

+0

@RogerRowland : 32 비트하지만 64도 만들 것입니다. –

+0

* "작동하지 않습니다"는 무엇입니까? 컴파일되지 않습니까? 충돌? 컴퓨터를 날으는 양배추로 바꾼다 고요? "핸들 ID로 사용하고 싶은 프로세스 ID"는 무엇을 의미합니까, 그 요점은 무엇입니까? –

답변

1

당신은 포인터 디 레퍼런스 놓친 :는 sizeof (HANDLE)는 공정 비트 수에 따라 달라

HANDLE processID = *(HANDLE*)Irp->UserBuffer; 

이 또한주의를, 그래서 고정 크기 유형을 사용하는 것이 좋습니다 PID/TID 값에 대한 32. 비트는 충분하다

업데이트 :..

:

은 또한 당신이 PID의 캐릭터 라인 표현을 전달하는 바이너리 형식을 사용합니다

DeviceIoControl(hFile, 4092, &processID, sizeof(processID) 
+0

죄송합니다 이것도 작동하지 않습니다 –

+0

코드를 보여주세요 : 어떻게 귀하의 IOCTL 정의 및 어떻게 보내시겠습니까 그것. –

+0

드라이버와 사용자 모드 앱의 전체 소스를 추가했습니다. 감사합니다. –

0

당신은 " 클라이언트 ID "를 사용자에서 커널 공간으로 이동시킵니다. 이 엔티티 "클라이언트 ID"란 무엇입니까? 나는이 용어에 익숙하지 않다.

  • 포인터 인 경우 사용자 공간 또는 커널 공간 중 하나 (최대)에서 의미가 있으므로 어느 한 공간에서 다른 공간으로 전달하는 것은 의미가 없습니다. 이들은 별도의 주소 공간입니다.
  • ULONG 인 경우 형식 변환을 수행 할 필요가 없으므로 질문이 잘못되었습니다.
  • 포인터와 ulong 둘 다 생각된다면 서로 다른 유형이므로 혼동 스러울 수 있습니다.

프로세스 ID는이 문제와 어떤 관련이 있습니까? 그것들은 네 번째 유형의 엔티티이고 클라이언트 ID도 포인터도 아니고 ulong도 아닙니다.

죄송합니다. 더 도움이되지 않습니다. 네가하려는 일을 이해할 수 없다.

나는 당신이 Win32 커널 모드 코드를 작성하려고 시도하지만, 매우 혼란 스럽다. 아마도 커널 모드 코드를 작성해야한다고 생각하는 이유를 설명해야합니다. 처음부터 시작해야 할 것 같습니다 : "나는 달성 한 소프트웨어 시스템을 만들려고 노력하고 있습니다 ..."

+0

나는 라이선스 시스템을 만들고 플러스 윈도우 드라이버 개발'clientID'를 내 서버에서 생성 한 ID라고한다. 사용자 모드 앱이 그것을 가져 와서 확인할 드라이버에 보낸다. 지금 라이센스가 만료되면 드라이버가 응용 프로그램을 종료하고 시작하는 것을 허용하지 않습니다. (이것이 내가 프로세스 ID를 필요로하는 이유입니다) 이제는 WriteFile API 만 사용하여 드라이버와 통신합니다. 사용자 앱에서받은 데이터는 'PIRP'를 사용하여 pvoid로 표시되며 데이터가 'PIRP'객체의 'UserBuffer'에 있습니다.이 객체는 여전히 혼란 스럽다면 PVOID입니다. –

+0

클라이언트 ID가 불투명 한 번호 인 경우 포인터를 또는 포인터로 변환 할 필요가 없습니다. I/O 요청 패킷을 사용하여 사용자/커널 공간 경계를 넘어 데이터를 전달하는 경우이 클라이언트 ID를 패킷에 넣기를 원할 것입니다. – AnotherSmellyGeek

+0

또한 커널을 신뢰할 수 없습니다. 귀하의 라이센스 시스템뿐만 아니라 귀하의 라이센스 시스템에 대한 루트킷 또는 균열이있을 수 있습니다. 아니면 무언가가 교환을 스누핑 할 수 있습니다. 재연 공격을 막으려면 어떻게합니까? – AnotherSmellyGeek