ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

сплайсинг GetProcAddress + получение RetEIP
  #1  
Старый 26.03.2008, 15:37
Аватар для sn0w
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
spider-intruder
Постоянный
Регистрация: 10.12.2005
Сообщений: 939
Провел на форуме:
3886281

Репутация: 929


Отправить сообщение для spider-intruder с помощью ICQ
По умолчанию

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

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

Репутация: 1564
Отправить сообщение для 0x0c0de с помощью ICQ
По умолчанию

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

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

Репутация: 2726


По умолчанию

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

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

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

Репутация: 1564
Отправить сообщение для 0x0c0de с помощью ICQ
По умолчанию

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

  #6  
Старый 26.03.2008, 16:28
Аватар для Xserg
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
0x0c0de
Постоянный
Регистрация: 25.05.2007
Сообщений: 448
Провел на форуме:
4226446

Репутация: 1564
Отправить сообщение для 0x0c0de с помощью ICQ
По умолчанию

>>а про 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
sn0w
Статус пользователя:
Регистрация: 26.07.2005
Сообщений: 568
Провел на форуме:
1290766

Репутация: 1236


По умолчанию

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


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

  #9  
Старый 26.03.2008, 21:13
Аватар для KEZ
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.XYZ