Помогите с NtOpenSymbolicLinkObject

Тема в разделе "WASM.WIN32", создана пользователем Songoku, 18 июн 2007.

  1. Songoku

    Songoku Эдгар

    Публикаций:
    0
    Регистрация:
    1 мар 2003
    Сообщения:
    68
    Адрес:
    Belarus
    Я знаю, что это вопрос не раз поднимался но у меня ничего не получается :dntknw:
    Не ругайте меня пожайлуста, поиском очень хорошо умею пользоваться.
    Нужно мне приоброзовать \Device\HarddiskVolume1 в нормальный вид, то есть в 'C:\'.

    Написал я вот такую функцию,

    Код (Text):
    1. ;_name TCHAR '\Device\HarddiskVolume1',0
    2. ;_name TCHAR '\??\C:',0
    3. ;_name TCHAR '\DosDevices\C:',0
    4. proc GetDeviceName
    5. local    rq 4 ;Trash
    6. local    .object  OBJECT_ATTRIBUTES64
    7. local    .hobject dq ?
    8. local    .str     UNICODE_STRING64
    9. local    .str2    UNICODE_STRING64
    10. local    .buffer  rw 1024
    11. int3
    12. mov      rdx,_name
    13. lea      rcx,[.str]
    14. call     [RtlInitUnicodeString]
    15. xor      rax,rax
    16. mov      [.object.Length],sizeof.OBJECT_ATTRIBUTES64
    17. mov      [.object.RootDirectory],rax
    18. lea      rcx,[.str]
    19. mov      [.object.ObjectName],rcx
    20. mov      [.object.Attributes],OBJ_CASE_INSENSITIVE
    21. mov      [.object.SecurityDescriptor],rax
    22. mov      [.object.SecurityQualityOfService],rax
    23.  
    24. lea      r8,[.object]
    25. mov      rdx,0x2001
    26. lea      rcx,[.hobject]
    27. call     [NtOpenSymbolicLinkObject]
    28. mov      rax,[.hobject]
    29.  
    30. ret
    31. endp
    вот структуры,

    Код (Text):
    1. OBJ_INHERIT          equ 0x00000002
    2. OBJ_PERMANENT        equ 0x00000010
    3. OBJ_EXCLUSIVE        equ 0x00000020
    4. OBJ_CASE_INSENSITIVE equ 0x00000040
    5. OBJ_OPENIF           equ 0x00000080
    6. OBJ_OPENLINK         equ 0x00000100
    7. OBJ_KERNEL_HANDLE    equ 0x00000200
    8. OBJ_VALID_ATTRIBUTES equ (OBJ_KERNEL_HANDLE + OBJ_OPENLINK + OBJ_OPENIF + OBJ_CASE_INSENSITIVE + OBJ_EXCLUSIVE + OBJ_PERMANENT + OBJ_INHERIT)
    9.  
    10. SYMBOLIC_LINK_QUERY          equ     0x0001
    11. STANDARD_RIGHTS_REQUIRED     equ     0xF0000
    12. SYMBOLIC_LINK_ALL_ACCESS     equ     (STANDARD_RIGHTS_REQUIRED + 0x1)
    13.  
    14.  
    15. struct UNICODE_STRING64
    16.         Length         dw ?
    17.         MaximumLength  dw ?
    18.                        dd ?
    19.         Buffer         dq ?
    20. ends
    21.  
    22. struct OBJECT_ATTRIBUTES64
    23.    Length                   dd ?;ULONG
    24.                             dd ?
    25.    RootDirectory            dq ?;HANDLE
    26.    ObjectName               dq ?;PUNICODE_STRING
    27.    Attributes               dd ?;ULONG
    28.                             dd ?
    29.    SecurityDescriptor       dq ?;PVOID           /* type SECURITY_DESCRIPTOR */
    30.    SecurityQualityOfService dq ?;PVOID           /* type SECURITY_QUALITY_OF_SERVICE */
    31. ends
    вообщем, вродебы всё правильно, но постоянно выкидывает ошибку!
    p.s. пишу я это под XP 64 bit.
    p.s.s. А вообще-то пора уже отдельный раздел создавать WASM.WIN64
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Я делаю так:

    Код (Text):
    1. ;<Indy Clerk>
    2.     .686
    3.     .model flat, stdcall
    4.     option casemap :none
    5.     include \masm32\include\ntdll.inc
    6. .code
    7. ConvertVolumeNameToDosName proc uses ebx VolumeName:PUNICODE_STRING, ResultDosName:PULONG
    8. Local SymbolicLinkHandle:HANDLE
    9. Local DeviceMap:PROCESS_DEVICEMAP_INFORMATION
    10. Local ObjAttr:OBJECT_ATTRIBUTES
    11. Local DosName:UNICODE_STRING
    12. Local DosNameBuffer[4]:BYTE
    13. Local LinkName:UNICODE_STRING
    14. Local LinkNameBuffer[MAX_PATH]:BYTE
    15.     _setseh_
    16.     invoke ZwQueryInformationProcess, NtCurrentProcess, ProcessDeviceMap, addr DeviceMap, SizeOf PROCESS_DEVICEMAP_INFORMATION, NULL
    17.     test eax,eax
    18.     jnz exit_
    19.     mov ObjAttr.uLength,SizeOf OBJECT_ATTRIBUTES   
    20.     mov ObjAttr.hRootDirectory,eax 
    21.     mov ObjAttr.pSecurityDescriptor,eax
    22.     mov ObjAttr.pSecurityQualityOfService,eax
    23.     mov ObjAttr.pObjectName,OffSet DirectoryName
    24.     mov ObjAttr.uAttributes,eax
    25.     invoke ZwOpenDirectoryObject, addr ObjAttr.hRootDirectory, DIRECTORY_QUERY, addr ObjAttr
    26.     test eax,eax
    27.     jnz exit_
    28.     lea ecx,DosName
    29.     mov ObjAttr.pObjectName,ecx
    30.     lea edx,DosNameBuffer
    31.     mov DosName.Buffer,edx
    32.     lea eax,LinkNameBuffer
    33.     mov LinkName.Buffer,eax
    34.     mov dword ptr DosName,65536*4 or 4
    35.     mov LinkName.MaximumLength,MAX_PATH
    36.     xor ebx,ebx
    37. loop_:
    38.     bt DeviceMap.DriveMap,ebx
    39.     jnc next_volume_       
    40.     lea eax,[ebx+'A'+':'*65536]
    41.     mov dword ptr DosNameBuffer,eax
    42.     invoke ZwOpenSymbolicLinkObject, addr SymbolicLinkHandle, SYMBOLIC_LINK_QUERY, addr ObjAttr
    43.     test eax,eax
    44.     jnz err_open_  
    45.     invoke ZwQuerySymbolicLinkObject, SymbolicLinkHandle, addr LinkName, NULL
    46.     push eax
    47.     invoke ZwClose, SymbolicLinkHandle
    48.     pop eax
    49.     test eax,eax
    50.     jnz next_volume_
    51.     invoke RtlCompareUnicodeString, VolumeName, addr LinkName, TRUE
    52.     test eax,eax
    53.     jz err_open_
    54. next_volume_:
    55.     inc ebx
    56.     cmp ebx,32
    57.     jc loop_
    58.     mov eax,STATUS_OBJECT_NAME_NOT_FOUND
    59. err_open_:
    60.     push eax
    61.     invoke ZwClose, ObjAttr.hRootDirectory
    62.     pop eax
    63.     .if !Eax   
    64.     mov edx,ResultDosName
    65.     mov dword ptr [edx],ebx
    66.     .endif
    67. exit_:
    68.     _endseh_
    69.     ret
    70. align 16
    71. DirectoryNameWide   WCHAR "\","?","?"
    72. DirectoryName       UNICODE_STRING <SizeOf DirectoryNameWide, SizeOf DirectoryNameWide, OffSet DirectoryNameWide>
    73. ConvertVolumeNameToDosName endp
    74. end
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Думаю ты кстати понимаешь, что преобразование неоднозначно?
    Открывать ссылку ;_name TCHAR '\Device\HarddiskVolume1',0 бесполезно - это не ссылка.
    Тут есть вариант как уже написал товарищ выше - перебор всех дисков и сравнивание того, куда они ведут, с \Device\HarddiskVolume1

    https://wasm.ru/forum/viewforum.php?id=31
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Не для определения полного имени процесса тебе надо это преобразование?
    Вот ещё:

    Код (Text):
    1. ConvertDosNameToVolumeName proc DosName:ULONG, ResultVolumeName:PUNICODE_STRING
    2. Local DosNameUnicode:UNICODE_STRING
    3. Local DosNameBuffer[4]:BYTE
    4. Local SymbolicLinkHandle:HANDLE
    5. Local ObjAttr:OBJECT_ATTRIBUTES
    6.     _setseh_
    7.     xor eax,eax
    8.     mov ObjAttr.uLength,SizeOf OBJECT_ATTRIBUTES   
    9.     mov ObjAttr.hRootDirectory,eax 
    10.     mov ObjAttr.pSecurityDescriptor,eax
    11.     mov ObjAttr.pSecurityQualityOfService,eax
    12.     mov ObjAttr.pObjectName,OffSet DirectoryName
    13.     mov ObjAttr.uAttributes,eax
    14.     invoke ZwOpenDirectoryObject, addr ObjAttr.hRootDirectory, DIRECTORY_QUERY, addr ObjAttr
    15.     test eax,eax
    16.     jnz exit_
    17.     mov edx,DosName
    18.     lea ecx,DosNameBuffer
    19.     .if Edx>32
    20.     mov eax,STATUS_INVALID_PARAMETER_1
    21.     .else
    22.     add edx,'A'
    23.     mov DosNameUnicode._Length,4
    24.     mov dword ptr [ecx],eax
    25.     mov word ptr [ecx],dx
    26.     mov word ptr [ecx+2],':'
    27.     mov DosNameUnicode.Buffer,ecx
    28.     lea eax,DosNameUnicode
    29.     mov DosNameUnicode.MaximumLength,4
    30.     mov ObjAttr.pObjectName,eax
    31.     invoke ZwOpenSymbolicLinkObject, addr SymbolicLinkHandle, SYMBOLIC_LINK_QUERY, addr ObjAttr
    32.     test eax,eax
    33.     jnz err_open_  
    34.     invoke ZwQuerySymbolicLinkObject, SymbolicLinkHandle, ResultVolumeName, NULL
    35.     push eax
    36.     invoke ZwClose, SymbolicLinkHandle
    37.     pop eax
    38.     .endif
    39. err_open_:
    40.     push eax
    41.     invoke ZwClose, ObjAttr.hRootDirectory
    42.     pop eax
    43. exit_:
    44.     _endseh_
    45.     ret
    46. align 16
    47. DirectoryNameWide   WCHAR "\","?","?"
    48. DirectoryName       UNICODE_STRING <SizeOf DirectoryNameWide, SizeOf DirectoryNameWide, OffSet DirectoryNameWide>
    49. ConvertDosNameToVolumeName endp
    Определить полное символическое имя процесса позволяет ZwQueryInformationProcess, недокументированный инфокласс:
    Код (Text):
    1. ProcessVolumeInformation            equ 27  ;=>psapi!GetProcessImageFileName()
    2.  
    3. QueryProcessImageFileName proc uses esi edi ProcessHandle:HANDLE, FileName:PUNICODE_STRING
    4. Local Buffer[MAX_PATH]:WCHAR
    5. Local DosName:ULONG
    6.     _setseh_
    7.     invoke ZwQueryInformationProcess, ProcessHandle, ProcessVolumeInformation, addr Buffer, MAX_PATH*2, NULL
    8.     test eax,eax
    9.     jnz exit_
    10.     lea edi,Buffer + SizeOf UNICODE_STRING + 8*2        ;\Device\*
    11.     mov ax,'\'
    12.     cld
    13.     mov ecx,MAX_PATH*2
    14.     mov edx,edi
    15.     repne scasw ;\Device\Floppy0\*
    16.     mov ecx,edi
    17.     sub ecx,edx ;Length
    18.     lea edi,[edi-6]
    19.     add ecx,8*2 - 2
    20.     mov UNICODE_STRING._Length[Buffer],cx
    21.     mov UNICODE_STRING.MaximumLength[Buffer],cx
    22.     invoke ConvertVolumeNameToDosName, addr Buffer, addr DosName
    23.     test eax,eax
    24.     jnz exit_
    25.     mov word ptr [edi+4],NULL
    26.     mov edx,DosName
    27.     cld
    28.     add edx,'A'
    29.     mov ecx,MAX_PATH*2
    30.     or edx,':'*65536
    31.     mov dword ptr [edi],edx
    32.     mov word ptr [edi+4],'\'
    33.     mov esi,edi ;A:\*
    34.     repne scasw
    35.     mov edx,FileName
    36.     assume edx:PUNICODE_STRING
    37.     sub edi,esi ;Length
    38.     .if [edx].MaximumLength<Di
    39.     mov eax,STATUS_BUFFER_TOO_SMALL
    40.     .else
    41.     mov ecx,edi
    42.     push edi
    43.     mov [edx]._Length,di   
    44.     shr ecx,2       ;dwords
    45.     mov edi,[edx].Buffer
    46.     rep movsd
    47.     pop ecx
    48.     and ecx,11b
    49.     rep movsb
    50.     .endif
    51. exit_: 
    52.     _endseh_
    53.     ret
    54. QueryProcessImageFileName endp