Пытаюсь загрузить свою библиотека в адресное пространство процесса в userMode Код (Text): st=NtOpenProcess(&hProc,PROCESS_ALL_ACCESS,&ObjectAttributes,&Client); if(NT_SUCCESS(st)){ st=NtCreateSection(&hSection, SECTION_ALL_ACCESS, &oa, 0, PAGE_EXECUTE, SEC_IMAGE, hFile); if(NT_SUCCESS(st)){ BaseAdr=0; ViewSize=0; st=ZwMapViewOfSection(hSection,hProc,&BaseAdr, 0, 0, 0, &ViewSize,ViewShare, 0, SECTION_MAP_EXECUTE); if(NT_SUCCESS(st)){ sprintf(buffer, "BaseAdr %X - ViewSize %X - NTSTATUS %X",BaseAdr,ViewSize,st); Memo1->Lines->Add(buffer); PIMAGE_NT_HEADERS ss=(PIMAGE_NT_HEADERS)LdrGetNtHeadersProcess(hProc,BaseAdr); sprintf(buffer, "AddressOfEntryPoint %X ",ss->OptionalHeader.AddressOfEntryPoint); } } } st=ZwMapViewOfSection(hSection,hProc,&BaseAdr, 0, 0, 0, &ViewSize,ViewShare, 0, SECTION_MAP_EXECUTE); return STATUS_IMAGE_NOT_AT_BASE Это типа информация, что типа образ загружен не по его родному адресу винды хоть при просмотре В VMMap адресного пространстве процесса по адресу BaseAdr библиотека спроецированна, что оставить, так или Relocation по FixupVA если Relocation, то делать это внутри процесса или сначала подготовить образ, а потом еще раз замепить. После всего сделанного куда дальше копать в смысле загрузки библиотеки только в UserMode За ранее спасибо.
qwe8013 Верно. Незачем переписывать загрузчик. yurza Тоже не понял. Сформулируйте вопрос нормально. Фиксапы нужны по любому.
Просто смотрел исходник Загрузки библиотеки там типа есть функция типа LdrpProcessRelocationBlock со множеством case Типа Код (Text): switch ((*puNextOffset) >> 12) { case IMAGE_REL_BASED_HIGHLOW: // // HighLow - (32-bits) relocate the high and low half // of an address. // *(LONG UNALIGNED*) pFixupVA += (ULONG) lDelta; break; case IMAGE_REL_BASED_HIGH: // // High - (16-bits) relocate the high half of an address. // lTemp = *(PUSHORT) pFixupVA << 16; lTemp += (ULONG) lDelta; *(PUSHORT) pFixupVA = (USHORT) (lTemp >> 16); break; case IMAGE_REL_BASED_HIGHADJ: и т.д. вот и хотелось бы понять обращаюсь к Clerk знатоку исподников её применять или нет А так в принципе переписывать загрузчик может и не стоит, но вот пока не написать свой не понятно как он работает
yurza Фиксапы разного типа бывают. Обычно нужно только IMAGE_REL_BASED_HIGHLOW, но если вы пишите криптор или код, который должен обрабатывать заранее не известные образы, то нужно учитывать поправки всех типов.
выложите пожалуйста полный код, заключенный в этот свитч... а то я некоторые типы релоков не знаю, как фиксить (в x64 дллках встречаются)...
Код (Text): #define EXT_IMM64(Value, Address, Size, InstPos, ValPos) /* Intel-IA64-Filler */ \ Value |= (((ULONGLONG)((*(Address) >> InstPos) & (((ULONGLONG)1 << Size) - 1))) << ValPos) // Intel-IA64-Filler #define INS_IMM64(Value, Address, Size, InstPos, ValPos) /* Intel-IA64-Filler */\ *(PULONG)Address = (*(PULONG)Address & ~(((1 << Size) - 1) << InstPos)) | /* Intel-IA64-Filler */\ ((ULONG)((((ULONGLONG)Value >> ValPos) & (((ULONGLONG)1 << Size) - 1))) << InstPos) // Intel-IA64-Filler PIMAGE_BASE_RELOCATION LdrProcessRelocationBlock( IN ULONG_PTR VA, IN ULONG SizeOfBlock, IN PUSHORT NextOffset, IN LONG_PTR Diff ) { PUCHAR FixupVA; USHORT Offset; LONG Temp; LONG TempOrig; ULONG Temp32; ULONGLONG Value64; LONGLONG Temp64; LONG_PTR ActualDiff; RTL_PAGED_CODE(); while (SizeOfBlock--) { Offset = *NextOffset & (USHORT)0xfff; FixupVA = (PUCHAR)(VA + Offset); // // Apply the fixups. // switch ((*NextOffset) >> 12) { case IMAGE_REL_BASED_HIGHLOW : // // HighLow - (32-bits) relocate the high and low half // of an address. // *(LONG UNALIGNED *)FixupVA += (ULONG) Diff; break; case IMAGE_REL_BASED_HIGH : // // High - (16-bits) relocate the high half of an address. // Temp = *(PUSHORT)FixupVA << 16; Temp += (ULONG) Diff; *(PUSHORT)FixupVA = (USHORT)(Temp >> 16); break; case IMAGE_REL_BASED_HIGHADJ : // // Adjust high - (16-bits) relocate the high half of an // address and adjust for sign extension of low half. // #if defined(NTOS_KERNEL_RUNTIME) // // If the address has already been relocated then don't // process it again now or information will be lost. // if (Offset & LDRP_RELOCATION_FINAL) { ++NextOffset; --SizeOfBlock; break; } #endif Temp = *(PUSHORT)FixupVA << 16; #if defined(BLDR_KERNEL_RUNTIME) TempOrig = Temp; #endif ++NextOffset; --SizeOfBlock; Temp += (LONG)(*(PSHORT)NextOffset); Temp += (ULONG) Diff; Temp += 0x8000; *(PUSHORT)FixupVA = (USHORT)(Temp >> 16); #if defined(BLDR_KERNEL_RUNTIME) ActualDiff = ((((ULONG_PTR)(Temp - TempOrig)) >> 16) - (((ULONG_PTR)Diff) >> 16 )); if (ActualDiff == 1) { // // Mark the relocation as needing an increment if it is // relocated again. // *(NextOffset - 1) |= LDRP_RELOCATION_INCREMENT; } else if (ActualDiff != 0) { // // Mark the relocation as cannot be reprocessed. // *(NextOffset - 1) |= LDRP_RELOCATION_FINAL; } #endif break; case IMAGE_REL_BASED_LOW : // // Low - (16-bit) relocate the low half of an address. // Temp = *(PSHORT)FixupVA; Temp += (ULONG) Diff; *(PUSHORT)FixupVA = (USHORT)Temp; break; case IMAGE_REL_BASED_IA64_IMM64: // // Align it to bundle address before fixing up the // 64-bit immediate value of the movl instruction. // FixupVA = (PUCHAR)((ULONG_PTR)FixupVA & ~(15)); Value64 = (ULONGLONG)0; // // Extract the lower 32 bits of IMM64 from bundle // EXT_IMM64(Value64, (PULONG)FixupVA + EMARCH_ENC_I17_IMM7B_INST_WORD_X, EMARCH_ENC_I17_IMM7B_SIZE_X, EMARCH_ENC_I17_IMM7B_INST_WORD_POS_X, EMARCH_ENC_I17_IMM7B_VAL_POS_X); EXT_IMM64(Value64, (PULONG)FixupVA + EMARCH_ENC_I17_IMM9D_INST_WORD_X, EMARCH_ENC_I17_IMM9D_SIZE_X, EMARCH_ENC_I17_IMM9D_INST_WORD_POS_X, EMARCH_ENC_I17_IMM9D_VAL_POS_X); EXT_IMM64(Value64, (PULONG)FixupVA + EMARCH_ENC_I17_IMM5C_INST_WORD_X, EMARCH_ENC_I17_IMM5C_SIZE_X, EMARCH_ENC_I17_IMM5C_INST_WORD_POS_X, EMARCH_ENC_I17_IMM5C_VAL_POS_X); EXT_IMM64(Value64, (PULONG)FixupVA + EMARCH_ENC_I17_IC_INST_WORD_X, EMARCH_ENC_I17_IC_SIZE_X, EMARCH_ENC_I17_IC_INST_WORD_POS_X, EMARCH_ENC_I17_IC_VAL_POS_X); EXT_IMM64(Value64, (PULONG)FixupVA + EMARCH_ENC_I17_IMM41a_INST_WORD_X, EMARCH_ENC_I17_IMM41a_SIZE_X, EMARCH_ENC_I17_IMM41a_INST_WORD_POS_X, EMARCH_ENC_I17_IMM41a_VAL_POS_X); // // Update 64-bit address // Value64+=Diff; // // Insert IMM64 into bundle // INS_IMM64(Value64, ((PULONG)FixupVA + EMARCH_ENC_I17_IMM7B_INST_WORD_X), EMARCH_ENC_I17_IMM7B_SIZE_X, EMARCH_ENC_I17_IMM7B_INST_WORD_POS_X, EMARCH_ENC_I17_IMM7B_VAL_POS_X); INS_IMM64(Value64, ((PULONG)FixupVA + EMARCH_ENC_I17_IMM9D_INST_WORD_X), EMARCH_ENC_I17_IMM9D_SIZE_X, EMARCH_ENC_I17_IMM9D_INST_WORD_POS_X, EMARCH_ENC_I17_IMM9D_VAL_POS_X); INS_IMM64(Value64, ((PULONG)FixupVA + EMARCH_ENC_I17_IMM5C_INST_WORD_X), EMARCH_ENC_I17_IMM5C_SIZE_X, EMARCH_ENC_I17_IMM5C_INST_WORD_POS_X, EMARCH_ENC_I17_IMM5C_VAL_POS_X); INS_IMM64(Value64, ((PULONG)FixupVA + EMARCH_ENC_I17_IC_INST_WORD_X), EMARCH_ENC_I17_IC_SIZE_X, EMARCH_ENC_I17_IC_INST_WORD_POS_X, EMARCH_ENC_I17_IC_VAL_POS_X); INS_IMM64(Value64, ((PULONG)FixupVA + EMARCH_ENC_I17_IMM41a_INST_WORD_X), EMARCH_ENC_I17_IMM41a_SIZE_X, EMARCH_ENC_I17_IMM41a_INST_WORD_POS_X, EMARCH_ENC_I17_IMM41a_VAL_POS_X); INS_IMM64(Value64, ((PULONG)FixupVA + EMARCH_ENC_I17_IMM41b_INST_WORD_X), EMARCH_ENC_I17_IMM41b_SIZE_X, EMARCH_ENC_I17_IMM41b_INST_WORD_POS_X, EMARCH_ENC_I17_IMM41b_VAL_POS_X); INS_IMM64(Value64, ((PULONG)FixupVA + EMARCH_ENC_I17_IMM41c_INST_WORD_X), EMARCH_ENC_I17_IMM41c_SIZE_X, EMARCH_ENC_I17_IMM41c_INST_WORD_POS_X, EMARCH_ENC_I17_IMM41c_VAL_POS_X); INS_IMM64(Value64, ((PULONG)FixupVA + EMARCH_ENC_I17_SIGN_INST_WORD_X), EMARCH_ENC_I17_SIGN_SIZE_X, EMARCH_ENC_I17_SIGN_INST_WORD_POS_X, EMARCH_ENC_I17_SIGN_VAL_POS_X); break; case IMAGE_REL_BASED_DIR64: *(ULONG_PTR UNALIGNED *)FixupVA += Diff; break; case IMAGE_REL_BASED_MIPS_JMPADDR : // // JumpAddress - (32-bits) relocate a MIPS jump address. // Temp = (*(PULONG)FixupVA & 0x3ffffff) << 2; Temp += (ULONG) Diff; *(PULONG)FixupVA = (*(PULONG)FixupVA & ~0x3ffffff) | ((Temp >> 2) & 0x3ffffff); break; case IMAGE_REL_BASED_ABSOLUTE : // // Absolute - no fixup required. // break; case IMAGE_REL_BASED_SECTION : // // Section Relative reloc. Ignore for now. // break; case IMAGE_REL_BASED_REL32 : // // Relative intrasection. Ignore for now. // break; case IMAGE_REL_BASED_HIGH3ADJ : // // Similar to HIGHADJ except this is the third word. // Adjust low half of high dword of an address and adjust for // sign extension of the low dword. // Temp64 = *(PUSHORT)FixupVA << 16; ++NextOffset; --SizeOfBlock; Temp64 += (LONG)((SHORT)NextOffset[1]); Temp64 <<= 16; Temp64 += (LONG)((USHORT)NextOffset[0]); Temp64 += Diff; Temp64 += 0x8000; Temp64 >>=16; Temp64 += 0x8000; *(PUSHORT)FixupVA = (USHORT)(Temp64 >> 16); ++NextOffset; --SizeOfBlock; break; default : // // Illegal - illegal relocation type. // return (PIMAGE_BASE_RELOCATION)NULL; } ++NextOffset; } return (PIMAGE_BASE_RELOCATION)NextOffset; } Что то типа так