MessageBox without import

Тема в разделе "WASM.X64", создана пользователем Mikl___, 5 фев 2025.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. .code
    4. WinMain proc
    5. local Message:UNICODE_STRING
    6. local Result:qword
    7.        mov rax,qword ptr gs:[60h];Получаем адрес PEB
    8.        mov rax,[rax+18h];Смещаемся к структуре PEB_LDR_DATA
    9.        mov rax,[rax+20h];Смещаемся к полю PEB_LDR_DATA.InMemoryOrderModuleList
    10.        mov rax,[rax]
    11.        mov rbx,[rax+20h];Базовый адрес ntdll.dll
    12.        cmp word ptr[rbx].IMAGE_DOS_HEADER.e_magic,IMAGE_DOS_SIGNATURE
    13.        jne exit_
    14.        mov r9d,[rbx].IMAGE_DOS_HEADER.e_lfanew;смещение до PE-заголовка
    15.        cmp word ptr[rbx+r9],IMAGE_NT_SIGNATURE;
    16.        jne exit_
    17. ;18h to optional header + 70h to data directories
    18.        mov r9d,dword ptr[rbx+r9+18h].IMAGE_OPTIONAL_HEADER64.DataDirectory;смещение до секции экспорта
    19. ;Пеpейти к таблице экспоpта и получить количество имен (NumberOfNames)
    20.        add r9,rbx;переходим в таблицу экспорта
    21.        mov r14d,[r9].IMAGE_EXPORT_DIRECTORY.NumberOfNames;[r9+18h]
    22.        mov r13d,[r9].IMAGE_EXPORT_DIRECTORY.AddressOfNames;[r9+20h]
    23.        add r13,rbx
    24.        mov edx,[r9].IMAGE_EXPORT_DIRECTORY.AddressOfFunctions;[r9+1Ch]
    25.        lea r12,[rbx+rdx+4];tableOfAddressOfFunctions
    26. ;---------------------------------------------------
    27.        invoke func,sizeof aLdrLoadDll,&aLdrLoadDll      
    28.        mov Message.woLength,14h
    29.        mov Message.MaximumLength,16h
    30.        movr qword ptr Message.Buffer,aUser32_
    31.        lea r8,Message
    32.        mov ecx,1
    33.        lea edx,Result
    34.        mov r9,rdx
    35.        call rax;LdrLoadDll_
    36. ;---------------------------------------
    37.        lea   r15,aMessageBoxA
    38.        mov Message.woLength,12
    39.        mov Message.MaximumLength,13
    40.        mov Message.Buffer,r15;&aMessageBoxA
    41. ;----------------------------------------------------
    42.        invoke func,sizeof aLdrGetProcedureAddress,&aLdrGetProcedureAddress
    43.        xor r8,r8
    44.        lea rdx,Message
    45.        mov [rsp+28h],r15;&aMessageBoxA
    46.        lea r9,Result
    47.        mov rcx,[r9]
    48.        and dword ptr[rsp+20h],0
    49.        call rax;LdrGetProcedureAddress_
    50. ;-----------------------------------
    51.        mov r9d,MB_OK
    52.        lea r8d,aTitle
    53.        mov edx,offset aMessage
    54.        xor ecx,ecx
    55.        call Result
    56. exit_: invoke RtlExitUserProcess,NULL
    57. WinMain endp
    58. func proc sizeof1:dword,NameProc:dword
    59.        mov sizeof1,ecx
    60.        mov NameProc,edx
    61.        xor edx,edx
    62.        mov r8,r13
    63. @@:    mov edi,[r8]
    64.        add rdi,rbx
    65.        mov ecx,sizeof1;sizeof aLdrGetProcedureAddress
    66.        mov esi,NameProc;offset aLdrGetProcedureAddress
    67.        repe cmpsb
    68.        or ecx,ecx
    69.        je @f
    70.        add r8,4
    71.        add edx,4
    72.        dec r14d;NumberOfNames
    73.        jnz @b
    74. @@:    mov eax,[r12+rdx]
    75.        add rax,rbx
    76.        leave
    77.        ret
    78. func endp
    79. ;.data---------------------------------------
    80. aLdrLoadDll db "LdrLoadDll",0
    81. aUser32_    dw 'u','s','e','r','3','2','.','d','l','l',0
    82. aLdrGetProcedureAddress db "LdrGetProcedureAddress",0
    83. aTitle      db "MessageBox without import",0
    84. aMessage    db "Hello, world!",0
    85. aMessageBoxA db "MessageBoxA",0
    86. end
    во вложении asm/exe-файл
     

    Вложения:

    mantissa нравится это.
  2. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    268
    Win7 x64:

    tut.png
     
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    Marylin,
    программу не пересобирал? Просто запустил из архива?
     
  4. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    268
    у меня нет масма - я просто запустил твой экзешник из архива.
    --- Сообщение объединено, 5 фев 2025 ---
    вот лог отладчика:
    Код (Text):
    1. 0:000> bp @$exentry
    2. *** WARNING: Unable to verify checksum for image00000000`00400000
    3.  
    4. 0:000> bl
    5. 0 e 00000000`00400200     0001 (0001)  0:**** image00000000_00400000+0x200
    6.  
    7. 0:000> g
    8. Breakpoint 0 hit
    9. image00000000_00400000+0x200:
    10. 00000000`00400200 c8500000        enter   50h,0
    11.  
    12. 0:000> g
    13. (450.b94): Access violation - code c0000005 (first chance)
    14. First chance exceptions are reported before any exception handling.
    15. This exception may be expected and handled.
    16. ntdll!LdrpApplyFileNameRedirection+0x37:
    17. 00000000`76eaea37 66833a08        cmp     word ptr [rdx],8 ds:00000000`00000000=????
    18.  
     
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    Marylin,
    откуда-то из глубины LdrpApplyFileNameRedirection я ее не использовал, у меня Windows 10 Pro, всё нормально, а если по шагам, откуда exception?
     
  6. mantissa

    mantissa Мембер Команда форума

    Публикаций:
    0
    Регистрация:
    9 сен 2022
    Сообщения:
    170
    у меня работает win 10
     
    Mikl___ нравится это.
  7. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    268
    судя по стеку вызовов или LdrLoadDll(), или LdrGetProcedureAddress()

    Код (Text):
    1.  
    2. 0:000> kv n
    3. # Child-SP           RetAddr            : Args to Child                                                              : Call Site
    4. 00 00000000`0013fc50  00000000`76eb4f91  : 00000000`00000000  00000000`00000000  00000000`76e873c0  00000000`00000000 : ntdll!LdrpApplyFileNameRedirection+0x37
    5. 01 00000000`0013fcf0  00000000`76eb7acc  : 00000000`76e80000  00000000`00000000  00000000`00400361  00000000`00000000 : ntdll!LdrGetDllHandleEx+0x101
    6. 02 00000000`0013fec0  00000000`004002d4  : 00000000`00000017  00000000`0040034a  00000000`00000000  00000000`00000000 : ntdll!LdrGetDllHandle+0x1c
    7. 03 00000000`0013ff00  00000000`00000017  : 00000000`0040034a  00000000`00000000  00000000`00000000  00000000`00000000 : image00000000_00400000+0x2d4
    8. 04 00000000`0013ff08  00000000`0040034a  : 00000000`00000000  00000000`00000000  00000000`00000000  00000000`00400389 : 0x17
    9. 05 00000000`0013ff10  00000000`00000000  : 00000000`00000000  00000000`00000000  00000000`00400389  00000000`00000000 : image00000000_00400000+0x34a
    10.  
    --- Сообщение объединено, 5 фев 2025 ---
    а в x64dbg падает сразу на старте, не успев даже сделать первый вздох:

    tut2.png
     
  8. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    530
  9. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    614
    Опять васик из 70-х.
     
  10. mantissa

    mantissa Мембер Команда форума

    Публикаций:
    0
    Регистрация:
    9 сен 2022
    Сообщения:
    170
    последняя процедура в стеке вызовов и у alex_dz и у Marylin LdrpApplyFileNameRedirection и потом ошибка чтения по нулевому адресу
     
    alex_dz нравится это.
  11. Prober

    Prober Member

    Публикаций:
    0
    Регистрация:
    4 дек 2008
    Сообщения:
    47
    Mikl___, у вас проблема с поиском адреса экспортируемой функции. Вот кусок документации от MS:

    [​IMG]

    А у вас по факту:
    Код (Text):
    1. i = Search_ExportNamePointerTable (ExportName);
    2. SymbolRVA = ExportAddressTable [i - OrdinalBase];
    Вероятно, на Win10 из-за особенностей DLL оба алгоритма дают одинаковый результат. А на Win7/Win8 есть несколько функций с ординалами без имён, они ломают поиск.


    Ещё момент. Ваша программа без релоков, ImageBase вписывается в Dword, поэтому здесь
    Код (Text):
    1. mov NameProc,edx
    2. . . .
    3. mov esi,NameProc
    проблем не возникает. Но вообще-то нужны 64-битные регистры.
     
  12. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    268
    Раскрутка стека показывает, что до адреса 0x004002d4 всё шло нормально,
    а дальше проц зашёл в call Result, в нёдрах которого и наткнулся на "NULL_POINTER_READ".
    если посмотреть в IDA, то получим сл.картину:

    ida.png

    Код (Text):
    1. 0:000> g
    2. (f4.bcc): Access violation - code c0000005 (first chance)
    3. First chance exceptions are reported before any exception handling.
    4. This exception may be expected and handled.
    5. ntdll!LdrpApplyFileNameRedirection+0x37:
    6. 00000000`76fcea37 66833a08        cmp     word ptr [rdx],8 ds:00000000`00000000=????
    7.  
    8. 0:000> !analyze -v
    9. *******************************************************************************
    10. *                        Exception Analysis                                   *
    11. *******************************************************************************
    12. FAULTING_IP:
    13. ntdll!LdrpApplyFileNameRedirection+37
    14. 00000000`76fcea37 66833a08        cmp     word ptr [rdx],8
    15.  
    16. EXCEPTION_RECORD:  ffffffffffffffff -- (.exr 0xffffffffffffffff)
    17. ExceptionAddress: 0000000076fcea37 (ntdll!LdrpApplyFileNameRedirection+0x37)
    18.    ExceptionCode: c0000005 (Access violation)
    19.   ExceptionFlags: 00000000
    20. NumberParameters: 2
    21.    Parameter[0] : 0000000000000000
    22.    Parameter[1] : 0000000000000000
    23. Attempt to read from address 0000000000000000
    24.  
    25. FOLLOWUP_IP:
    26. image00000000_00400000+2d4
    27. 00000000`004002d4  41b900000000    mov     r9d,0  <----------------------//
    28.  
    29. NTGLOBALFLAG         :  470
    30. APP_VERIFIER_FLAGS   :  0
    31. PRIMARY_PROBLEM_CLASS:  NULL_POINTER_READ
    32. LAST_CONTROL_TRANSFER:  from 0000000076fd4f91 to 0000000076fcea37
    33.  
    34. STACK_TEXT:
    35. 00000000`0013fc50  00000000`76fd4f91  : ntdll!LdrpApplyFileNameRedirection+0x37
    36. 00000000`0013fcf0  00000000`76fd7acc  : ntdll!LdrGetDllHandleEx+0x101
    37. 00000000`0013fec0  00000000`004002d4  : ntdll!LdrGetDllHandle+0x1c
    38. 00000000`0013ff00  00000000`00000017  : image00000000_00400000+0x2d4  <---------------------//
    39. 00000000`0013ff08  00000000`0040034a  : 0x17
    40. 00000000`0013ff10  00000000`00000000  : image00000000_00400000+0x34a
    41.  
    42. SYMBOL_STACK_INDEX :  3
    43. SYMBOL_NAME        :  image00000000_00400000+2d4
    44. FOLLOWUP_NAME      :  MachineOwner
    45. IMAGE_NAME         :  F:\tut_01c.exe
    46. DEBUG_FLR_TIMESTAMP:  67a33d2f
    47. STACK_COMMAND      :  ~0s ; kb
    48. BUCKET_ID          :  X64_APPLICATION_FAULT_NULL_POINTER_READ_image00000000_00400000+2d4
    49. --------------------------
     
  13. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    137
    Когда то давно можно было забсодить ось специально сделанным форматом пе хидера.
     
  14. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    530
    ага, а еще F0 0F C7 C8
    (pentium fdiv crash)
     
  15. k3rnl

    k3rnl Member

    Публикаций:
    0
    Регистрация:
    28 янв 2021
    Сообщения:
    68
    Советую использовать LdrGetProcedureAddressForCaller так как именно эта функция обрабатывается в ntdll.dll
    А LdrGetProcedureAddress и LdrGetProcedureAddressEx просто лишние стабы
     
  16. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. .code
    4. WinMain proc
    5. local Message:UNICODE_STRING
    6. local Result:qword
    7.        mov rax,qword ptr gs:[60h];Получаем адрес PEB
    8.        mov rax,[rax+18h];Смещаемся к структуре PEB_LDR_DATA
    9.        mov rax,[rax+20h];Смещаемся к полю PEB_LDR_DATA.InMemoryOrderModuleList
    10.        mov rax,[rax]
    11.        mov rbx,[rax+20h];Базовый адрес ntdll.dll
    12.        mov r9d,[rbx].IMAGE_DOS_HEADER.e_lfanew;смещение до PE-заголовка
    13. ;18h to optional header + 70h to data directories
    14.        mov r9d,dword ptr[rbx+r9+18h].IMAGE_OPTIONAL_HEADER64.DataDirectory;смещение до секции экспорта
    15. ;Пеpейти к таблице экспоpта и получить количество имен (NumberOfNames)
    16.        add r9,rbx;переходим в таблицу экспорта
    17.        mov r13d,[r9].IMAGE_EXPORT_DIRECTORY.AddressOfNames;[r9+20h]
    18.        add r13,rbx;
    19.        mov r15d,[r9].IMAGE_EXPORT_DIRECTORY.AddressOfNameOrdinals;AddressOfNameOrdinals (rva)
    20.        add r15,rbx;add dll base address ExportOrdinalTable
    21.        mov r12d,[r9].IMAGE_EXPORT_DIRECTORY.AddressOfFunctions;[r9+1Ch]
    22.        add r12,rbx;tableOfAddressOfFunctions
    23. ;---------------------------------------------------
    24.        mov ecx,11
    25.        invoke func,,"LdrLoadDll"
    26.        mov Message.woLength,14h
    27.        mov Message.MaximumLength,16h
    28.        movr qword ptr Message.Buffer,aUser32_
    29.        lea r8,Message
    30.        mov ecx,1
    31.        lea edx,Result
    32.        mov r9,rdx
    33.        call rax;LdrLoadDll_
    34. ;---------------------------------------
    35.        mov Message.woLength,12
    36.        mov Message.MaximumLength,13
    37.        movr qword ptr Message.Buffer,aMessageBoxA
    38. ;----------------------------------------------------
    39.        mov ecx,20
    40.        invoke func,,"LdrGetProcedureAddressForCaller"
    41.        xor r8,r8
    42.        lea rdx,Message
    43.        movr qword ptr[rsp+28h],aMessageBoxA
    44.        lea r9,Result
    45.        mov rcx,[r9]
    46.        and dword ptr[rsp+20h],0
    47.        call rax;LdrGetProcedureAddress_
    48. ;-----------------------------------
    49.        invoke Result,0,"Hello, world!","MessageBox without import",MB_OK
    50.        mov ecx,19
    51.        invoke func,,"RtlExitUserProcess"
    52.        xor ecx,ecx
    53.        call rax;RtlExitUserProcess
    54. WinMain endp
    55. ;i =  Search_ExportNamePointerTable(ExportName)
    56. ;ordinal = ExportOrdinalTable[i]
    57. ;SymbolRVA = ExportAddressTable [ordinal - OrdinalBase];
    58. func proc sizeof1:dword,NameProc:qword
    59.        mov sizeof1,ecx
    60.        mov NameProc,rdx
    61.        xor edx,edx
    62. @@:    mov edi,[r13+rdx*4];AddressOfNames[rdx*4]
    63.        add rdi,rbx
    64.        mov rcx,sizeof1;
    65.        mov rsi,NameProc;
    66.        repe cmpsb
    67.        or ecx,ecx
    68.        je @f
    69.        inc edx
    70.        jnz @b
    71. @@:    movzx edx,word ptr[r15+rdx*2];get ordinal value from array of words ordinal = ExportOrdinalTable[rdx*2]
    72.        mov eax,[r12+rdx*4];r12=AddressOfFunctions
    73.        add rax,rbx
    74.        leave
    75.        ret
    76. func endp
    77. ;---------------------------------------
    78. aUser32_ dw "u","s","e","r","3","2",".","d","l","l",0
    79. aMessageBoxA db "MessageBoxA",0
    80. end
    во вложении asm/exe-файл
     

    Вложения:

  17. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    268
    Mikl___, всё равно на моей Win7 не работает,
    только на этот раз падает на входе в LdrLoadDll(), и выстреливает такое-же окно с ошибкой:
    Код (Text):
    1. 0:000> g
    2. (b3c.b50): Access violation - code c0000005 (first chance)
    3. First chance exceptions are reported before any exception handling.
    4. This exception may be expected and handled.
    5.  
    6. ntdll!LdrLoadDll+0x97:
    7. 00000000`77d5a3c7 488b7308        mov     rsi,qword ptr [rbx+8] ds:00000000`00000008=????????????????
    8.  
    9. 0:000> !analyze -v
    10. *******************************************************************************
    11. *                        Exception Analysis                                   *
    12. *******************************************************************************
    13. FAULTING_IP:
    14. ntdll!LdrLoadDll+97
    15. 00000000`77d5a3c7 488b7308        mov     rsi,qword ptr [rbx+8]
    16.  
    17. EXCEPTION_RECORD:  ffffffffffffffff -- (.exr 0xffffffffffffffff)
    18. ExceptionAddress: 0000000077d5a3c7 (ntdll!LdrLoadDll+0x0000000000000097)
    19.    ExceptionCode: c0000005 (Access violation)
    20.   ExceptionFlags: 00000000
    21. NumberParameters: 2
    22.     Parameter[0]: 0000000000000000
    23.     Parameter[1]: 0000000000000008
    24. Attempt to read from address 0000000000000008
    25.  
    26. FOLLOWUP_IP:
    27. image00000000_00400000+259
    28. 00000000`00400259 66c745f00c00    mov     word ptr [rbp-10h],0Ch
    29.  
    30. NTGLOBALFLAG      :  470
    31. APP_VERIFIER_FLAGS:  0
    32. BUGCHECK_STR      :  APP_FAULT_NULL_CLASS_PTR_DEREFERENCE_ONE_BIT_INVALID_POINTER_READ
    33. PROBLEM_CLASS     :  NULL_CLASS_PTR_DEREFERENCE_ONE_BIT
    34. BUCKET_ID         :  NULL_CLASS_PTR_DEREFERENCE_ONE_BIT
    35. LAST_CONTROL_TRANSFER:  from 0000000000400259 to 0000000077d5a3c7
    36.  
    37. STACK_TEXT:
    38. 00000000`0013fe90  00000000`00400259  : ntdll!LdrLoadDll+0x97
    39. 00000000`0013ff00  00000000`0000000b  : image00000000_00400000+0x259
    40. 00000000`0013ff08  00000000`77c70000  : 0xb
    41. 00000000`0013ff10  00000000`0013ff50  : ntdll!NtDllUserStubs <PERF> (ntdll+0x0)
    42. 00000000`0013ff18  00000000`0040030f  : 0x13ff50
    43. 00000000`0013ff20  00000000`00000000  : image00000000_00400000+0x30f
    44. ---------------------------------------
     
  18. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    Marylin,
    ну, хоть какой-то прогресс :good3:, проблему описал Prober, проблема с поиском адреса экспортируемой функции ... на Win7/Win8 есть несколько функций с ординалами без имён, они ломают поиск я не помню, где-то у тебя в статьях на codeby.net был описан процесс поиска функций в экспорте, не можешь подсказать где? Prober и k3rnl, отдельное спасибо, кое-что я исправил, но судя по всему не до конца
    Попробуйте с новым ехе-шником
     

    Вложения:

  19. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    268
    без изменений LdrLoadDll()
    вроде РЕ-файл --> Импорт
     
  20. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    530
    'tut_01d.exe.4940.dmp' (Minidump): Loaded 'C:\Windows\System32\ntdll.dll'. Symbols loaded.
    'tut_01d.exe.4940.dmp' (Minidump): Loaded 'C:\Windows\System32\kernel32.dll'. Symbols loaded.
    'tut_01d.exe.4940.dmp' (Minidump): Loaded 'C:\Windows\System32\KERNELBASE.dll'. Symbols loaded.
    Unhandled exception at 0x0000000076E5A3C7 (ntdll.dll) in tut_01d.exe.4940.dmp: 0xC0000005: Access violation reading location 0x0000000000000008.


    https://prnt.sc/aGSBqeK_8ION