Как получить и изменить в таблице импорта програмы один адрес на друго

  • Автор темы r00t_
  • Дата начала
Статус
Закрыто для дальнейших ответов.
R

r00t_

Гость
#1
Привет всем...Народ подскажите... как получить список всех адресов функций (dll'ки или dll'ок) в таблице импорта программы и изменить на другой....если можно с куском кода, а то что-то неправильно делаю ..спасибо за ранее
 
04.09.2006
2 566
2
#2
1. Соблюдаем правила!!!!
2. У тебя ошибка в 17 строке! Тут телепатов нет, покажи код, может ошибка и найдется
 
R

r00t_

Гость
#3
Код:
DWORD adr_MessageBoxA;

BOOL WINAPI Intercept_MessageBoxA(HWND hwnd, char *text,char *hdr, UINT utype)
{

char *str = "Hi From MessageBOX!!!!";
((BOOL (__stdcall*)(HWND, char*, char*, UINT))adr_MessageBoxA)(hwnd,str, hdr, utype);
return TRUE;
}

void InterceptFunctions(void)
{

BYTE *pimage = (BYTE*)GetModuleHandle(NULL);
BYTE *pidata;
IMAGE_DOS_HEADER *idh;
IMAGE_OPTIONAL_HEADER *ioh;
IMAGE_SECTION_HEADER *ish;
IMAGE_IMPORT_DESCRIPTOR *iid;
DWORD *isd,written=0;

idh = (IMAGE_DOS_HEADER*)pimage;
ioh = (IMAGE_OPTIONAL_HEADER*)(pimage + idh->e_lfanew + 4 + sizeof(IMAGE_FILE_HEADER));
ish = (IMAGE_SECTION_HEADER*)((BYTE*)ioh + sizeof(IMAGE_OPTIONAL_HEADER));

if (idh->e_magic != 0x5A4D) 
{
MessageBox(NULL, "Not exe hdr", "Error!", 0);
return;
}
int i;

for(i=0; i<16; i++)
if(strcmp((char*)((ish+ i)->Name) , ".idata") == 0) break;
if( i==16)
{
MessageBox(NULL, "Unable to find .idata section", "Error!", 0);
return;
}

iid = (IMAGE_IMPORT_DESCRIPTOR*)(pimage + (ish +i)->VirtualAddress );

adr_MessageBoxA = (DWORD)GetProcAddress(GetModuleHandle("user32.dll"), "MessageBoxA");
if(adr_MessageBoxA == 0)
{
MessageBox(NULL, "Can`t get addr_MessageBoxA", "Error!", 0);
return;
}

while(iid->Name) 
{
if(strcmp((char*)(pimage + iid->Name), "USER32.dll") ==0 ) break;
iid++;
}

isd = (DWORD*)(pimage + iid->FirstThunk);
while(*isd!=adr_MessageBoxA && *isd!=0) isd++;
if(*isd == 0)
{
MessageBox(NULL, "adr_MessageBoxA not found in .idata", "Error!", 0);
return;
}

DWORD buf = (DWORD)&Intercept_MessageBoxA;
DWORD op;

VirtualProtect((void*)(isd),4,PAGE_READWRITE, &op);

WriteProcessMemory(GetCurrentProcess(), (void*)(isd),(void*)&buf,4,&written);

VirtualProtect((void*)(isd),4,op, &op);
if(written!=4)
{
MessageBox(NULL, "Unable rewrite address", "Error!", 0);
return;
}
}
потом вызываю InterceptFunctions(); и как-бы все пучком только вот не находит секцию idata в экслорере и незаменяет соответственно ничего....как сделать универсальный метод нахождения длл а потом и адреса функции(через таблицу импорта)....???
 
R

r00t_

Гость
#6
Немогу понять...код (вышеуказанный) работает..при выполнении говорит что idata секция не найдена...посмотрел PE заголовок и правда в iexlorer'e нет такой секции ...пытаюсь пройти по .text или .data вылетает эксепшн с кодом C0000005 типа доступ запрещен на сколько я понял, и так на любую секцию IE...КАК пройтись по секциям без эксепшена(т.е. как получить доступ)...код приведен выше...спасибо за ранее всем кто ответит...
 
Статус
Закрыто для дальнейших ответов.