перенос таблицы импора

Тема в разделе "WASM.BEGINNERS", создана пользователем GoldFinch, 3 ноя 2008.

  1. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    пытаюсь перенести таблицу импорта в область заголовка, файл становится невалидным.
    неужели таблица импорта обязательно должна быть в какой-то секции?
     
  2. only

    only New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    147
    GoldFinch
    Делаешь неправильно естественно.
    Код показывай
     
  3. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    т.е. таблица импорта может быть в заголовке?

    код:
    Код (Text):
    1. int AddDllToPE2(char *szTargetFile,char *szDllName) {
    2.     HANDLE  hFile,hFileMap;
    3.     char    *pBase,*pPE;
    4.     IMAGE_OPTIONAL_HEADER *pOptHeader;
    5.     DWORD   nSections;
    6.     int i;
    7.     IMAGE_SECTION_HEADER *pSection;
    8.     DWORD   dwImportRVA,dwImportSize;  
    9.     IMAGE_IMPORT_DESCRIPTOR *pImport;
    10.  
    11.     hFile=CreateFile(   szTargetFile,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,
    12.                         FILE_ATTRIBUTE_NORMAL,0);
    13.     if(INVALID_HANDLE_VALUE==hFile)return 0;
    14.     hFileMap=CreateFileMapping(hFile,NULL,PAGE_READWRITE|SEC_COMMIT,0,0,NULL);
    15.     if(0==hFileMap)return 0;
    16.     CloseHandle(hFile);
    17.     pBase=(char*)MapViewOfFile(hFileMap,FILE_MAP_ALL_ACCESS,0,0,0);
    18.     if(0==pBase)return 0;
    19.     __try {
    20.         //analysing
    21.         pPE=pBase+*(LPDWORD)(pBase+0x3C);
    22.         nSections=*(LPWORD)(pPE+0x06);
    23.         pOptHeader=(IMAGE_OPTIONAL_HEADER*)(pPE+0x18);
    24.         dwImportRVA=pOptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
    25.         dwImportSize=pOptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size;
    26.         pSection=(IMAGE_SECTION_HEADER*)(pPE+0x18+0xE0);
    27.         for(i=0;i<nSections;i++){
    28.             pImport=(IMAGE_IMPORT_DESCRIPTOR*)(pBase+dwImportRVA-pSection->VirtualAddress+pSection->PointerToRawData);
    29.             if( (dwImportRVA>=pSection->VirtualAddress) &&
    30.                 (dwImportRVA<pSection->VirtualAddress+pSection->SizeOfRawData) ) break;        
    31.             pSection++; }      
    32.         //============== patching ==================
    33.         //redirecting import
    34.         pOptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress=0xE00;
    35.         pOptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size=dwImportSize+20;
    36.         //copying import table
    37.         CopyMemory(pBase+0xE00,pImport,dwImportSize);      
    38.         //adding new item
    39.         pImport=(IMAGE_IMPORT_DESCRIPTOR*)(pBase+0xE00+dwImportSize-20);
    40.         pImport->Name = 0xE00 + 0x1E0;     
    41.         pImport->FirstThunk = 0xE00 + 0x1F0;       
    42.         //writing name and function ordinal
    43.         CopyMemory(pBase+0xFE0,szDllName,strlen(szDllName));
    44.         *(LPDWORD)(pBase+0xFF0)=0x80000001;    
    45.     } __except(EXCEPTION_EXECUTE_HANDLER) {return 0;}  
    46.     UnmapViewOfFile(pBase);
    47.     CloseHandle(hFileMap); 
    48.     return 1;
    49. }
     
  4. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    GoldFinch
    за место строк: (pBase+0x3C рекомдую макрос FIELD_OFFSET(IMAGE_DOS_HEADER,e_lfanew);

    он поставит тоже самое, токо читать проще, если не проще, то еще один упрощающий макрос ! ;)

    просто мне в лом ща щитать чему 0x18 или 0x06, а было бы описательно, я бы посидел подольше ;) Да и другие названиям полей больше порадуются чем циферкам! ;)
     
  5. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    когда я буду пбликовать этот тру код, я кнешно сделаю его читаемым)
    за FIELD_OFFSET спасибо, не знал о таком

    но хотелось бы услышать чтонить по теме - можно ли разместить таблицу импорта в заголовке
     
  6. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    GoldFinch
    Блин, ты не врубаешься! ;))) приходит чувак после бухла(праздник же :) или с работы(ктото втыкает) или просто есть время и видит твою тему, ты действительно веришь что кто-то не врубившись за пару сек в вопрос будет упорно пытаться тебе помочь ?

    Не знаю как другие, но если я не втыкаю в в попрос с первого прочтения, то просто забиваю! А у тебя вопрос специфичный, с пояснением в виде кода! Так что если я его сразу не понял, то наверное забью, ибо влом ;)
     
  7. Grom_PE

    Grom_PE New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    8
    Дворды, в которые записываются адреса функций должны быть в секции, остальное можно разместить в заголовке.
     
  8. PE_Kill

    PE_Kill New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2006
    Сообщения:
    107
    Фигасе у вас спор насчет PE офсета, а то что в реализации нет ни одного правильного момента - ерунда? IAT никак не может быть в заголовке ибо он ReadOnly, а загрузчик патчит Thunks. IAT нильзя никак переносить ибо код настроен на уже существующие Thunks. Нильзя использовать DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size для CopyMemory т.к. это значение можно хоть в 1 установить - импорт всё равно нормально сработает. борланд забивает его вообще размером всего, что относится к импорту, а мс только размер IID.

    А вообще в хэдере можно размещать только данные не нуждающиеся в патчинге, IIDs, sz's, ... Даже мс размещает там Bound Import
     
  9. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Так... еще раз... я хочу перенести структуру IMAGE_IMPORT_DESCRIPTOR в заголовок.
    Пишу хелловорлд:
    Код (Text):
    1. ? equ 0xAA
    2. ?? equ ((? shl 8)+?)
    3. ???? equ ((?? shl 16)+??)
    4. ;========== MZ header ===============
    5. dd "MZ"
    6. db 0x3c-$ dup 0
    7. dd 0x40
    8. ;========== PE header ===============
    9. dd "PE"
    10. dw 14ch, 1
    11. db 12 dup (?)
    12. dw 0xE0,103h,10bh
    13. db 14 dup (?)
    14. dd EntryPoint
    15. db 8 dup (?)
    16. dd 400000h,0x1000,0x200
    17. db 8 dup (?)
    18. dw 4
    19. db 6 dup (?)
    20. dd 0x2000,SizeOfHeaders
    21. db 4 dup (?)
    22. dw 2
    23. db ?,?
    24. dd 0,0,0,0
    25. db 4 dup (?)
    26. dd 2 ;NumberOfRvaAndSizes
    27. ;======== Data Directory ==============
    28. db 8 dup (?)
    29. dd idata,20*1
    30. db 36 dup (?)
    31. dd 0 ;debug directory size
    32. db 72 dup (?)
    33. ;========= Section Table ===============
    34. dq "section1"
    35. dd 0x1000,0x1000,0x1000,0x1000
    36. dd 0,0,0,0xE0000040
    37. ;=======================================
    38. ;idata dd 0,0,0,aUSER32,vUSER32, 5 dup 0 ;NOT WORKING HERE
    39. ;=======================================
    40. db 0x1000-$ dup 0 ;align
    41. SizeOfHeaders:
    42. ;======== Section 1 Begin =======================
    43. EntryPoint:
    44.     use32
    45.     push 0
    46.     call @f ;"PE",0
    47.     db "O_o",0
    48. @@: call @f
    49.     db "Hello world",0
    50. @@: push 0
    51.     call @f
    52.     vUSER32 dd aMessageBoxA,0
    53. @@: pop eax
    54.     call dword[eax]
    55.     ret
    56.     ;------- imports -----------
    57.     idata dd 0,0,0,aUSER32,vUSER32, 5 dup 0 ;WORKS HERE
    58.     aUSER32 db "USER32.DLL",0
    59.     aMessageBoxA db 0,0,"MessageBoxA",0
    60. ;============= section 1 end =======================
    61. db 0x2000-$ dup 0 ;align
    в нем есть строчки:
    ;idata dd 0,0,0,aUSER32,vUSER32, 5 dup 0 ;NOT WORKING HERE
    - это если импорт в заголовке, и
    idata dd 0,0,0,aUSER32,vUSER32, 5 dup 0 ;WORKS HERE
    - это импорт в секции.

    С 1й строчкой прога не работает. Кто-нибудь объяснит этот феномен?
     
  10. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    GoldFinch два варианта с импортом в заголовке
     
  11. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    неее, ты мне такой же файл, только с VirtualAlign=0x1000 и FileAlign = 0x200 покажи, с выравниванием 4 я и сам сделать могу.
     
  12. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    GoldFinch на вас Сидоровых не угодишь, ей нравится, а ему почемуто нет [​IMG]
     
  13. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    мне-то надо готовые файлы править, а не новые собирать, этот я так, для примера привел.
    а у нормальных файлов align=4 не бывает) а если и бывает, так там импорт перемещать некуда %)
     
  14. only

    only New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    147
    GoldFinch
    Сабж получился все-таки?
     
  15. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    ну пока что сабж получился только с добавлением новой секции в заголовок,
    т.е. был заголовок 0x1000 стал 0x800 и новая секция с raw offset 0x800 и в памяти после всех секций.
     
  16. only

    only New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    147
    GoldFinch
    В ПМ положил ссылку - там есть пример переноса импорта в хидер и добавления еще одной записи
     
  17. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Да... Твой код работает. Переписал свой такой же, тоже работает... Пробовал переносить в hex-редакторе, и тоже как ни странно работает.
    Но почему тогда когда я вручную собираю файл с импортом в заголовке, он не работает? И старый Сишный исходник тоже не работает. Мистика, мля =\

    upd:
    ооо я нашел причину. Если заполнить IMAGE_DIRECTORY_ENTRY_IAT, то прога работает нормально. Нашел методом тыка. Хз как IAT связана с дескрипторами %)
     
  18. only

    only New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    147
    Просто не разобрался толком до конца, спешишь видать.
     
  19. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    only Скинь мне тоже пример пожалуйста.. Очень надо.. ОЧЕНЬ!
     
  20. only

    only New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    147
    2FED
    Готово