Сообщений: 322
Тем: 6
Зарегистрирован: Nov 2015
Репутация:
505
Всем привет,
Хочу показать, как избавиться от проверки PointBlank\PiercingBlow (CreateMutex)
________________________________
1. Понадобится PETools.
2. Понадобится Ida Pro\Free.
3. Понадобится Клиент игры.
_________________________
Инструкция
1. PETools Делаем дамп, почти все клиенты под Themida.
2. Ida Открываем дамп, сделанный PETools.
3.Ищем проверку CreateMutex, для этого водим is running already (Alt+T)
4. Поднимаемся выше, пока не уведем Check multiple running >>>
5. Вот и изучили, jnz условие [75 4A] Занимает 2 байта.
____________________________________
Теперь нужно написать, инжект кода.
Пример приведу на с#, дальше сами хоть с++.
Клац
1.
Код: [SRC="csharp"] const int PROCESS_VM_WRITE = 0x0020;
const int PROCESS_VM_OPERATION = 0x0008;
[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool WriteProcessMemory(int hProcess, int lpBaseAddress,
byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesWritten);[/SRC]
2.
Код: [SRC="csharp"] Process process = new Process();
string Login = "Tester";
string Password = "1234";
string Patch = "D:/Games/PointBlank/";
int Addr = 0x408B1D; // Адрес функции jnz
process.StartInfo = new ProcessStartInfo
{
FileName = Patch + "PointBlank.exe",
Arguments = Login + " " + Password,
};
process.StartInfo.WorkingDirectory = Patch;
process.Start();
IntPtr processHandle = OpenProcess(0x1F0FFF, false, process.Id);
int bytesWritten = 0;
WriteProcessMemory((int)processHandle, Addr, new byte[] { 0x90, 0x90 }, 2, ref bytesWritten); //Nop (90)[/SRC]
Ну вот и все, теперь сколько душе угодно запустится клиентов.
Кому не нужен логин и пароль, Arguments за комментировать.
Разработка Emu: PiercingBlow 90%, APB Reloaded 100%.
Самый действенный инструмент для самообучения - грабли.
Сообщений: 84
Тем: 15
Зарегистрирован: Oct 2016
Репутация:
16
first of all thank you so much for spreading this knowledge.
for a moment i still have a issue with piercing blow, with dumped code or original .exe file
i cannot find the call for a mutex or a jnz instruction, in dump even i can find access to string
again, tyvm for this thread
obs: xigncode already bypassed
Сообщений: 2,455
Тем: 53
Зарегистрирован: Apr 2010
Репутация:
19,728
Можно во много раз проще, без проблем с патчингом под изменение кода в клиенте. Достаточно убить глобальные мьютексы во всем клиенте, ибо они используются только для контроля запуска вторичных инстансов. Это можно сделать, например, так:
Код: DWORD WINAPI SetupKernel(PVOID) {
PVOID lib;
while((lib = GetModuleHandleW(L"kernel32.dll")) == nullptr) {
Sleep(10);
}
pHookCreateMutex = new Hook(wstring(L"kernel32.dll"), string("CreateMutexA"), &hCreateMutex);
pHookCreateMutex->SetFlushCache(true);
adrCreateMutex = reinterpret_cast<DWORD>(pHookCreateMutex->GetFunctionAddress());
pHookCreateMutex->Apply();
return 0;
}
Код: HANDLE WINAPI hCreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCSTR lpName) {
const char* filter = "Global";
if(strncmp(lpName, filter, strlen(filter)) != 0) {
//try call original kernel function from virtual dll stub (minwin kernel)
typedef HANDLE (*TCreateMutexA)(LPSECURITY_ATTRIBUTES, BOOL, LPCSTR);
TCreateMutexA oCreateMutex = (TCreateMutexA)GetProcAddress(GetModuleHandleA("api-ms-win-core-synch-l1-1-0.dll"), "CreateMutexA");
return oCreateMutex;
}
return nullptr;
}
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Сообщений: 84
Тем: 15
Зарегистрирован: Oct 2016
Репутация:
16
n3k0nation Написал:Можно во много раз проще, без проблем с патчингом под изменение кода в клиенте. Достаточно убить глобальные мьютексы во всем клиенте, ибо они используются только для контроля запуска вторичных инстансов. Это можно сделать, например, так:
Код: DWORD WINAPI SetupKernel(PVOID) {
PVOID lib;
while((lib = GetModuleHandleW(L"kernel32.dll")) == nullptr) {
Sleep(10);
}
pHookCreateMutex = new Hook(wstring(L"kernel32.dll"), string("CreateMutexA"), &hCreateMutex);
pHookCreateMutex->SetFlushCache(true);
adrCreateMutex = reinterpret_cast<DWORD>(pHookCreateMutex->GetFunctionAddress());
pHookCreateMutex->Apply();
return 0;
}
Код: HANDLE WINAPI hCreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCSTR lpName) {
const char* filter = "Global";
if(strncmp(lpName, filter, strlen(filter)) != 0) {
//try call original kernel function from virtual dll stub (minwin kernel)
typedef HANDLE (*TCreateMutexA)(LPSECURITY_ATTRIBUTES, BOOL, LPCSTR);
TCreateMutexA oCreateMutex = (TCreateMutexA)GetProcAddress(GetModuleHandleA("api-ms-win-core-synch-l1-1-0.dll"), "CreateMutexA");
return oCreateMutex;
}
return nullptr;
}
can i have a better explanation about this code usage, sorry i'm not a c++ Expert, even a c++ coder, i'm just a Java coder and know a bit of c#
Сообщений: 322
Тем: 6
Зарегистрирован: Nov 2015
Репутация:
505
bola,
Create a DLL, then inject into the process
(ddraw) startup.
Разработка Emu: PiercingBlow 90%, APB Reloaded 100%.
Самый действенный инструмент для самообучения - грабли.
Сообщений: 84
Тем: 15
Зарегистрирован: Oct 2016
Репутация:
16
bola Написал:can i have a better explanation about this code usage, sorry i'm not a c++ Expert, even a c++ coder, i'm just a Java coder and know a bit of c#
Awiion i have created a DLL already, but as example, pHookCreateMutex is undefined,
new Hook ???
many things are unknown for me
and here comes the song...
Hello Darkness my Old friend
Сообщений: 2
Тем: 0
Зарегистрирован: Feb 2016
Репутация:
0
n3k0nation Написал:Можно во много раз проще, без проблем с патчингом под изменение кода в клиенте. Достаточно убить глобальные мьютексы во всем клиенте, ибо они используются только для контроля запуска вторичных инстансов. Это можно сделать, например, так:
Код: DWORD WINAPI SetupKernel(PVOID) {
PVOID lib;
while((lib = GetModuleHandleW(L"kernel32.dll")) == nullptr) {
Sleep(10);
}
pHookCreateMutex = new Hook(wstring(L"kernel32.dll"), string("CreateMutexA"), &hCreateMutex);
pHookCreateMutex->SetFlushCache(true);
adrCreateMutex = reinterpret_cast<DWORD>(pHookCreateMutex->GetFunctionAddress());
pHookCreateMutex->Apply();
return 0;
}
Код: HANDLE WINAPI hCreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCSTR lpName) {
const char* filter = "Global";
if(strncmp(lpName, filter, strlen(filter)) != 0) {
//try call original kernel function from virtual dll stub (minwin kernel)
typedef HANDLE (*TCreateMutexA)(LPSECURITY_ATTRIBUTES, BOOL, LPCSTR);
TCreateMutexA oCreateMutex = (TCreateMutexA)GetProcAddress(GetModuleHandleA("api-ms-win-core-synch-l1-1-0.dll"), "CreateMutexA");
return oCreateMutex;
}
return nullptr;
}
Thank you!
(XignCode && CreateMutexA Patched)
Сообщений: 84
Тем: 15
Зарегистрирован: Oct 2016
Репутация:
16
Anykia Написал:Thank you!
(XignCode && CreateMutexA Patched)
How the hell have you done this
Сообщений: 2,455
Тем: 53
Зарегистрирован: Apr 2010
Репутация:
19,728
bola, i share only code snippet. Your can use any code with splice hook implement.
I compile my dll for point blank (wo host/port change and etc, only mutex processing), take it and dont worry My dll have public export function: EmptyExport, u can add it into game PE as imported dll.
P.S: my dll needs minwin windows update (started from Windows Vista) and of course ms redistributable.
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Сообщений: 84
Тем: 15
Зарегистрирован: Oct 2016
Репутация:
16
n3k0nation Написал:bola, i share only code snippet. Your can use any code with splice hook implement.
I compile my dll for point blank (wo host/port change and etc, only mutex processing), take it and dont worry My dll have public export function: EmptyExport, u can add it into game PE as imported dll.
P.S: my dll needs minwin windows update (started from Windows Vista) and of course ms redistributable.
Please God bless you, tyvm
|