Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.10.2011, 14:17   #21
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Жосткое определение.

Игра Counter-Strike. Увы но разработчики и не думаю том, чтобы блокировать такую дырку.
Игра как минимум грузит в себя и простые dll если те туда положить.
Однако и сообщения MessageBox тоже выдаёт... однако после закрытия сообщения dll выгружается.

Последний раз редактировалось Человек_Борща; 02.10.2011 в 14:34.
Человек_Борща вне форума Ответить с цитированием
Старый 02.10.2011, 14:22   #22
_Troy
Я не простой
Пользователь
 
Аватар для _Troy
 
Регистрация: 29.09.2011
Сообщений: 77
По умолчанию

Переливаете из пустого в порожнее
Знание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нем сведения
_Troy вне форума Ответить с цитированием
Старый 02.10.2011, 15:07   #23
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

как минимум это работает:
Код:
typedef HMODULE (__stdcall *LoadLibraryA_t) (LPCSTR modulename); 
LoadLibraryA_t Org_LoadLibraryA = NULL; 

typedef void (__stdcall *FreeLibrary_t) (HMODULE module);
FreeLibrary_t Org_FreeLibrary = NULL; 

HMODULE __stdcall New_LoadLibraryA (LPCSTR modulename) 
{ 
   if (modulename && HIWORD (modulename)) 
   { 
      if (strstr (modulename, "simprot") != NULL) 
         return NULL; 
   }
		 return Org_LoadLibraryA (modulename); 
} 

void __stdcall New_FreeLibrary (HMODULE module) 
{ 
   if (GetModuleHandle ("simprot.asi") == module) 
      return; 

   Org_FreeLibrary (module);
	  } 

BOOL WINAPI DllMain (HINSTANCE hinst, DWORD reason, LPVOID reserved) 
{ 
   DisableThreadLibraryCalls (hinst); 

   if (reason == DLL_PROCESS_ATTACH) 
   { 
      Org_LoadLibraryA = (LoadLibraryA_t) Create32 (GetProcAddress (GetModuleHandle ("kernel32.dll"), "LoadLibraryA"), (const FARPROC) New_LoadLibraryA, 5); 
	  Org_FreeLibrary = (FreeLibrary_t) Create32 (GetProcAddress (GetModuleHandle ("kernel32.dll"), "FreeLibrary"), (const FARPROC) New_FreeLibrary, 5); 

      CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) CodeHookClient, 0, 0, NULL); 
   } 
   else if (reason == DLL_PROCESS_DETACH) 
   { 
      RemoveDetour (GetProcAddress (GetModuleHandle ("kernel32.dll"), "LoadLibraryA"), (FARPROC *) &Org_LoadLibraryA, 5); 
      RemoveDetour (GetProcAddress (GetModuleHandle ("kernel32.dll"), "FreeLibrary"), (FARPROC *) &Org_FreeLibrary, 5); 
   } 
   return TRUE; 
}
Ну и чего тут экспортируется? Ничего.
Человек_Борща вне форума Ответить с цитированием
Старый 02.10.2011, 22:41   #24
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Игра Counter-Strike. Увы но разработчики и не думаю том, чтобы блокировать такую дырку.
Игра как минимум грузит в себя и простые dll если те туда положить.
Однако и сообщения MessageBox тоже выдаёт... однако после закрытия сообщения dll выгружается.
Во-первых, в *.asi файлах экспортируется RIB_main.

Во-вторых, эти файлы регистрируют что-то через mss32.dll/RIB_register_interface.

Цитата:
Ну и чего тут экспортируется? Ничего.
А ты знаешь, что тут написано?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 02.10.2011, 22:57   #25
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

1. Нет, там обычные dll. Может для системы и других программ там спец. какой-то экспорт нужен(и/или ещё что-то), но в данном случает asi простая dll с другим расширением. Сказал же, что есть 4 таких спец. расширения файлов(asi одно из них), которые игра загребает без каких-либо визгов и требований.

2. Смысл мне выкладывать то, чего я не знаю?
В приведённом коде с++, при подключении dll создаётся поток, и 2 эксп. функции лезут под колпак VirtualProtect(Create32).
При отключении dll, функции вылазят из под колпака(RemoveDetour).
(Весь код не влазил в сообщение, оставил dllproc и всего-то)

Может дело в том, что моя dll ничего не делает?

Вопрос:
Допустим dll ничего не делает(как моя), система/приложение могут её выгрузить?

Последний раз редактировалось Человек_Борща; 02.10.2011 в 23:07.
Человек_Борща вне форума Ответить с цитированием
Старый 02.10.2011, 23:09   #26
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
1. Нет, там обычные dll
Блин, на русском вроде пишу.

Ещё раз: эта твоя .asi, которая ".dll с другим расширением" - она экспортирует RIB_main. Так понятно?

Цитата:
2. Смысл мне выкладывать то, чего я не знаю?
Ну так может ты с нами поделишься, что делает этот код?

К примеру, меня очень интересует, не загружает ли этот код сам себя. Чем не причина для невыгрузки DLL?

Цитата:
Допустим dll ничего не делает(как моя в 1-ом сообщении темы), кто имеет право её просто выгрузить?
Тебе тут всякой фигни наговорили про что-то типа "система считает что DLL больше не нужна", а ты повёлся.

DLL загружается и выгружается только по указке программы - через LoadLibrary и FreeLibrary.

DLL может быть загружена многократно. Тогда реально она будет выгружена, когда её освободят столько же раз, сколько и загрузили - т.е. обычный счётчик ссылок.

Поэтому, тот факт, что твоя DLL выгружается, означает, что программа явно скомандовала её выгрузить. Нетрудно догадаться, что сделала она это потому, что DLL ей не нравится.

Поскольку больше DLL никто не требует, то она выгружается.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 02.10.2011, 23:17   #27
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Ок, выкладываю asi(в смысле dll) и исходник...
Может сможешь понять, почему оно не выгружается из игры.

Пытаюсь написать что-то подобное на delphi, а знания c++ оставляют желать лучшего.
Вложения
Тип файла: zip simprot.zip (36.2 Кб, 14 просмотров)
Человек_Борща вне форума Ответить с цитированием
Старый 02.10.2011, 23:24   #28
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Ололо :-D

А говоришь "Смысл мне выкладывать то, чего я не знаю?"

:-D :-D

Всё, я в конвульсиях :-D

Окей, на пальцах

Наводящий вопрос №1: как называется файл, который получается в результате компиляции этого кода? Уж не simprot.asi ли?

Наводящий вопрос №2: что делает этот файл первым действием? Уж не ставит ли хук на FreeLibrary?

Наводящий вопрос №3: что делает этот код (код хука)?

Код:
void __stdcall New_FreeLibrary (HMODULE module) 
{ 
   if (GetModuleHandle ("simprot.asi") == module) // уж не мы ли это? :)
      return;
Ну. Надо ли удивляться, что DLL никогда не выгружается?

Если и сейчас не дошло - DLL вообще-то выгружается. Просто сама DLL перехватывает попытки её выгрузить и отменяет их.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 02.10.2011, 23:32   #29
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

1. получается dll, просто переименовывается в asi(исходник на c++ прилепил ы 27 сообщении).
2. выполняет:
Код:
FARPROC Create32(FARPROC pfnSource, const FARPROC pfnDestination, const size_t length) 
{ 
   DWORD dwOldProtectFlags; 
   BYTE *pSrc = (BYTE*)pfnSource; 
   BYTE *pTramp = new BYTE[length+5]; 

   // allow execution on trampoline 
   VirtualProtect(pTramp, length+5, PAGE_EXECUTE_READWRITE, &dwOldProtectFlags);
	  // allow read/write on source 
   VirtualProtect(pSrc, length, PAGE_READWRITE, &dwOldProtectFlags); 

   // copy overwritten bytes to trampoline 
   memcpy(pTramp, pSrc, length); 

   // write JMP from trampoline to pfnSource + length 
   pTramp[length+0] = 0xE9; // JMP 
   *(PVOID*)(&pTramp[length+1]) = CalcRelativeJmp(pTramp+length, pSrc+length, 5);
   // write JMP from pfnSource to pfnDestination 
   pSrc[0] = 0xE9; // JMP 
   *(PVOID*)(&pSrc[1]) = CalcRelativeJmp(pSrc, (BYTE*)pfnDestination, 5); 

   // restore original protect flags 
   VirtualProtect(pfnSource, length, dwOldProtectFlags, &dwOldProtectFlags); 

   return (FARPROC)pTramp; 
}
Не до конца понимаю код:
Код:
void __stdcall New_FreeLibrary (HMODULE module) 
{ 
   if (GetModuleHandle ("simprot.asi") == module) 
      return; 

   Org_FreeLibrary (module);
}
что делает Return?

Последний раз редактировалось Человек_Борща; 02.10.2011 в 23:35.
Человек_Борща вне форума Ответить с цитированием
Старый 02.10.2011, 23:43   #30
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Не до конца понимаю код
Если аргумент module равен описателю DLL с именем simprot.asi, то ничего не делать.

Цитата:
получается dll
Иными словами, эта твоя DLL - не asi.

В смысле, не тот *.asi, что нужен программе. Она переименовывается в *.asi только для того, чтобы автоматически запускаться вместе с программой. Только и всего. Но необходимого для *.asi она не реализует, попытки себя выгрузить блокирует, а вместо этого делает что-то там своё - вон то, что делает весь остальной код.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DLLProc Aleksey1989 Помощь студентам 1 14.04.2011 10:00
Проблема dll EXMP Софт 0 18.08.2010 09:30
Проблема с DLL _-Re@l-_ Паскаль, Turbo Pascal, PascalABC.NET 3 09.06.2010 14:28
Проблема с DLL. profi Помощь студентам 5 06.01.2009 23:48
Проблема с dll( DM_bite Помощь студентам 10 31.07.2008 16:05