1.Если IMAGE_IMPORT_DESCRIPTOR.TimeDateStamp==0 То что надо делать со структурой находящейся по адресу FirstThunk?В IMAGE_THUNK_DATA.Function писать адрес нужной ф-ции WinAPI ??А где мне взять тогда имя ф-ции?Из IMAGE_IMPORT_BY_NAME? 2.А если IMAGE_IMPORT_DESCRIPTOR.TimeDateStamp==-1.То надо обработать список массив структур по адресу DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Ну что с ними делать??У Крис Касперский пишет что если IMAGE_BOUND_IMPORT_DESCRIPTOR.TimeDateStamp структуры и дллки совпадают то делать ничего ненадо.И из какого места дллки вытаскивать этот TimeDateStamp?А что делать если не совпадают?
а какая разница, что в этом поле? да а здесь какая связь? почитай статью от зеленого к красному - там написано про баунды и их признаки
Это главный признак.Когда оно -1, FirstThunk указывает в никуда. Кто то может обьяснить что это "загрузчик просто проецирует ее на адресное пространство процесса, не настраивая таблицу адресов IAT" означает?Что значит спроектировать дллку на адресное пространство процесса?Это что делает LoadLibrary или это совершенно другое?
"Если она равна -1, то загрузчик не смотрит на массивы OriginalFirstThunk и FirstThunk, а полагает, что данная библиотека импортируется через Bound-импорт" http://www.wasm.ru/article.php?article=green2red02#_Toc100906491 Если б при TimeDateStamp равному -1 загрузчик туда смотрел бы он бы скорей всего б скрашился.
Спасибо за ссылку, мне, оказывается, надо освежить свои знания. От себя могу добавить: если даже это поле равно -1, а баундов нет, системный загрузчик все равно смотрит OFT и FT и заполняет эти структуры правильно
_nic, Можно проверить на корректность и использовать, если всё верно. Можно тупо игнорировать и обрабатывать импорты как обычно. За подробностями — к тов. Bernd Luevelsmeyer и Matt Pietrek.
Нельзя их обрабатывать как обычно.В 7ке к примеру у всяких блокнотов,калькуляторов и консолей Thunk'и указывают в никуда.И TimeDateStamp конечно же ==-1.
_nic, «В никуда» — это за пределы образа? Ничего странного. Смысл привязки в том и состоит, что в IAT находятся готовые адреса соответствующих функций. OriginalFirstThunk должен быть заполнен адресами имён, иначе клин. Если таймстэмп не 0 и не -1, это время из заголовка соответствующей .DLL; если -1 — см. указанное в IMAGE_OPTIONAL_HEADER.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT]. Ну и Питрек/Лювельсмайер. Готов признать неправоту. Присылай хитрые блокноты и калькуляторы.
можешь залить эти файлики на спейс? я смотрю сейчас блокнот и калькулятор от семерки. Там действительно есть баунды и все такое, но thunk'и есть и они корректные
Да нет в пределах образа.Но если оттудого читать то выходит ошибочка,как бе память неможет быть read.Ничего не утверждаю но показывает, оно на какие то странные места секции кода.Файлы: http://dump.ru/file/4919134
У меня 1й thunk тоже на 4096 показывает,но если я оттудого пытаюсь прочитать IMAGE_THUNK_DATA,то моя программа выпадает с ошибкой доступа к памяти Код (Text): void processimport(DWORD adr,DWORD base,DWORD bound) { IMAGE_IMPORT_DESCRIPTOR iid; ZeroMemory(&iid,sizeof(IMAGE_IMPORT_DESCRIPTOR)); memcpy(&iid,(void*)adr,sizeof(IMAGE_IMPORT_DESCRIPTOR)); DWORD nameadr=adr; for(;;) { if(iid.Name==NULL){break;} printf("Name: %s tds:%d \n",(char*)((void*)(iid.Name+base)),iid.TimeDateStamp); /*if(iid.TimeDateStamp==-1) { //IMAGE_THUNK_DATA //IMAGE_IMPORT_BY_NAME IMAGE_BOUND_IMPORT_DESCRIPTOR ibi; ZeroMemory(&ibi,sizeof(IMAGE_BOUND_IMPORT_DESCRIPTOR)); memcpy(&ibi,(void*)bound,sizeof(IMAGE_BOUND_IMPORT_DESCRIPTOR)); DWORD boundadr=bound; //printf("BN%s\n",(char*)(bound+ibi.OffsetModuleName)); for(;;) { if(strcmp((char*)(base+iid.Name),(char*)(bound+ibi.OffsetModuleName))==0) { printf("bound tds: %d\n",ibi.TimeDateStamp); break; } boundadr=boundadr+sizeof(IMAGE_BOUND_IMPORT_DESCRIPTOR); memcpy(&ibi,(void*)boundadr,sizeof(IMAGE_BOUND_IMPORT_DESCRIPTOR)); } }*/ printf("%d\n",iid.FirstThunk); IMAGE_THUNK_DATA itd; IMAGE_IMPORT_BY_NAME ibn; memcpy(&itd,(void*)(base+iid.FirstThunk),sizeof(IMAGE_THUNK_DATA)); ZeroMemory(&ibn,sizeof(IMAGE_IMPORT_BY_NAME)); memcpy(&ibn,(void*)(base+itd.u1.AddressOfData),sizeof(IMAGE_IMPORT_BY_NAME)); printf("%d\n",ibn.Name);getch(); nameadr=nameadr+sizeof(IMAGE_IMPORT_DESCRIPTOR); ZeroMemory(&iid,sizeof(IMAGE_IMPORT_DESCRIPTOR)); memcpy(&iid,(void*)nameadr,sizeof(IMAGE_IMPORT_DESCRIPTOR)); } getch(); } DWORD Load(char *patch) { HANDLE f=CreateFileA(patch,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); if(f==INVALID_HANDLE_VALUE) { printf("error open file"); return 0; } LARGE_INTEGER sz; GetFileSizeEx(f,&sz); char *buf=new char[sz.QuadPart+1024]; DWORD r; ReadFile(f,buf,sz.QuadPart,&r,0); CloseHandle(f); IMAGE_DOS_HEADER stub; memcpy(&stub,buf,sizeof(IMAGE_DOS_HEADER)); buf+=stub.e_lfanew; IMAGE_NT_HEADERS image; memcpy(&image,buf,sizeof(IMAGE_NT_HEADERS)); IMAGE_OPTIONAL_HEADER options=image.OptionalHeader; DWORD apadr=(DWORD)VirtualAlloc(0,options.SizeOfImage , MEM_COMMIT | MEM_RESERVE | MEM_TOP_DOWN, PAGE_EXECUTE_READWRITE); //buf-=stub.e_lfanew; //buf+=stub.e_lfanew; buf+=sizeof(IMAGE_NT_HEADERS); IMAGE_SECTION_HEADER *sections=new IMAGE_SECTION_HEADER[image.FileHeader.NumberOfSections]; memcpy(sections,buf,image.FileHeader.NumberOfSections*sizeof(IMAGE_SECTION_HEADER)); buf-=stub.e_lfanew; buf-=sizeof(IMAGE_NT_HEADERS); memcpy((void*)apadr,buf,options.SizeOfHeaders); for(int i=0;i<image.FileHeader.NumberOfSections;i++) { buf+=sections[i].PointerToRawData; memcpy((void*)(apadr+sections[i].VirtualAddress),buf,sections[i].SizeOfRawData); buf-=sections[i].PointerToRawData; } processimport(apadr+options.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress,apadr,apadr+options.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress); return(apadr+options.AddressOfEntryPoint); }
_nic, Ещё раз: в привязанном PE элементы IAT (таблицы, RVA которой находится в IMAGE_IMPORT_DESCRIPTOR.FirstThunk) содержат не IMAGE_THUNK_DATA а конкретные адреса, экспортируемые соответствующей .DLL. Если нужны импортируемые имена/ординалы — используй IMAGE_IMPORT_DESCRIPTOR.OriginalFirstThunk, который ссылается на ILT.
_nic, «Не может быть!» Ещё раз: Matt Pietrek и Bernd Luevelsmeyer. У них всё расписано (Питрек ещё и с картинками).