|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Фев 27, 2004 12:18:16 · Поправил: Безпощадный даос Эх, ребята ! Так вы и не понимаете. Мы "буксуем" из-за того, что каждый тянет одеяло на себя. Поэтому мы так и будем прозябать...Каждый хочеть здесь найти ответы и знания ничего не давая взамен. Или я не прав. dragon, ты крут. Спасибо. Я уже понял это. ты прав - прога перехватывает все API вызовы и корректирует их.... Только как - я не понял. Предлагаю следующий механизм. Только я в C++ не волоку - помогите: //-------------------------------------------------------------------- -------
/* Project: ModuleInjection
/* Date: 20.12.2003
//-------------------------------------------------------------------- -----*/
#include <windows.h>
#include <direct.h>
#include <stdio.h>
//-------------------------------------------------------------------- -------
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// - грузим DLL с хуком
HINSTANCE hDLL = LoadLibrary((LPCTSTR)"hookdll.dll");
if(hDLL == NULL) return -1;
// - получаем функцию инсталляции хука
void (*InstallHook)() = (void (*)())GetProcAddress(hDLL, "InstallHook");
if(!InstallHook) return -1;
// - получаем функцию деинсталляции хука
void (*UninstallHook)() = (void (*)())GetProcAddress(hDLL, "UninstallHook");
if(!UninstallHook) return -1;
// - инсталлируем хук
InstallHook();
// - ждем некоторое время для успешного внедрения
Sleep(1000);
// - деинсталлируем хук
UninstallHook();
return 0;
}
//-------------------------------------------------------------------- -------
//-------------------------------------------------------------------- -------
/* Project: ModuleInjection
/* Date: 20.12.2003
//-------------------------------------------------------------------- -----*/
#include <windows.h>
#include <direct.h>
#include <stdio.h>
#include <tlhelp32.h>
//-------------------------------------------------------------------- ----------------------------------
// - имя главного модуля целевого процесса (без расширения)
const char* TargetProgramName = "Explorer";
char InjectedModuleName[_MAX_PATH+1];
//-------------------------------------------------------------------- ----------------------------------
HHOOK MyHook = NULL;
HANDLE hMod = NULL;
//-------------------------------------------------------------------- ----------------------------------
// - функция, в которой будет происходить вся работа во внедренном модуле
//-------------------------------------------------------------------- ----------------------------------
DWORD WINAPI InjectedProc(LPVOID lpParameter)
{
while(1)
{
Sleep(100);
#define ISKEYDOWN(k) (GetKeyState(k) & 0x8000)
if(ISKEYDOWN(VK_LSHIFT) && ISKEYDOWN(VK_RSHIFT))
{
// - покажем наличие своего присутствия
char buf[128];
sprintf(buf, "c:\\%u.!!!", GetTickCount());
FILE* out = fopen(buf, "w+b");
fprintf(out, "Hello!\n");
fclose(out);
}
}
return 0;
}
//-------------------------------------------------------------------- ----------------------------------
bool TryToInject(void)
{
// - получаем имя главного модуля текущего процесса (например, explorer.exe с путем)
char SelfName[_MAX_PATH+1];
GetModuleFileName(GetModuleHandle(NULL), SelfName, _MAX_PATH);
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
// - вычленим имя файла и расширение
_splitpath(SelfName, drive, dir, fname, ext);
// - сравниваем имя ехешника текущего процесса с искомым
if(stricmp(fname, TargetProgramName) == 0 && stricmp(ext, ".exe") == 0)
{
// - выставим флаг наличия повторной загрузки модуля
HANDLE hMutex = CreateMutex(NULL, FALSE, "_vjqrhenjqventrclkzdytlhtybz_");
// - грузим свой модуль с новым именем для внедрения в адресное пространство процесса
HINSTANCE hInstDLL = LoadLibrary((LPCTSTR)InjectedModuleName);
if(hInstDLL == NULL) return false;
ReleaseMutex(hMutex);
CloseHandle(hMutex);
// - получаем функцию для выполнения в загруженном модуле
typedef DWORD (WINAPI *MYPROC)(LPVOID);
MYPROC fptr = (MYPROC)GetProcAddress(hInstDLL, "InjectedProc");
if(!fptr) return false;
// - создаем новый поток в текущем процессе-носителе
DWORD dwThreadId;
HANDLE hThread = CreateThread(NULL, 0, fptr, NULL, 0, &dwThreadId);
if(hThread == NULL) return false;
return true;
}
return false;
}
//-------------------------------------------------------------------- ----------------------------------
BOOL APIENTRY DllMain(HANDLE hModule, DWORD fdwReason, LPVOID lpReserved)
{
// Perform actions based on the reason for calling.
switch(fdwReason) {
case DLL_PROCESS_ATTACH:
{
// - получим имя внедряемого модуля
GetModuleFileName((HMODULE)hModule, InjectedModuleName, _MAX_PATH);
// - проверка наличия флага повторной загрузки
HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "_vjqrhenjqventrclkzdytlhtybz_");
if(hMutex == NULL)
{
// - пробуем внедриться
TryToInject();
}
else
{
// - закроем хендл
CloseHandle(hMutex);
hMutex = NULL;
}
hMod = hModule;
break;
}
case DLL_THREAD_ATTACH:
// Do thread-specific initialization.
break;
case DLL_THREAD_DETACH:
// Do thread-specific cleanup.
break;
case DLL_PROCESS_DETACH:
// Perform any necessary cleanup.
break;
}
return TRUE;
}
//-------------------------------------------------------------------- ----------------------------------
LRESULT CALLBACK MyHookHandler(int nCode, WPARAM wParam, LPARAM lParam)
{
return CallNextHookEx(MyHook, nCode, wParam, lParam);
}
//-------------------------------------------------------------------- ----------------------------------
void __stdcall InstallHook(void)
{
// - инсталлируем хук
MyHook = SetWindowsHookEx(WH_GETMESSAGE, MyHookHandler, (HINSTANCE)hMod, 0);
}
//-------------------------------------------------------------------- ----------------------------------
void __stdcall UninstallHook(void)
{
// - деинсталлируем хук
UnhookWindowsHookEx(MyHook);
}
//-------------------------------------------------------------------- ----------------------------------
предлагаю патчер разместить отдельным потоком, который мы вливаем в основной процесс. Только помощь нужна - накодить это дело кто смогёт. Объединяться надо и долбить эти защиты. И не жмотничать. А PID я определяю, юзая системное расширение оснастки в Task Manager в W2003 Standart Ed. |
|
|
Дата: Фев 29, 2004 08:09:27 Кстати хэндл не обязательно через OpenProcess получать, можно ведь и через CreateProcess, в связи с чем вопрос, кто-нибудь пробовал загрузить шпрот через лоадер? |
|
|
Дата: Мар 3, 2004 18:47:32 · Поправил: Baron Gede мне трейнер нужно написать а не лоадер. Я люблю ломать всеми способами, а тут я стеснён вроде как. Ладно. Забейте. Считайте тему закрытой... PS Надеюсь ваш форум больше не будут DDOS-ить... |
|
|
Дата: Мар 3, 2004 21:27:50 Просто запуская файл через CreateProcess ты получишь хэндл и тогда уже не нужен будет OpenProcess ;-) А вобще лучше всё-таки шпрот распаковать, а то он глючит, у меня например на 98-й не хочет запускаться. > Надеюсь ваш форум больше не будут DDOS-ить... Надеюсь... |
|
|
Дата: Мар 3, 2004 21:46:24 Ну и как и его распаковывать предлагаешь? Сегодня посмотрел, крадёт байты с OEP, IAT отсутствует, похоже на ASProtect 1.3, про SoftIce лучше вообще забыть, даже отладиться нечем, не то, чтобы распаковать.. |
|
|
Дата: Мар 3, 2004 22:04:59 [ dragon: даже отладиться нечем] А что под Olly он не идёт, тоже что-ли ребутится? |
|
|
Дата: Мар 3, 2004 22:19:13 Нет, просто там необрабатываемое исключение(Debugger was unable process exception, что-то в этом роде). |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.107 |