LoadLibrary EXE

Тема в разделе "WASM.BEGINNERS", создана пользователем yurza, 8 апр 2011.

  1. yurza

    yurza New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2008
    Сообщения:
    69
    Код (Text):
    1. PIMAGE_FILE_HEADER  pfh;
    2. PIMAGE_SECTION_HEADER   psh;
    3. PIMAGE_OPTIONAL_HEADER  poh;
    4. PVOID aa = LoadLibrary("calc.exe");
    5. GetHeaders((PCHAR) aa, &pfh, &poh, &psh);
    6. PPEB aae=GetPEB();
    7. aae->ImageBaseAddress = aa;
    8. LPVOID entry = (LPVOID)( (DWORD)aa + poh->AddressOfEntryPoint );
    9. __asm {
    10.        call dword ptr [entry]
    11.        }
    Почему не запускается объясните кто чем может

    Код (Text):
    1. FAULTING_IP:
    2. msvcrt!__crtCompareStringA+380
    3. 77c24125 e831330000      call    msvcrt!_SEH_epilog (77c2745b)
    4.  
    5. EXCEPTION_RECORD:  ffffffff -- (.exr 0xffffffffffffffff)
    6. ExceptionAddress: 77c24125 (msvcrt!__crtCompareStringA+0x00000380)
    7.    ExceptionCode: c0000409 (Stack buffer overflow)
    8.   ExceptionFlags: 00000000
    9. NumberParameters: 0
    10.  
    11. DEFAULT_BUCKET_ID:  STACK_BUFFER_OVERRUN
    12.  
    13. PROCESS_NAME:  podgr.exe
    14.  
    15. ERROR_CODE: (NTSTATUS) 0xc0000409 - <Unable to get error code text>
    16.  
    17. GSFAILURE_FUNCTION: msvcrt!__crtCompareStringA
    18.  
    19. GSFAILURE_MODULE_COOKIE: 0000c206 msvcrt!__security_cookie [ 77c4fac4 ]
    20.  
    21. GSFAILURE_FRAME_COOKIE:  0000c206
    22.  
    23. GSFAILURE_CORRUPTED_COOKIE: 0012eb2c [ 0012ea48 ]
    24.  
    25. SECURITY_COOKIE:  Expected 0000c206 found 0012eb2c
    26.  
    27. GSFAILURE_ANALYSIS_TEXT: !gs output:
    28. Stack buffer overrun analysis follows:
    29.  
    30. Corruption occured in msvcrt!__crtCompareStringA or one of its callers
    31. Real canary at 0x77c4fac4 (msvcrt!__security_cookie): 0x0000c206
    32. Real canary complement at 0x77C51780: 0xFFFF3DF9
    33. Canary at gsfailure frame: 0x0000C206
    34. Corrupted canary at 0x0012EA48: 0x0012EB2C
    35. Detected off-by-4 bug in __report_gsfailure, saved ESP will be corrected to ESP+4.
    36. Function uses SEH exception handling
    37. Callee-saved register size = 0 (0x00000000)
    38. EBP = 0x0012ea64, ESP = 0x0012ea00, delta = 0x00000064
    39. EBP/ESP appear correct. (EBP-ESP) matches local storage set up in the function prolog
    40.  
    41. Function msvcrt!__crtCompareStringA:
    42.     Funtion has no locals
    43. no candidate buffer found
    44.  
    45. Stack buffer overrun analysis complete.
    46.  
    47.  
    48. NTGLOBALFLAG:  4000
    49.  
    50. APPLICATION_VERIFIER_FLAGS:  0
    51.  
    52. FAULTING_THREAD:  000009c8
    53.  
    54. PRIMARY_PROBLEM_CLASS:  STACK_BUFFER_OVERRUN
    55.  
    56. BUGCHECK_STR:  APPLICATION_FAULT_STACK_BUFFER_OVERRUN
    57.  
    58. STACK_TEXT:  
    59. 0012a19c 7c90df3c 7c8025db 00000720 00000000 ntdll!KiFastSystemCallRet
    60. 0012a1a0 7c8025db 00000720 00000000 0012a1d4 ntdll!NtWaitForSingleObject+0xc
    61. 0012a204 7c802542 00000720 000493e0 00000000 kernel32!WaitForSingleObjectEx+0xa8
    62. 0012a218 699dada6 00000720 000493e0 003a0043 kernel32!WaitForSingleObject+0x12
    63. 0012acf0 699daff1 00000738 000009b0 0000072c faultrep!InternalGenerateMinidumpEx+0x335
    64. 0012ad1c 699db5d9 00000738 000009b0 0012ad38 faultrep!InternalGenerateMinidump+0x75
    65. 0012b680 699d6652 00000738 000009b0 0012b710 faultrep!InternalGenFullAndTriageMinidumps+0x159
    66. 0012cef8 699d7d3d 0012cf58 00171000 00000000 faultrep!ReportFaultDWM+0x4e5
    67. 0012d3d8 699d82d8 0012e9f0 0012e220 00000001 faultrep!StartManifestReportImmediate+0x268
    68. 0012e444 7c8643c6 0012e9f0 00000001 0012e718 faultrep!ReportFault+0x55a
    69. 0012e6b8 77c47b04 0012e9f0 00000000 c0000409 kernel32!UnhandledExceptionFilter+0x55b
    70. 0012e9f8 77c24125 0012e9f0 0000000e 0012ef24 msvcrt!__report_gsfailure+0xe3
    71. 0012ea64 7c90327a 0012eb2c 0012ef24 0012eb40 msvcrt!__crtCompareStringA+0x380
    72. 0012eb14 7c90e46a 00000000 0012eb40 0012eb2c ntdll!ExecuteHandler+0x24
    73. 0012eb14 7c812aeb 00000000 0012eb40 0012eb2c ntdll!KiUserExceptionDispatcher+0xe
    74. 0012ee60 77ea0462 000006f7 00000001 00000000 kernel32!RaiseException+0x53
    75. 0012ee78 77eb1622 000006f7 0012f524 00000000 rpcrt4!RpcpRaiseException+0x24
    76. 0012ee94 77e79f99 0012f524 0101248c 00000000 rpcrt4!NdrServerContextNewUnmarshall+0xc1
    77. 0012ef34 00401f17 00a52b30 73722e20 20206372 rpcrt4!NdrUnmarshallHandle+0x52
    78. WARNING: Stack unwind information not available. Following frames may be wrong.
    79. 0012f3ac 4006b958 00a52b30 40047ecd 40047eac podgr+0x1f17
    80. 0012f508 40047e41 00a52b30 0012f704 00a52b30 vcl50!ControlsTControlClick$qqrv+0x68
    81. 0012f534 4006e4a8 009a0436 0012f77c 009c6850 vcl50!StdctrlsTButtonControlWndProc$qqrr17MessagesTMessage+0x71
    82. 0012f6a4 40054117 0012f77c 008e0fd5 009c6850 vcl50!ControlsTWinControlDefaultHandler$qqrpv+0x124
    83. 0012f6cc 4006df7b 0012f6e0 4006df93 0012f6fc vcl50!FormsTCustomFormWndProc$qqrr17MessagesTMessage+0x3af
    84. 0012f6fc 400511d6 00000111 00000436 009a0436 vcl50!ControlsTWinControlMainWndProc$qqrr17MessagesTMessage+0x2f
    85. 0012f714 7e368734 001e02fa 00000111 00000436 vcl50!FormsSetAutoSubClass$qqro+0x1a
    86. 0012f740 7e368816 008e0fd5 001e02fa 00000111 user32!InternalCallWinProc+0x28
    87. 0012f7a8 7e37a013 00000000 008e0fd5 001e02fa user32!UserCallWinProcCheckWow+0x150
    88. 0012f7d8 7e37a039 ffff056d 001e02fa 00000111 user32!CallWindowProcAorW+0x98
    89. 0012f7f8 5d5b5e5e ffff056d 001e02fa 00000111 user32!CallWindowProcW+0x1b
    90. 0012f814 5d5b602f 001e02fa 00000111 00000436 comctl32!CallOriginalWndProc+0x1a
    91. 0012f870 5d5b5fe4 00146738 001e02fa 00000111 comctl32!CallNextSubclassProc+0x3c
    92. 0012f894 5d5f04bf 001e02fa 00000111 00000436 comctl32!DefSubclassProc+0x46
    93. 0012f8ac 5d5b602f 001e02fa 00000111 00000436 comctl32!FlatSB_SubclassWndProc+0xf2
    94. 0012f908 5d5b60be 00146738 001e02fa 00000111 comctl32!CallNextSubclassProc+0x3c
    95. 0012f95c 7e368734 001e02fa 00000111 00000436 comctl32!MasterSubclassProc+0x51
    96. 0012f988 7e368816 5d5b607d 001e02fa 00000111 user32!InternalCallWinProc+0x28
    97. 0012f9f0 7e37927b 00000000 5d5b607d 001e02fa user32!UserCallWinProcCheckWow+0x150
    98. 0012fa2c 7e3792e3 0057e848 005cbd68 00000436 user32!SendMessageWorker+0x4a5
    99. 0012fa4c 7e39ff7d 001e02fa 00000111 00000436 user32!SendMessageW+0x7f
    100. 0012fa64 7e3965d2 005e8d00 00000000 005e8d00 user32!xxxButtonNotifyParent+0x41
    101. 0012fa80 7e375e94 0016e0b8 00000001 00000000 user32!xxxBNReleaseCapture+0xf8
    102. 0012fb04 7e38b082 005e8d00 00000202 00000000 user32!ButtonWndProcWorker+0x6df
    103. 0012fb24 7e368734 009a0436 00000202 00000000 user32!ButtonWndProcA+0x5d
    104. 0012fb50 7e368816 7e38b036 009a0436 00000202 user32!InternalCallWinProc+0x28
    105. 0012fbb8 7e37a013 00000000 7e38b036 009a0436 user32!UserCallWinProcCheckWow+0x150
    106. 0012fbe8 7e37a998 7e38b036 009a0436 00000202 user32!CallWindowProcAorW+0x98
    107. 0012fc08 4006e453 7e38b036 009a0436 00000202 user32!CallWindowProcA+0x1b
    108. 0012fd9c 40047e41 0012fe5c 008e0fa1 00a52b30 vcl50!ControlsTWinControlDefaultHandler$qqrpv+0xcf
    109. 0012fddc 400511d6 00000202 00000000 000a002b vcl50!StdctrlsTButtonControlWndProc$qqrr17MessagesTMessage+0x71
    110. 0012fdf4 7e368734 009a0436 00000202 00000000 vcl50!FormsSetAutoSubClass$qqro+0x1a
    111. 0012fe20 7e368816 008e0fa1 009a0436 00000202 user32!InternalCallWinProc+0x28
    112. 0012fe88 7e3689cd 00000000 008e0fa1 009a0436 user32!UserCallWinProcCheckWow+0x150
    113. 0012fee8 7e3696c7 0012ff18 00000001 0012ff4c user32!DispatchMessageWorker+0x306
    114. 0012fef8 4005aa8c 0012ff18 0012ff00 00000000 user32!DispatchMessageA+0xf
    115. 0012ff4c 004015ab 00000000 0040421c 00142372 vcl50!FormsTApplicationProcessMessage$qqrr6tagMSG+0x88
    116. 0012ff88 3257dbef 00400000 00000000 00142372 podgr+0x15ab
    117. 0012ffc0 7c817067 00140178 00000000 7ffdb000 cc3250mt!_startup+0x14f
    118. 0012fff0 00000000 00401000 00000000 00000000 kernel32!BaseProcessStart+0x23
    119.  
    120.  
    121. STACK_COMMAND:  .cxr 0012EB40 ; kb ; ~0s ; kb
    122.  
    123. FOLLOWUP_IP:
    124. msvcrt!__crtCompareStringA+380
    125. 77c24125 e831330000      call    msvcrt!_SEH_epilog (77c2745b)
    126.  
    127. SYMBOL_STACK_INDEX:  c
    128.  
    129. SYMBOL_NAME:  msvcrt!__crtCompareStringA+380
    130.  
    131. FOLLOWUP_NAME:  MachineOwner
    132.  
    133. MODULE_NAME: msvcrt
    134.  
    135. IMAGE_NAME:  msvcrt.dll
    136.  
    137. DEBUG_FLR_IMAGE_TIMESTAMP:  4803825b
    138.  
    139. FAILURE_BUCKET_ID:  STACK_BUFFER_OVERRUN_c0000409_msvcrt.dll!__crtCompareStringA
    140.  
    141. BUCKET_ID:  APPLICATION_FAULT_STACK_BUFFER_OVERRUN_msvcrt!__crtCompareStringA+380
    142.  
    143. Followup: MachineOwner
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    а почему он должен запуститься? смотри отладчиком... образ не релоцируемый может быть, а LoadLibrary поставил его не по базовому адресу... издевательства над PEB смотрятся очень странно... асм-вставка не нужна, некрасива и непереносима, используй указатель на функцию...
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Даже если релоцируемый, LoadLibrary не будет настривать ни релоки, ни импорт, ни вообще что либо. LoadLibrary для exe-шников используется исключительно для доступа к их ресурсам.
     
  4. yurza

    yurza New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2008
    Сообщения:
    69
    Но ведь LoadLibrary как раз и настраивает все релоки и судя по отладчику импорт тоже настраивается ведь если в ручную спроецировать, то действительно надо все настраивать а тут как бы сама LoadLibrary все сделала и если смотреть на карту памяти в который проецируется образ то все вроде в порядке.
     
  5. Indy_Rnd_001

    Indy_Rnd_001 New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2011
    Сообщения:
    7
    Разрушены локальные куки. Это изза нарушения размера локальных переменных, когда куки затираются. Пересмотреть размер переменных и валидность ссылок.
     
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    для экзе-файлов?

    да, куки... чего только люди не придумают, чтобы не юзать буффер-сейф функции... кстати может проблема в выравнивании стека перед вызовом?)
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Rel
    Ну... Да. Именно это я в общем-то и сказал. Всё, что сделает зарузчик, — это секции на места поставит в соответствии с их RVA.
     
  8. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    в таком случае можно длл-флаг в пе-файле подправить перед загрузкой)))
     
  9. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Rel
    Можно, конечно, но без релоков оно всё равно не загрузится, а с релоками пойдёт точку входа, как DllMain исполнять. Я и не говорю, что задача неразрешимая. Просто факт констатировал.
     
  10. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    да, согласен... тут либо свой загрузщик писать, либо разбирать в неэкспортируемых функциях загрузщика винды...
     
  11. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.186
    Адрес:
    подполье
     
  12. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    yurza
    Есть подозрение, что при LoadLibrary ЕХЕ-ника винда просто проецирует образ в память только для доступа к его ресурсам и релоки с импортом вообще не настраиваются.
     
  13. yurza

    yurza New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2008
    Сообщения:
    69
    При PVOID aa = LoadLibrary("calc.exe");
    [​IMG]

    При
    LoadLibraryEx("calc.exe",0,LOAD_LIBRARY_AS_DATAFILE);

    [​IMG]
     
  14. yurza

    yurza New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2008
    Сообщения:
    69
    Появилась минутка и решил попробовать ещё по экспериментировать
    Код (Text):
    1. PIMAGE_FILE_HEADER  pfh;
    2. PIMAGE_SECTION_HEADER   psh;
    3. PIMAGE_OPTIONAL_HEADER  poh;
    4. PVOID aa = LoadLibrary("calc.111");
    5. GetHeaders((PCHAR) aa, &pfh, &poh, &psh);
    6. PPEB aae=GetPEB();
    7. aae->ImageBaseAddress = aa;
    8. LPVOID entry = (LPVOID)( (DWORD)aa + poh->AddressOfEntryPoint );
    9. __asm {
    10.        call dword ptr [entry]
    11.        }
    Где calc.111 это переименованный сalc.exe с поправленным в IMAGE_FILE_HEADER Characteristic на IMAGE_FILE_DLL и получилось загрузить калькулятор
    [​IMG]
    Только надписи все серые
     
  15. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Можно и без LoadLibrary прекрасно грузить ПЕ файлы в память,в отмапленном виде.И причем по их родной базе.
     
  16. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    yurza
    Манифест используйте.
     
  17. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    интересовался подобным вопросом также, заметил эту темку здесь
    верно

    Код (Text):
    1.         if (Entry->Flags & LDRP_IMAGE_DLL) {
    2.  
    3.             BOOLEAN AllowRelocation;
    4.             UNICODE_STRING SystemDll;
    5.             AllowRelocation = TRUE;
    6.             ....
    7. ----------------------------------------
    8.             if (LdrDataTableEntry->Flags & LDRP_IMAGE_DLL) {
    9.  
    10.                 try {
    11.                     st = LdrpWalkImportDescriptor(
    12.                               DllPath,
    13.                               LdrDataTableEntry
    14.                               );
    15.                     ...
    если не выставлен магический флаг , то образ проецируется в память без обработки релоков и импорта,
    чтобы запустить таким образом прогу - нужно поставить на секции атрибуты доступные для записи, вручную обработать импорт и релоки и при желании восстановить аттрибуты защиты для секций
     
  18. phoukait

    phoukait New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2011
    Сообщения:
    43
    karabas_barabas
    Не проще ли поставить нотифи на загрузку и после отображения взвести флаг в описателе модуля. Не обязательно нотифи ставить в LdrpDllNotificationList, можно например лог мониторить(аля ShowSnaps("LDR: Loading..") -> filter DBG_PRINT_EXCEPTION_C -> S-routing).