Проецирование своей dll в процесс

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

  1. yurza

    yurza New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2008
    Сообщения:
    69
    Пытаюсь загрузить свою библиотека в адресное пространство процесса в userMode
    Код (Text):
    1. st=NtOpenProcess(&hProc,PROCESS_ALL_ACCESS,&ObjectAttributes,&Client);
    2.                     if(NT_SUCCESS(st)){
    3.                         st=NtCreateSection(&hSection, SECTION_ALL_ACCESS, &oa, 0, PAGE_EXECUTE, SEC_IMAGE, hFile);
    4.                         if(NT_SUCCESS(st)){
    5.                         BaseAdr=0;
    6.                         ViewSize=0;
    7.                            st=ZwMapViewOfSection(hSection,hProc,&BaseAdr, 0, 0, 0, &ViewSize,ViewShare, 0, SECTION_MAP_EXECUTE);
    8.                            if(NT_SUCCESS(st)){
    9.                                sprintf(buffer, "BaseAdr %X - ViewSize %X - NTSTATUS %X",BaseAdr,ViewSize,st);
    10.                                Memo1->Lines->Add(buffer);
    11.                                PIMAGE_NT_HEADERS ss=(PIMAGE_NT_HEADERS)LdrGetNtHeadersProcess(hProc,BaseAdr);
    12.                                sprintf(buffer, "AddressOfEntryPoint %X ",ss->OptionalHeader.AddressOfEntryPoint);
    13.                               }
    14.                            }
    15.                        }
    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
    За ранее спасибо.
     
  2. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    Проще записать в процесс код, который вызовет LdrLoadDll или LoadLibrary.
     
  3. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    Чёто я нифига не понял, расставьте знаки препенания.
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    qwe8013
    Верно. Незачем переписывать загрузчик.
    yurza
    Тоже не понял. Сформулируйте вопрос нормально. Фиксапы нужны по любому.
     
  5. yurza

    yurza New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2008
    Сообщения:
    69
    Просто смотрел исходник Загрузки библиотеки там типа есть функция типа LdrpProcessRelocationBlock со множеством case Типа
    Код (Text):
    1. switch ((*puNextOffset) >> 12)
    2.         {
    3.             case IMAGE_REL_BASED_HIGHLOW:
    4.  
    5.                 //
    6.                 // HighLow - (32-bits) relocate the high and low half
    7.                 // of an address.
    8.                 //
    9.  
    10.                 *(LONG UNALIGNED*) pFixupVA += (ULONG) lDelta;
    11.  
    12.                 break;
    13.  
    14.             case IMAGE_REL_BASED_HIGH:
    15.  
    16.                 //
    17.                 // High - (16-bits) relocate the high half of an address.
    18.                 //
    19.  
    20.                 lTemp = *(PUSHORT) pFixupVA << 16;
    21.                 lTemp += (ULONG) lDelta;
    22.                 *(PUSHORT) pFixupVA = (USHORT) (lTemp >> 16);
    23.  
    24.                 break;
    25.  
    26.             case IMAGE_REL_BASED_HIGHADJ:
    и т.д.
    вот и хотелось бы понять обращаюсь к Clerk знатоку исподников её применять или нет
    А так в принципе переписывать загрузчик может и не стоит, но вот пока не написать свой не понятно как он работает
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    yurza
    Фиксапы разного типа бывают. Обычно нужно только IMAGE_REL_BASED_HIGHLOW, но если вы пишите криптор или код, который должен обрабатывать заранее не известные образы, то нужно учитывать поправки всех типов.
     
  7. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
    выложите пожалуйста полный код, заключенный в этот свитч... а то я некоторые типы релоков не знаю, как фиксить (в x64 дллках встречаются)...
     
  8. yurza

    yurza New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2008
    Сообщения:
    69
    Код (Text):
    1. #define EXT_IMM64(Value, Address, Size, InstPos, ValPos)  /* Intel-IA64-Filler */           \
    2.     Value |= (((ULONGLONG)((*(Address) >> InstPos) & (((ULONGLONG)1 << Size) - 1))) << ValPos)  // Intel-IA64-Filler
    3.  
    4. #define INS_IMM64(Value, Address, Size, InstPos, ValPos)  /* Intel-IA64-Filler */\
    5.     *(PULONG)Address = (*(PULONG)Address & ~(((1 << Size) - 1) << InstPos)) | /* Intel-IA64-Filler */\
    6.           ((ULONG)((((ULONGLONG)Value >> ValPos) & (((ULONGLONG)1 << Size) - 1))) << InstPos)  // Intel-IA64-Filler
    7.  
    8. PIMAGE_BASE_RELOCATION
    9. LdrProcessRelocationBlock(
    10.     IN ULONG_PTR VA,
    11.     IN ULONG SizeOfBlock,
    12.     IN PUSHORT NextOffset,
    13.     IN LONG_PTR Diff
    14.     )
    15. {
    16.     PUCHAR FixupVA;
    17.     USHORT Offset;
    18.     LONG Temp;
    19.     LONG TempOrig;
    20.     ULONG Temp32;
    21.     ULONGLONG Value64;
    22.     LONGLONG Temp64;
    23.     LONG_PTR ActualDiff;
    24.  
    25.     RTL_PAGED_CODE();
    26.  
    27.     while (SizeOfBlock--) {
    28.  
    29.        Offset = *NextOffset & (USHORT)0xfff;
    30.        FixupVA = (PUCHAR)(VA + Offset);
    31.  
    32.        //
    33.        // Apply the fixups.
    34.        //
    35.  
    36.        switch ((*NextOffset) >> 12) {
    37.  
    38.             case IMAGE_REL_BASED_HIGHLOW :
    39.                 //
    40.                 // HighLow - (32-bits) relocate the high and low half
    41.                 //      of an address.
    42.                 //
    43.                 *(LONG UNALIGNED *)FixupVA += (ULONG) Diff;
    44.                 break;
    45.  
    46.             case IMAGE_REL_BASED_HIGH :
    47.                 //
    48.                 // High - (16-bits) relocate the high half of an address.
    49.                 //
    50.                 Temp = *(PUSHORT)FixupVA << 16;
    51.                 Temp += (ULONG) Diff;
    52.                 *(PUSHORT)FixupVA = (USHORT)(Temp >> 16);
    53.                 break;
    54.  
    55.             case IMAGE_REL_BASED_HIGHADJ :
    56.                 //
    57.                 // Adjust high - (16-bits) relocate the high half of an
    58.                 //      address and adjust for sign extension of low half.
    59.                 //
    60.  
    61. #if defined(NTOS_KERNEL_RUNTIME)
    62.                 //
    63.                 // If the address has already been relocated then don't
    64.                 // process it again now or information will be lost.
    65.                 //
    66.                 if (Offset & LDRP_RELOCATION_FINAL) {
    67.                     ++NextOffset;
    68.                     --SizeOfBlock;
    69.                     break;
    70.                 }
    71. #endif
    72.  
    73.                 Temp = *(PUSHORT)FixupVA << 16;
    74. #if defined(BLDR_KERNEL_RUNTIME)
    75.                 TempOrig = Temp;
    76. #endif
    77.                 ++NextOffset;
    78.                 --SizeOfBlock;
    79.                 Temp += (LONG)(*(PSHORT)NextOffset);
    80.                 Temp += (ULONG) Diff;
    81.                 Temp += 0x8000;
    82.                 *(PUSHORT)FixupVA = (USHORT)(Temp >> 16);
    83.  
    84. #if defined(BLDR_KERNEL_RUNTIME)
    85.                 ActualDiff = ((((ULONG_PTR)(Temp - TempOrig)) >> 16) -
    86.                               (((ULONG_PTR)Diff) >> 16 ));
    87.  
    88.                 if (ActualDiff == 1) {
    89.                     //
    90.                     // Mark the relocation as needing an increment if it is
    91.                     // relocated again.
    92.                     //
    93.                     *(NextOffset - 1) |= LDRP_RELOCATION_INCREMENT;
    94.                 }
    95.                 else if (ActualDiff != 0) {
    96.                     //
    97.                     // Mark the relocation as cannot be reprocessed.
    98.                     //
    99.                     *(NextOffset - 1) |= LDRP_RELOCATION_FINAL;
    100.                 }
    101. #endif
    102.  
    103.                 break;
    104.  
    105.             case IMAGE_REL_BASED_LOW :
    106.                 //
    107.                 // Low - (16-bit) relocate the low half of an address.
    108.                 //
    109.                 Temp = *(PSHORT)FixupVA;
    110.                 Temp += (ULONG) Diff;
    111.                 *(PUSHORT)FixupVA = (USHORT)Temp;
    112.                 break;
    113.  
    114.             case IMAGE_REL_BASED_IA64_IMM64:
    115.  
    116.                 //
    117.                 // Align it to bundle address before fixing up the
    118.                 // 64-bit immediate value of the movl instruction.
    119.                 //
    120.  
    121.                 FixupVA = (PUCHAR)((ULONG_PTR)FixupVA & ~(15));
    122.                 Value64 = (ULONGLONG)0;
    123.  
    124.                 //
    125.                 // Extract the lower 32 bits of IMM64 from bundle
    126.                 //
    127.  
    128.  
    129.                 EXT_IMM64(Value64,
    130.                         (PULONG)FixupVA + EMARCH_ENC_I17_IMM7B_INST_WORD_X,
    131.                         EMARCH_ENC_I17_IMM7B_SIZE_X,
    132.                         EMARCH_ENC_I17_IMM7B_INST_WORD_POS_X,
    133.                         EMARCH_ENC_I17_IMM7B_VAL_POS_X);
    134.                 EXT_IMM64(Value64,
    135.                         (PULONG)FixupVA + EMARCH_ENC_I17_IMM9D_INST_WORD_X,
    136.                         EMARCH_ENC_I17_IMM9D_SIZE_X,
    137.                         EMARCH_ENC_I17_IMM9D_INST_WORD_POS_X,
    138.                         EMARCH_ENC_I17_IMM9D_VAL_POS_X);
    139.                 EXT_IMM64(Value64,
    140.                         (PULONG)FixupVA + EMARCH_ENC_I17_IMM5C_INST_WORD_X,
    141.                         EMARCH_ENC_I17_IMM5C_SIZE_X,
    142.                         EMARCH_ENC_I17_IMM5C_INST_WORD_POS_X,
    143.                         EMARCH_ENC_I17_IMM5C_VAL_POS_X);
    144.                 EXT_IMM64(Value64,
    145.                         (PULONG)FixupVA + EMARCH_ENC_I17_IC_INST_WORD_X,
    146.                         EMARCH_ENC_I17_IC_SIZE_X,
    147.                         EMARCH_ENC_I17_IC_INST_WORD_POS_X,
    148.                         EMARCH_ENC_I17_IC_VAL_POS_X);
    149.                 EXT_IMM64(Value64,
    150.                         (PULONG)FixupVA + EMARCH_ENC_I17_IMM41a_INST_WORD_X,
    151.                         EMARCH_ENC_I17_IMM41a_SIZE_X,
    152.                         EMARCH_ENC_I17_IMM41a_INST_WORD_POS_X,
    153.                         EMARCH_ENC_I17_IMM41a_VAL_POS_X);
    154.  
    155.                 //
    156.                 // Update 64-bit address
    157.                 //
    158.  
    159.                 Value64+=Diff;
    160.  
    161.                 //
    162.                 // Insert IMM64 into bundle
    163.                 //
    164.  
    165.                 INS_IMM64(Value64,
    166.                         ((PULONG)FixupVA + EMARCH_ENC_I17_IMM7B_INST_WORD_X),
    167.                         EMARCH_ENC_I17_IMM7B_SIZE_X,
    168.                         EMARCH_ENC_I17_IMM7B_INST_WORD_POS_X,
    169.                         EMARCH_ENC_I17_IMM7B_VAL_POS_X);
    170.                 INS_IMM64(Value64,
    171.                         ((PULONG)FixupVA + EMARCH_ENC_I17_IMM9D_INST_WORD_X),
    172.                         EMARCH_ENC_I17_IMM9D_SIZE_X,
    173.                         EMARCH_ENC_I17_IMM9D_INST_WORD_POS_X,
    174.                         EMARCH_ENC_I17_IMM9D_VAL_POS_X);
    175.                 INS_IMM64(Value64,
    176.                         ((PULONG)FixupVA + EMARCH_ENC_I17_IMM5C_INST_WORD_X),
    177.                         EMARCH_ENC_I17_IMM5C_SIZE_X,
    178.                         EMARCH_ENC_I17_IMM5C_INST_WORD_POS_X,
    179.                         EMARCH_ENC_I17_IMM5C_VAL_POS_X);
    180.                 INS_IMM64(Value64,
    181.                         ((PULONG)FixupVA + EMARCH_ENC_I17_IC_INST_WORD_X),
    182.                         EMARCH_ENC_I17_IC_SIZE_X,
    183.                         EMARCH_ENC_I17_IC_INST_WORD_POS_X,
    184.                         EMARCH_ENC_I17_IC_VAL_POS_X);
    185.                 INS_IMM64(Value64,
    186.                         ((PULONG)FixupVA + EMARCH_ENC_I17_IMM41a_INST_WORD_X),
    187.                         EMARCH_ENC_I17_IMM41a_SIZE_X,
    188.                         EMARCH_ENC_I17_IMM41a_INST_WORD_POS_X,
    189.                         EMARCH_ENC_I17_IMM41a_VAL_POS_X);
    190.                 INS_IMM64(Value64,
    191.                         ((PULONG)FixupVA + EMARCH_ENC_I17_IMM41b_INST_WORD_X),
    192.                         EMARCH_ENC_I17_IMM41b_SIZE_X,
    193.                         EMARCH_ENC_I17_IMM41b_INST_WORD_POS_X,
    194.                         EMARCH_ENC_I17_IMM41b_VAL_POS_X);
    195.                 INS_IMM64(Value64,
    196.                         ((PULONG)FixupVA + EMARCH_ENC_I17_IMM41c_INST_WORD_X),
    197.                         EMARCH_ENC_I17_IMM41c_SIZE_X,
    198.                         EMARCH_ENC_I17_IMM41c_INST_WORD_POS_X,
    199.                         EMARCH_ENC_I17_IMM41c_VAL_POS_X);
    200.                 INS_IMM64(Value64,
    201.                         ((PULONG)FixupVA + EMARCH_ENC_I17_SIGN_INST_WORD_X),
    202.                         EMARCH_ENC_I17_SIGN_SIZE_X,
    203.                         EMARCH_ENC_I17_SIGN_INST_WORD_POS_X,
    204.                         EMARCH_ENC_I17_SIGN_VAL_POS_X);
    205.                 break;
    206.  
    207.             case IMAGE_REL_BASED_DIR64:
    208.  
    209.                 *(ULONG_PTR UNALIGNED *)FixupVA += Diff;
    210.  
    211.                 break;
    212.  
    213.             case IMAGE_REL_BASED_MIPS_JMPADDR :
    214.                 //
    215.                 // JumpAddress - (32-bits) relocate a MIPS jump address.
    216.                 //
    217.                 Temp = (*(PULONG)FixupVA & 0x3ffffff) << 2;
    218.                 Temp += (ULONG) Diff;
    219.                 *(PULONG)FixupVA = (*(PULONG)FixupVA & ~0x3ffffff) |
    220.                                                 ((Temp >> 2) & 0x3ffffff);
    221.  
    222.                 break;
    223.  
    224.             case IMAGE_REL_BASED_ABSOLUTE :
    225.                 //
    226.                 // Absolute - no fixup required.
    227.                 //
    228.                 break;
    229.  
    230.             case IMAGE_REL_BASED_SECTION :
    231.                 //
    232.                 // Section Relative reloc.  Ignore for now.
    233.                 //
    234.                 break;
    235.  
    236.             case IMAGE_REL_BASED_REL32 :
    237.                 //
    238.                 // Relative intrasection. Ignore for now.
    239.                 //
    240.                 break;
    241.  
    242.            case IMAGE_REL_BASED_HIGH3ADJ :
    243.                //
    244.                // Similar to HIGHADJ except this is the third word.
    245.                //  Adjust low half of high dword of an address and adjust for
    246.                //   sign extension of the low dword.
    247.                //
    248.  
    249.                Temp64 = *(PUSHORT)FixupVA << 16;
    250.                ++NextOffset;
    251.                --SizeOfBlock;
    252.                Temp64 += (LONG)((SHORT)NextOffset[1]);
    253.                Temp64 <<= 16;
    254.                Temp64 += (LONG)((USHORT)NextOffset[0]);
    255.                Temp64 += Diff;
    256.                Temp64 += 0x8000;
    257.                Temp64 >>=16;
    258.                Temp64 += 0x8000;
    259.                *(PUSHORT)FixupVA = (USHORT)(Temp64 >> 16);
    260.                ++NextOffset;
    261.                --SizeOfBlock;
    262.                break;
    263.  
    264.             default :
    265.                 //
    266.                 // Illegal - illegal relocation type.
    267.                 //
    268.  
    269.                 return (PIMAGE_BASE_RELOCATION)NULL;
    270.        }
    271.        ++NextOffset;
    272.     }
    273.     return (PIMAGE_BASE_RELOCATION)NextOffset;
    274. }
    Что то типа так
     
  9. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
    yurza спасибо! то, что нужно... это код из исходников win2k?