Код (Text): PIMAGE_FILE_HEADER pfh; PIMAGE_SECTION_HEADER psh; PIMAGE_OPTIONAL_HEADER poh; PVOID aa = LoadLibrary("calc.exe"); GetHeaders((PCHAR) aa, &pfh, &poh, &psh); PPEB aae=GetPEB(); aae->ImageBaseAddress = aa; LPVOID entry = (LPVOID)( (DWORD)aa + poh->AddressOfEntryPoint ); __asm { call dword ptr [entry] } Почему не запускается объясните кто чем может Код (Text): FAULTING_IP: msvcrt!__crtCompareStringA+380 77c24125 e831330000 call msvcrt!_SEH_epilog (77c2745b) EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff) ExceptionAddress: 77c24125 (msvcrt!__crtCompareStringA+0x00000380) ExceptionCode: c0000409 (Stack buffer overflow) ExceptionFlags: 00000000 NumberParameters: 0 DEFAULT_BUCKET_ID: STACK_BUFFER_OVERRUN PROCESS_NAME: podgr.exe ERROR_CODE: (NTSTATUS) 0xc0000409 - <Unable to get error code text> GSFAILURE_FUNCTION: msvcrt!__crtCompareStringA GSFAILURE_MODULE_COOKIE: 0000c206 msvcrt!__security_cookie [ 77c4fac4 ] GSFAILURE_FRAME_COOKIE: 0000c206 GSFAILURE_CORRUPTED_COOKIE: 0012eb2c [ 0012ea48 ] SECURITY_COOKIE: Expected 0000c206 found 0012eb2c GSFAILURE_ANALYSIS_TEXT: !gs output: Stack buffer overrun analysis follows: Corruption occured in msvcrt!__crtCompareStringA or one of its callers Real canary at 0x77c4fac4 (msvcrt!__security_cookie): 0x0000c206 Real canary complement at 0x77C51780: 0xFFFF3DF9 Canary at gsfailure frame: 0x0000C206 Corrupted canary at 0x0012EA48: 0x0012EB2C Detected off-by-4 bug in __report_gsfailure, saved ESP will be corrected to ESP+4. Function uses SEH exception handling Callee-saved register size = 0 (0x00000000) EBP = 0x0012ea64, ESP = 0x0012ea00, delta = 0x00000064 EBP/ESP appear correct. (EBP-ESP) matches local storage set up in the function prolog Function msvcrt!__crtCompareStringA: Funtion has no locals no candidate buffer found Stack buffer overrun analysis complete. NTGLOBALFLAG: 4000 APPLICATION_VERIFIER_FLAGS: 0 FAULTING_THREAD: 000009c8 PRIMARY_PROBLEM_CLASS: STACK_BUFFER_OVERRUN BUGCHECK_STR: APPLICATION_FAULT_STACK_BUFFER_OVERRUN STACK_TEXT: 0012a19c 7c90df3c 7c8025db 00000720 00000000 ntdll!KiFastSystemCallRet 0012a1a0 7c8025db 00000720 00000000 0012a1d4 ntdll!NtWaitForSingleObject+0xc 0012a204 7c802542 00000720 000493e0 00000000 kernel32!WaitForSingleObjectEx+0xa8 0012a218 699dada6 00000720 000493e0 003a0043 kernel32!WaitForSingleObject+0x12 0012acf0 699daff1 00000738 000009b0 0000072c faultrep!InternalGenerateMinidumpEx+0x335 0012ad1c 699db5d9 00000738 000009b0 0012ad38 faultrep!InternalGenerateMinidump+0x75 0012b680 699d6652 00000738 000009b0 0012b710 faultrep!InternalGenFullAndTriageMinidumps+0x159 0012cef8 699d7d3d 0012cf58 00171000 00000000 faultrep!ReportFaultDWM+0x4e5 0012d3d8 699d82d8 0012e9f0 0012e220 00000001 faultrep!StartManifestReportImmediate+0x268 0012e444 7c8643c6 0012e9f0 00000001 0012e718 faultrep!ReportFault+0x55a 0012e6b8 77c47b04 0012e9f0 00000000 c0000409 kernel32!UnhandledExceptionFilter+0x55b 0012e9f8 77c24125 0012e9f0 0000000e 0012ef24 msvcrt!__report_gsfailure+0xe3 0012ea64 7c90327a 0012eb2c 0012ef24 0012eb40 msvcrt!__crtCompareStringA+0x380 0012eb14 7c90e46a 00000000 0012eb40 0012eb2c ntdll!ExecuteHandler+0x24 0012eb14 7c812aeb 00000000 0012eb40 0012eb2c ntdll!KiUserExceptionDispatcher+0xe 0012ee60 77ea0462 000006f7 00000001 00000000 kernel32!RaiseException+0x53 0012ee78 77eb1622 000006f7 0012f524 00000000 rpcrt4!RpcpRaiseException+0x24 0012ee94 77e79f99 0012f524 0101248c 00000000 rpcrt4!NdrServerContextNewUnmarshall+0xc1 0012ef34 00401f17 00a52b30 73722e20 20206372 rpcrt4!NdrUnmarshallHandle+0x52 WARNING: Stack unwind information not available. Following frames may be wrong. 0012f3ac 4006b958 00a52b30 40047ecd 40047eac podgr+0x1f17 0012f508 40047e41 00a52b30 0012f704 00a52b30 vcl50!ControlsTControlClick$qqrv+0x68 0012f534 4006e4a8 009a0436 0012f77c 009c6850 vcl50!StdctrlsTButtonControlWndProc$qqrr17MessagesTMessage+0x71 0012f6a4 40054117 0012f77c 008e0fd5 009c6850 vcl50!ControlsTWinControlDefaultHandler$qqrpv+0x124 0012f6cc 4006df7b 0012f6e0 4006df93 0012f6fc vcl50!FormsTCustomFormWndProc$qqrr17MessagesTMessage+0x3af 0012f6fc 400511d6 00000111 00000436 009a0436 vcl50!ControlsTWinControlMainWndProc$qqrr17MessagesTMessage+0x2f 0012f714 7e368734 001e02fa 00000111 00000436 vcl50!FormsSetAutoSubClass$qqro+0x1a 0012f740 7e368816 008e0fd5 001e02fa 00000111 user32!InternalCallWinProc+0x28 0012f7a8 7e37a013 00000000 008e0fd5 001e02fa user32!UserCallWinProcCheckWow+0x150 0012f7d8 7e37a039 ffff056d 001e02fa 00000111 user32!CallWindowProcAorW+0x98 0012f7f8 5d5b5e5e ffff056d 001e02fa 00000111 user32!CallWindowProcW+0x1b 0012f814 5d5b602f 001e02fa 00000111 00000436 comctl32!CallOriginalWndProc+0x1a 0012f870 5d5b5fe4 00146738 001e02fa 00000111 comctl32!CallNextSubclassProc+0x3c 0012f894 5d5f04bf 001e02fa 00000111 00000436 comctl32!DefSubclassProc+0x46 0012f8ac 5d5b602f 001e02fa 00000111 00000436 comctl32!FlatSB_SubclassWndProc+0xf2 0012f908 5d5b60be 00146738 001e02fa 00000111 comctl32!CallNextSubclassProc+0x3c 0012f95c 7e368734 001e02fa 00000111 00000436 comctl32!MasterSubclassProc+0x51 0012f988 7e368816 5d5b607d 001e02fa 00000111 user32!InternalCallWinProc+0x28 0012f9f0 7e37927b 00000000 5d5b607d 001e02fa user32!UserCallWinProcCheckWow+0x150 0012fa2c 7e3792e3 0057e848 005cbd68 00000436 user32!SendMessageWorker+0x4a5 0012fa4c 7e39ff7d 001e02fa 00000111 00000436 user32!SendMessageW+0x7f 0012fa64 7e3965d2 005e8d00 00000000 005e8d00 user32!xxxButtonNotifyParent+0x41 0012fa80 7e375e94 0016e0b8 00000001 00000000 user32!xxxBNReleaseCapture+0xf8 0012fb04 7e38b082 005e8d00 00000202 00000000 user32!ButtonWndProcWorker+0x6df 0012fb24 7e368734 009a0436 00000202 00000000 user32!ButtonWndProcA+0x5d 0012fb50 7e368816 7e38b036 009a0436 00000202 user32!InternalCallWinProc+0x28 0012fbb8 7e37a013 00000000 7e38b036 009a0436 user32!UserCallWinProcCheckWow+0x150 0012fbe8 7e37a998 7e38b036 009a0436 00000202 user32!CallWindowProcAorW+0x98 0012fc08 4006e453 7e38b036 009a0436 00000202 user32!CallWindowProcA+0x1b 0012fd9c 40047e41 0012fe5c 008e0fa1 00a52b30 vcl50!ControlsTWinControlDefaultHandler$qqrpv+0xcf 0012fddc 400511d6 00000202 00000000 000a002b vcl50!StdctrlsTButtonControlWndProc$qqrr17MessagesTMessage+0x71 0012fdf4 7e368734 009a0436 00000202 00000000 vcl50!FormsSetAutoSubClass$qqro+0x1a 0012fe20 7e368816 008e0fa1 009a0436 00000202 user32!InternalCallWinProc+0x28 0012fe88 7e3689cd 00000000 008e0fa1 009a0436 user32!UserCallWinProcCheckWow+0x150 0012fee8 7e3696c7 0012ff18 00000001 0012ff4c user32!DispatchMessageWorker+0x306 0012fef8 4005aa8c 0012ff18 0012ff00 00000000 user32!DispatchMessageA+0xf 0012ff4c 004015ab 00000000 0040421c 00142372 vcl50!FormsTApplicationProcessMessage$qqrr6tagMSG+0x88 0012ff88 3257dbef 00400000 00000000 00142372 podgr+0x15ab 0012ffc0 7c817067 00140178 00000000 7ffdb000 cc3250mt!_startup+0x14f 0012fff0 00000000 00401000 00000000 00000000 kernel32!BaseProcessStart+0x23 STACK_COMMAND: .cxr 0012EB40 ; kb ; ~0s ; kb FOLLOWUP_IP: msvcrt!__crtCompareStringA+380 77c24125 e831330000 call msvcrt!_SEH_epilog (77c2745b) SYMBOL_STACK_INDEX: c SYMBOL_NAME: msvcrt!__crtCompareStringA+380 FOLLOWUP_NAME: MachineOwner MODULE_NAME: msvcrt IMAGE_NAME: msvcrt.dll DEBUG_FLR_IMAGE_TIMESTAMP: 4803825b FAILURE_BUCKET_ID: STACK_BUFFER_OVERRUN_c0000409_msvcrt.dll!__crtCompareStringA BUCKET_ID: APPLICATION_FAULT_STACK_BUFFER_OVERRUN_msvcrt!__crtCompareStringA+380 Followup: MachineOwner
а почему он должен запуститься? смотри отладчиком... образ не релоцируемый может быть, а LoadLibrary поставил его не по базовому адресу... издевательства над PEB смотрятся очень странно... асм-вставка не нужна, некрасива и непереносима, используй указатель на функцию...
Даже если релоцируемый, LoadLibrary не будет настривать ни релоки, ни импорт, ни вообще что либо. LoadLibrary для exe-шников используется исключительно для доступа к их ресурсам.
Но ведь LoadLibrary как раз и настраивает все релоки и судя по отладчику импорт тоже настраивается ведь если в ручную спроецировать, то действительно надо все настраивать а тут как бы сама LoadLibrary все сделала и если смотреть на карту памяти в который проецируется образ то все вроде в порядке.
Разрушены локальные куки. Это изза нарушения размера локальных переменных, когда куки затираются. Пересмотреть размер переменных и валидность ссылок.
для экзе-файлов? да, куки... чего только люди не придумают, чтобы не юзать буффер-сейф функции... кстати может проблема в выравнивании стека перед вызовом?)
Rel Ну... Да. Именно это я в общем-то и сказал. Всё, что сделает зарузчик, — это секции на места поставит в соответствии с их RVA.
Rel Можно, конечно, но без релоков оно всё равно не загрузится, а с релоками пойдёт точку входа, как DllMain исполнять. Я и не говорю, что задача неразрешимая. Просто факт констатировал.
да, согласен... тут либо свой загрузщик писать, либо разбирать в неэкспортируемых функциях загрузщика винды...
yurza Есть подозрение, что при LoadLibrary ЕХЕ-ника винда просто проецирует образ в память только для доступа к его ресурсам и релоки с импортом вообще не настраиваются.
Появилась минутка и решил попробовать ещё по экспериментировать Код (Text): PIMAGE_FILE_HEADER pfh; PIMAGE_SECTION_HEADER psh; PIMAGE_OPTIONAL_HEADER poh; PVOID aa = LoadLibrary("calc.111"); GetHeaders((PCHAR) aa, &pfh, &poh, &psh); PPEB aae=GetPEB(); aae->ImageBaseAddress = aa; LPVOID entry = (LPVOID)( (DWORD)aa + poh->AddressOfEntryPoint ); __asm { call dword ptr [entry] } Где calc.111 это переименованный сalc.exe с поправленным в IMAGE_FILE_HEADER Characteristic на IMAGE_FILE_DLL и получилось загрузить калькулятор Только надписи все серые
Можно и без LoadLibrary прекрасно грузить ПЕ файлы в память,в отмапленном виде.И причем по их родной базе.
интересовался подобным вопросом также, заметил эту темку здесь верно Код (Text): if (Entry->Flags & LDRP_IMAGE_DLL) { BOOLEAN AllowRelocation; UNICODE_STRING SystemDll; AllowRelocation = TRUE; .... ---------------------------------------- if (LdrDataTableEntry->Flags & LDRP_IMAGE_DLL) { try { st = LdrpWalkImportDescriptor( DllPath, LdrDataTableEntry ); ... если не выставлен магический флаг , то образ проецируется в память без обработки релоков и импорта, чтобы запустить таким образом прогу - нужно поставить на секции атрибуты доступные для записи, вручную обработать импорт и релоки и при желании восстановить аттрибуты защиты для секций
karabas_barabas Не проще ли поставить нотифи на загрузку и после отображения взвести флаг в описателе модуля. Не обязательно нотифи ставить в LdrpDllNotificationList, можно например лог мониторить(аля ShowSnaps("LDR: Loading..") -> filter DBG_PRINT_EXCEPTION_C -> S-routing).