Dodanie do IAT wlasnej Dll'ki

Dodanie do IAT wlasnej Dll'ki
SA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 513
0

Odbiegając troszkę od tematu zapytam PE speców o poradę.
Mam zwyczajny plik exe i testuję na nim protectora Themida, który się 'wywala'. Support Themidy odpowiedział że exe nie jest standardowy bo sekcja .text nie jest pierwszą sekcją i spytał czy mogę to zmienić.
No to napisałem takowy program który zwyczajnie zamienia miejscami IMAGE_SECTION_HEADER w exe, ale program po tym zabiegu już nie startuje. Dodam że funkcja która to robi jest pewna, bo zmiana nazw sekcji nie psuje pliku.

O czym zapomniałem? Może kolejność VA sekcji musi pozostać rosnąca?
os: xp home sp2 2002

  • Rejestracja: dni
  • Ostatnio: dni
0

Ktos ma pomysl jak na podstawie danych z naglowka PE mozna w prosty sposob ustalic offset Sygnatury ("PE")?

  • Rejestracja: dni
  • Ostatnio: dni
0

Ah juz wiem [;.Odczytac strukture IMAGE_DOS_HEADER w ktorej ostatnie pole zawiera offset wlasnie na sygnaturke [;.

dzejo
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 787
0

No to napisałem takowy program który zwyczajnie zamienia miejscami IMAGE_SECTION_HEADER w exe, ale program po tym zabiegu już nie startuje. Dodam że funkcja która to robi jest pewna, bo zmiana nazw sekcji nie psuje pliku.

Wzasadzie sekcje są ułożone według rosnących ( i IMAGE_SECTION_HEADER również )
RVA i offsetów fizycznych w pliku .
Ale czy zamieniłeś dokładnie wszystkie dane IMAGE_SECTION_HEADER ( nazwa sekcji jest nie ważna )
czyli pola struktury IMAGE_SECTION_HEADER ?
Najlepiej podejrzeć jakimś programem dokładnie podającym opisy sekcji .
Przed modyfikacją i po ..

Jeszcze :

bo sekcja .text nie jest pierwszą sekcją

Właściwie to dziwne tłumaczenie że sekcja .text nie jest pierwsza , może chodzi o to że
sekcja kodu nie jest pierwsza w pliku .exe ? . Nazwy sekcji można sobie zmieniać i nie uszkodzi to pliku .Zmieniając IMAGE_SECTION_HEADER nie zmienisz położenia rzeczywistej sekcji w pliku , pozostanie na swoim miejscu , tylko dane o niej będą zapisane w innej strukturze ..
co wydaje mi się nie powinno zmienić działania .exe.
Czy nie powinno ? .. muszę sprawdzić ..
Mocno to wszysko jest podejrzane , bo sekcja kodu może być nawet i na końcu pliku ,
może ich być kilka ( skok z jednej do drugiej ) , może niech poprawią to coś "protector Themida"

SA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 513
0

Mówiąc o sekcji miałem na myśli jej nagłowek.
Zobacz jak to działa:

Kopiuj
#include <windows.h>
#include <stdio.h>

int main()
{
	IMAGE_SECTION_HEADER section[2];
	DWORD r;
	char exe[MAX_PATH], exe2[MAX_PATH];

	GetModuleFileName(0, exe, MAX_PATH); // exe  = this.exe
	GetModuleFileName(0, exe2, MAX_PATH);// exe2 = this.exe-nowy.exe

	if (strstr(exe, "-nowy.exe")) // nie zapętlaj się
		return MessageBox(0,"Hey, it works","",MB_TOPMOST);

	strcat(exe2, "-nowy.exe");
	if (!CopyFile(exe, exe2, false))
		return MessageBox(0,"CopyFile failed","",MB_TOPMOST);

	// modyfikujemy exe2
	HANDLE hFile = CreateFile(exe2, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING,0,0);
	if (hFile == INVALID_HANDLE_VALUE)
		return MessageBox(0,"CreateFile failed","",MB_TOPMOST);

	// load dos header
	IMAGE_DOS_HEADER DosHdr;
	IMAGE_NT_HEADERS NtHdr;
	ReadFile(hFile, &DosHdr, sizeof(IMAGE_DOS_HEADER), &r, 0);

	// go to nt header
	SetFilePointer(hFile, DosHdr.e_lfanew, 0, FILE_BEGIN);
	// and read it without optional hdr
	#define SIZEOF_NTHDRONLY  sizeof(IMAGE_NT_HEADERS) - sizeof(IMAGE_OPTIONAL_HEADER)
	ReadFile(hFile, &NtHdr, SIZEOF_NTHDRONLY, &r, 0);

	// secure me
	if (NtHdr.FileHeader.SizeOfOptionalHeader > sizeof(IMAGE_OPTIONAL_HEADER))
		MessageBox(0,"warning: buffer overflow\n",0,MB_TOPMOST);

	ReadFile(hFile, &NtHdr.OptionalHeader, NtHdr.FileHeader.SizeOfOptionalHeader, &r, 0);

	// zapamiętaj file offset pierwszej sekcji, wczytaj ją i następną
	DWORD offset1 = SetFilePointer(hFile,0,0,FILE_CURRENT);

	#define ISH_LEN sizeof(IMAGE_SECTION_HEADER), &r, 0

	ReadFile(hFile, &section[0], ISH_LEN);
	ReadFile(hFile, &section[1], ISH_LEN);
	// upewniam się...
	printf("section 1: %s\nsection 2: %s\n",section[0].Name, section[1].Name);

	// wróć na pierwszą sekcję i wpisz tam drugi, a następnie pierwszy nagłówek sekcji
	SetFilePointer(hFile, offset1, 0, FILE_BEGIN);

	WriteFile(hFile, &section[1], ISH_LEN);
	WriteFile(hFile, &section[0], ISH_LEN);

	CloseHandle(hFile);
	return (int)ShellExecute(0,"open",exe2,0,0,SW_SHOW);
}
dzejo
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 787
0

Yhy , działa pięknie (tzn zamienia dane) , tylko plik po takim zabiegu (jak pisałeś nie działa ).
Ja też myslałem o nagłowkach sekcji .
Chodzi mi o to że jeśli nawet taki plik po modyfikacji by działał , to
fizyczne położenie sekcji w pliku i w pamięci nie zmieni się ,
tak że manipulacja na IMAGE_SECTION_HEADER nie wiele chyba zmieni .
Zrozumiałem że "Support Themidy " to miał właśnie na myśli , nie nagłówki
ale sekcje do których się odnoszą . ( czy tak ? )

Być może kolejnośc ładowania sekcji musi być rosnąco jeśli chodzi o VA
i tak muszą opisywać nagłówki , im dalszy to VA sekcji wyższy .

  • Rejestracja: dni
  • Ostatnio: dni
0

Po takich zmianach mozliwe(nie testowalem) ,że zmienia sie checksum'a pliku.Takze proponuje to sprawdzic.
A ja mam pytanie ;]....Potrzebuje odczytany adres ImportAddressTable[RVA] zamienic na offset w pliku.Oczywiscie w sposob software'wy.
Przykladowy ImportAddressTable[RVA] ma wartosc 0x00002044,wiec oczywiscie mozemy stwierdzic ,w ktorej sekcji znajduje sie ten wpis po przez zestawienie 0x00002044 < SectionAlignment*N,gdzie Nmax to liczba sekcji,ale to takie nie eleganckie ;]

SA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 513
0

Chodzi o program zbudowany kompletnie innym, ale bardzo dobrym linkerem który nie marnuje miejsca tak jak ten z Microsoftu i nie używa dekorowania symboli (brak problemów z brakiem jakiegoś .lib), ani nie śmieci tak jak bugowaty linker Borlanda :)
Nagłowki sekcji w typowym PE to kolejno: .idata .text .data .bss IMPORTS

To że .text nie jest pierwsze nie ma żadnego znaczenia dla działania samego programu, autorzy themidy pewnie założyli z góry że niemożliwym jest aby .text nie był pierwszy, no i już wiedzą że popełnili błąd, albo mój linker faktycznie ma downa bo nie trzyma się tajemniczego standardu.

Po krótkiej zabawie z PE Editor (checksum+size of headers) pechowy program ruszył ale Themida wykraczyła się już okienkiem z systemu :)

dzejo
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 787
0

@sapero

Odbiegając troszkę od tematu zapytam PE speców o poradę.

:-D chyba trzeba odwrócić rolę ..

Po krótkiej zabawie z PE Editor (checksum+size of headers) pechowy program ruszył.

Może podasz trochę szczegółów :|
A to ciekawe bo u mnie 'checksum' jest 0 i co zrobić ?
Pierwsza sekcja .text , po zamianie IMAGE_SECTION_HEADER[0]<->[1] nie działa ?
Po korekcji PEedytorem również nie działa.
Ładowacz , go olewa .

@przechodzien
Adres w pliku jest podany w opisie sekcji importów -przykładowa sekcja :
IMAGE_SECTION_HEADER [x]

Kopiuj
    Sekcja numer : 4
 0398-039F   0198-019F   00-07       BYTE    Name[8]            .idata
 03A0-03A3   01A0-01A3   08-0B     union{DWORD PhysicalAddress,
					DWORD VirtualSize}Misc   0000-1000   0010-0000
 03A4-03A7   01A4-01A7   0C-0F     DWORD VirtualAddress          0001-3000   0030-0100
 03A8-03AB   01A8-01AB   10-13     DWORD SizeOfRawData           0000-0600   0006-0000
 03AC-03AF   01AC-01AF   14-17     DWORD PointerToRawData        0000-C800   00C8-0000
 03B0-03B3   01B0-01B3   18-1B     DWORD PointerToRelocations    7124-7274   7472-2471
 03B4-03B7   01B4-01B7   1C-1F     DWORD PointerToLinenumbers    3831-7872   7278-3138
 03B8-03B9   01B8-01B9   20-21     WORD  NumberOfRelocations       74-73       73-74
 03BA-03BB   01BA-01BB   22-23     WORD  NumberOfLinenumbers       40-64       64-40
 03BC-03BF   01BC-01BF   24-27     DWORD Characteristics         4000-0040   4000-0040

Pole "PointerToRawData" to adres do danych w pliku , pierwszego IMAGE_IMPORT_DESCRIPTOR .

mozemy stwierdzic ,w ktorej sekcji znajduje sie ten wpis

Nie ma potrzeby , on znajduje się w sekcji Importów...

SA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 513
0

Chaotycznie klilknąłem na 'pytajniki' i 'plusik' obok pól checksum oraz size of headers, ale to nie zadziałało u mnie na program wypluty z visual studio. 'Plusik' nie zadziałał bo MS linker dopełnia zerami sekcje w pliku
http://msdn2.microsoft.com/en-us/library/ms809762.aspx
Tu pisze tak:

The Section Table
Between the PE header and the raw data for the image's sections lies the section table. The section table is essentially a phone book containing information about each section in the image. The sections in the image are sorted by their starting address (RVAs), rather than alphabetically
czyli już wiadomo co jest źle - virtualne adresy muszą rosnąć zgodnie z pozycją w pliku. Trochę głupie to ograniczenie btw.

dzejo
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 787
0

Trochę głupie to ograniczenie

Też tak myślę , drętwa sprawa ale...
Bywa i tak ;] ,
Dzięki za informację , dzejo

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.