HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

сплайсинг GetProcAddress + получение RetEIP
  #1  
Старый 26.03.2008, 15:37
sn0w
Статус пользователя:
Регистрация: 26.07.2005
Сообщений: 568
Провел на форуме:
1290766

Репутация: 1236


По умолчанию сплайсинг GetProcAddress + получение RetEIP

вот с какой задачей столкнулся, нужно перехватывать GetProcAddress в целях реверсирования одной байды. итак имеем следующее:

FARPROC (__stdcall* gGetProcAddress)(HMODULE,LPCSTR); - указатель на оригинальную функцию которая вызывается в конце, и собсна сам перехватчик:

FARPROC __stdcall fGetProcAddress(HMODULE hmod, LPCSTR proc)
{
DWORD io;
DWORD ret_eip;
char buf[200];

__asm{ // вот хз как получить RetEIP
push eax;
mov eax,[esp+4]; //тут ясен хер в стеке переменные перехватчика
mov ret_eip,eax;
pop eax;
}

g_dwCallnum++;

itoa(g_dwCallnum, buf, 10);
WriteFile(g_hLog, buf, lstrlenA(buf), &io, 0);
WriteFile(g_hLog, ") GetProcAddress: ", 18, &io, 0);
WriteFile(g_hLog, proc, lstrlenA(proc), &io, 0);
WriteFile(g_hLog, " RetEIP: ", 9, &io, 0);
itoa(ret_eip, buf, 16);
WriteFile(g_hLog, buf, lstrlenA(buf), &io, 0);
WriteFile(g_hLog, "\r\n", 2, &io, 0);

// В лог пишется таким образом: 1) GetProcAddress: ExitWindowsEx RetEIP: 40178A
// Но ессна по вставке асма ясно что RetEIP будет полнейшим бредом.

return gGetProcAddress(hmod,proc);
}

Какбы сделать так чтобы извлекать адрес возврата?

была мысль оформить тело перехватчика в стиле

__declspec(naked) __stdcall fGetProcAddress(HMODULE hmod, LPCSTR proc)
{
__asm {
// тут код записи лога
jmp gGetProcAddress;
}
}

но этож заебешься писать.
кто что может посоветовать?
__________________


snow white world wide
 
Ответить с цитированием

  #2  
Старый 26.03.2008, 15:59
spider-intruder
Постоянный
Регистрация: 10.12.2005
Сообщений: 939
Провел на форуме:
3886281

Репутация: 929


По умолчанию

А че сплайсинг? Хук не катит? хотя что это изменит.. щас я пороюсь
 
Ответить с цитированием

  #3  
Старый 26.03.2008, 16:02
0x0c0de
Постоянный
Регистрация: 25.05.2007
Сообщений: 448
Провел на форуме:
4226446

Репутация: 1564
По умолчанию

>> // вот хз как получить RetEIP
Если не будет локальных переменных, то адрес возврата будет на вершине стека. Я так на асме писала - посмотри в отладчике сколько занимают локальные переменные и учитывай их
 
Ответить с цитированием

  #4  
Старый 26.03.2008, 16:08
KEZ
Banned
Регистрация: 18.05.2005
Сообщений: 1,981
Провел на форуме:
1941233

Репутация: 2726


По умолчанию

Цитата:
А че сплайсинг? Хук не катит? хотя что это изменит.. щас я пороюсь
Мда, паук-вторжение опять попытался сказать что-то умное...

Цитата:
Если не будет локальных переменных, то адрес возврата будет на вершине стека. Я так на асме писала - посмотри в отладчике сколько занимают локальные переменные и учитывай их
ну да.. охрененное решение) не юзать переменные и надеется на то, что случай подвернется и будет все на вершине.. а про push reg перед использованием (ebx,esi,edi,ebp) мы забыли
 
Ответить с цитированием

  #5  
Старый 26.03.2008, 16:16
0x0c0de
Постоянный
Регистрация: 25.05.2007
Сообщений: 448
Провел на форуме:
4226446

Репутация: 1564
По умолчанию

я не говорю что их не юзать. я говорю посмотреть в отладчике
 
Ответить с цитированием

  #6  
Старый 26.03.2008, 16:28
Xserg
Участник форума
Регистрация: 09.12.2006
Сообщений: 135
Провел на форуме:
426226

Репутация: 726
По умолчанию

DWORD ret_eip = (DWORD)&hmod - 4;

вернее

DWORD *p = (DWORD *)&hmod - 1;
DWORD ret_eip = p[0];

Последний раз редактировалось Xserg; 26.03.2008 в 16:42..
 
Ответить с цитированием

  #7  
Старый 26.03.2008, 16:42
0x0c0de
Постоянный
Регистрация: 25.05.2007
Сообщений: 448
Провел на форуме:
4226446

Репутация: 1564
По умолчанию

>>а про push reg перед использованием
м=\. а ну да, ты прав

Код:
1000102A    55              PUSH EBP
1000102B    8BEC            MOV EBP,ESP
1000102D    83C4 F8         ADD ESP,-8 ; две локальные переменные
это если в асме. [esp+0с] - адрес возврата. если без локальных, то [esp+4]
 
Ответить с цитированием

  #8  
Старый 26.03.2008, 17:16
sn0w
Статус пользователя:
Регистрация: 26.07.2005
Сообщений: 568
Провел на форуме:
1290766

Репутация: 1236


По умолчанию

всем спасибо, проблема решена
__________________


snow white world wide
 
Ответить с цитированием

  #9  
Старый 26.03.2008, 21:13
KEZ
Banned
Регистрация: 18.05.2005
Сообщений: 1,981
Провел на форуме:
1941233

Репутация: 2726


По умолчанию

вот ещё одно отличие программиста от хакера с античата... программист не будет делать все через жопу ради быстрого эффекта, а подумает сначала (АСМ вставки это признак необразованости и их надо стараться избегать в программах на С и С++ как минимум)

Код:
FARPROC (WINAPI *gGetProcAddress)(HMODULE hModule,LPCTSTR lpProcName);
FARPROC WINAPI fGetProcAddressEip(ULONG dwRetEip,HMODULE hModule,LPCTSTR lpProcName)
{
	CHAR szMsg[255];
	wsprintf(szMsg,"hModule=%08x,lpProcName=%08x,dwRetEip=%08x",hModule,lpProcName,dwRetEip);
	MessageBox(0,szMsg,"GetProcAddress",0);
	return gGetProcAddress(hModule,lpProcName);
}
FARPROC __declspec(naked) WINAPI fGetProcAddressStub(HMODULE hModule,LPCTSTR lpProcName)
{
	__asm {
		push dword ptr [esp]
		jmp fGetProcAddressEip
	}
}

// ...
	Splice(
		(ULONG)(GetProcAddress(GetModuleHandle("kernel32.dll"),"GetProcAddress")),
		fGetProcAddressStub,
		(PULONG)&gGetProcAddress
		);
	GetProcAddress(GetModuleHandle("kernel32.dll"),"IsDebuggerPresent");
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.