Перейти к содержанию

Возникла Проблема При Сборке Dll


Рекомендуемые сообщения

Привет всем, у меня возникла проблема при сборке Dll. Возникло вот таких 3 ошибки:

Ошибка 1 error LNK2026: небезопасный модуль для образа SAFESEH
Ошибка 2 error LNK2026: небезопасный модуль для образа SAFESEH
Ошибка 3 error LNK1281: Не удается создать образ SAFESEH
Подскажите пожалуйста как исправить их? Я ещё только начинаю вникать в тему С++, так что плиз не ругайтесь если что)))
Изменено пользователем Korol2010
Ссылка на комментарий
Поделиться на другие сайты

Вопрос: как компиляция библиотек относится к разделу "Вопросы по созданию читов в сингловых PC играх"? Или к "Статьям для новичков"?

Тему переместил в подходящий раздел.

Ссылка на комментарий
Поделиться на другие сайты

Извиняюсь, конечно что может чуть не там написал, просто не знал где лучше. Но всё же вопрос этот очень интересует, а то уже 2 раз не хрена не выходит сделать свою читерскую Dll, первый раз когда я делал Dll, она вообще не работала, хоть и собралась, а теперь, вот те новость, вообще не хочет собираться(((

Изменено пользователем Korol2010
Ссылка на комментарий
Поделиться на другие сайты

Извиняюсь, конечно что может чуть не там написал, просто не знал где лучше.

Явно не в статьях, и не в вопросах создания читов, согласись?

По поводу библиотеки - ты бы хоть код привел, на который компилятор ругается, или гуглить.

Первый результат гугла: тык, и статья на MSDN

 

Установка данного параметра компоновщика в среде разработки Visual Studio

1. Откройте диалоговое окно Страницы свойств проекта. Дополнительные сведения см. в разделе Задание свойств проекта C++.

2. Выберите папку Компоновщик.

3. Выберите страницу свойств Командная строка.

4. Введите значение в поле Дополнительные параметры.

Вводим значение /SAFESEH:NO
Ссылка на комментарий
Поделиться на другие сайты

Да возможно не в этих разделах надо было тему делать, но я просто подумал что раз Dll эта читерская с ассемблерным кодом, то вполне подойдёт раздел "Вопросов по созданию читов"))))

Да на счёт гугла, я сразу же прогуглил, так же наткнулся на тему которую ты первую указал (в нгей я нефига не понял), но 2 тему я не находил к сожалению(( Спасибо к стате что нашёл мою проблему))) Щас попробую сделать как ты написал.

Ура!)) Собрался наконец мой файлик))

Да к стате, 1 вопросик чуть не по теме, как для этого скрипта сделать правильный pattern и вообще как правильно найти все эти байты? А то я дак не оч пока понимаю от куда это всё берётся.

Да... вот скрипт на всякий:

Скрипт я делал по подобию скипта Coder'а.

#include <Windows.h>#include <fcntl.h>#include <stdio.h>#include <io.h>#include <Psapi.h>#include <detours.h>#pragma comment (lib, "psapi.lib")DWORD WINAPI SpinTires_thread(LPVOID);DWORD retn_addr = 0;DWORD ohk = false;DWORD APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){	switch (ul_reason_for_call)	{	case DLL_PROCESS_ATTACH:		CreateThread(NULL, NULL, SpinTires_thread, NULL, NULL, NULL);	case DLL_THREAD_ATTACH:	case DLL_THREAD_DETACH:	case DLL_PROCESS_DETACH:		break;	}	return true;}MODULEINFO GetModuleData(char*module_name){	MODULEINFO moduleInf = { 0 };	HMODULE hModule = GetModuleHandle(module_name);	if (hModule == NULL)		return moduleInf;	GetModuleInformation(GetCurrentProcess(), hModule, &moduleInf, sizeof(MODULEINFO));	return moduleInf;}bool DataCompare(const BYTE*pData, const BYTE*pattern, const char*mask){	for (; *mask; ++mask, ++pData, ++pattern)		if (*mask == 'x' && *pData != *pattern)			return false;	return (*mask) == NULL;}DWORD FindPattern(DWORD start_address, DWORD lenght, BYTE*pattern, char*mask){	for (DWORD i = 0; i < lenght; i++)		if (DataCompare((BYTE*)(start_address + i), pattern, mask))			return (DWORD)(start_address + i);	return NULL;}void InfinityHealth(){	_asm	{		mov dword ptr[ecx + 0xF0], 0x0		jmp retn_addr	}}DWORD WINAPI SpinTires_thread(LPVOID){	MODULEINFO moduleInf = GetModuleData("SpinTires.exe");	DWORD old_prot = 0;	DWORD ohk_address = FindPattern((DWORD)moduleInf.lpBaseOfDll, moduleInf.SizeOfImage,		(PBYTE)"\x8B\x91\xF0\x00\x00\x00\xDB", "xxxxxxxxxxx");	ohk_address += 0x3;	retn_addr = ohk_address + 0x6;	BYTE nops[3] = { 0x90, 0x90, 0x90 };	BYTE original[6] = { 0x8B, 0x91, 0xF0, 0x00, 0x00, 0x00 };	for (;; Sleep(75))	{		if (GetAsyncKeyState(VK_NUMPAD2) & 0x8000)		{			if (!ohk)			{				DetourFunction((PBYTE)ohk_address, (PBYTE)InfinityHealth);				VirtualProtect(InfinityHealth, 3, PAGE_EXECUTE_READWRITE, &old_prot);				memcpy(InfinityHealth, nops, 3);				VirtualProtect(InfinityHealth, 3, old_prot, &old_prot);				ohk = true;			}			else			{				VirtualProtect((void*)ohk_address, sizeof(original), PAGE_EXECUTE_READWRITE, &old_prot);				memcpy((void*)ohk_address, original, sizeof(original));				VirtualProtect((void*)ohk_address, sizeof(original), old_prot, &old_prot);				ohk = false;			}		}	}}
Изменено пользователем Xipho
Ссылка на комментарий
Поделиться на другие сайты

  • 4 месяца спустя...

Да возможно не в этих разделах надо было тему делать, но я просто подумал что раз Dll эта читерская с ассемблерным кодом, то вполне подойдёт раздел "Вопросов по созданию читов"))))

Да на счёт гугла, я сразу же прогуглил, так же наткнулся на тему которую ты первую указал (в нгей я нефига не понял), но 2 тему я не находил к сожалению(( Спасибо к стате что нашёл мою проблему))) Щас попробую сделать как ты написал.

Ура!)) Собрался наконец мой файлик))

Да к стате, 1 вопросик чуть не по теме, как для этого скрипта сделать правильный pattern и вообще как правильно найти все эти байты? А то я дак не оч пока понимаю от куда это всё берётся.

Да... вот скрипт на всякий:

Скрипт я делал по подобию скипта Coder'а.

 

Скинь полную версию кода

#include <Windows.h>#include <fcntl.h>#include <stdio.h>#include <io.h>#include <Psapi.h>#include <detours.h>#pragma comment (lib, "psapi.lib")DWORD WINAPI SpinTires_thread(LPVOID);DWORD retn_addr = 0;DWORD ohk = false;DWORD APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){	switch (ul_reason_for_call)	{	case DLL_PROCESS_ATTACH:		CreateThread(NULL, NULL, SpinTires_thread, NULL, NULL, NULL);	case DLL_THREAD_ATTACH:	case DLL_THREAD_DETACH:	case DLL_PROCESS_DETACH:		break;	}	return true;}MODULEINFO GetModuleData(char*module_name){	MODULEINFO moduleInf = { 0 };	HMODULE hModule = GetModuleHandle(module_name);	if (hModule == NULL)		return moduleInf;	GetModuleInformation(GetCurrentProcess(), hModule, &moduleInf, sizeof(MODULEINFO));	return moduleInf;}bool DataCompare(const BYTE*pData, const BYTE*pattern, const char*mask){	for (; *mask; ++mask, ++pData, ++pattern)		if (*mask == 'x' && *pData != *pattern)			return false;	return (*mask) == NULL;}DWORD FindPattern(DWORD start_address, DWORD lenght, BYTE*pattern, char*mask){	for (DWORD i = 0; i < lenght; i++)		if (DataCompare((BYTE*)(start_address + i), pattern, mask))			return (DWORD)(start_address + i);	return NULL;}void InfinityHealth(){	_asm	{		mov dword ptr[ecx + 0xF0], 0x0		jmp retn_addr	}}DWORD WINAPI SpinTires_thread(LPVOID){	MODULEINFO moduleInf = GetModuleData("SpinTires.exe");	DWORD old_prot = 0;	DWORD ohk_address = FindPattern((DWORD)moduleInf.lpBaseOfDll, moduleInf.SizeOfImage,		(PBYTE)"\x8B\x91\xF0\x00\x00\x00\xDB", "xxxxxxxxxxx");	ohk_address += 0x3;	retn_addr = ohk_address + 0x6;	BYTE nops[3] = { 0x90, 0x90, 0x90 };	BYTE original[6] = { 0x8B, 0x91, 0xF0, 0x00, 0x00, 0x00 };	for (;; Sleep(75))	{		if (GetAsyncKeyState(VK_NUMPAD2) & 0x8000)		{			if (!ohk)			{				DetourFunction((PBYTE)ohk_address, (PBYTE)InfinityHealth);				VirtualProtect(InfinityHealth, 3, PAGE_EXECUTE_READWRITE, &old_prot);				memcpy(InfinityHealth, nops, 3);				VirtualProtect(InfinityHealth, 3, old_prot, &old_prot);				ohk = true;			}			else			{				VirtualProtect((void*)ohk_address, sizeof(original), PAGE_EXECUTE_READWRITE, &old_prot);				memcpy((void*)ohk_address, original, sizeof(original));				VirtualProtect((void*)ohk_address, sizeof(original), old_prot, &old_prot);				ohk = false;			}		}	}}
Ссылка на комментарий
Поделиться на другие сайты

Привет! Сигнатура ищется через Cheat Engine или, например, через OllyDbg (есть для него плагин), при этом важно понять, как они работают. Насколько ты знаешь, скомпилированный ассемблерный код состоит из опкодов команд, адресов и смещений. Допустим, есть такой код:

 

MOV EAX,EBX

JMP 0x10

 

Перед тем, как просто копировать опкоды и использовать их в качестве сигнатуры, стоит немного осмотреть код и разобраться в нем. Первая команда поменяется только в каком-нибудь исключительном случае (скажем, очень большом патче для игры), а вот вторая может поменяться и при небольшом. Представим, что опкоды для второй команды выглядят примерно так:

 

E900000010

 

E9 - опкод JMP, следующие четыре байта - адрес для прыжка. Эти четыре байта могут поменяться просто запросто - достаточно хотя бы один байт выше или ниже по коду добавить, потому что прыжок относительный (т.е. на некоторое количество байт вверх или вниз от текущего адреса). Такие вот вещи, которые могут легко и часто меняться (адреса и смещения в первую очередь) лучше загонять в wildcard, то есть сигнатура будет выглядеть так:

 

E9????

 

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

 

ABFFD9E3E9????

 

Вот и готово. Прежде всего такие сканеры должны искать определенную последовательность команд. В нашем случае это "MOV JMP", потом учитывать операнды, а только потом - адреса переходов и смещения в операндах.

 

PS: Если ты не до конца понимаешь, как работает чей-то код, скрипт или любая методика взлома - лучше сидеть и задавать вопросы, пока тебе внятно не объяснят. Плох тот автор, который выкладывает готовое решение и не поясняет, как оно работает, или же не поясняет достаточно хорошо. Сначала разберись - потом используй сам и объясняй тем, кто еще не разобрался.

  • Плюс 2
Ссылка на комментарий
Поделиться на другие сайты

Спасибо большое, вот только я не знаю как делать сигнатуру в СЕ, в оли вроде вышло, но она почему то всё равно не работала(( Игра на сколько я помню выдавала ошибку.

Ссылка на комментарий
Поделиться на другие сайты

Спасибо большое, вот только я не знаю как делать сигнатуру в СЕ, в оли вроде вышло, но она почему то всё равно не работала(( Игра на сколько я помню выдавала ошибку.

Сигнатуры делаются в олли. Там проще, потому что всё на автомате. В СЕ нужно ручками всё добывать, маску в том числе.

Какую ошибку выдавала игра? Более развернуто изложи проблему.

Ссылка на комментарий
Поделиться на другие сайты

как делать сигнатуру в СЕ

Я делаю так:

Установку нужных инструментов смотри здесь.

 

PS: можно обойтись и без плагина, только с помощью сканера сигнатуры:

3. Вручную копируем байты, оставляем байты только опкодов, остальные заменяем ХХ и проверяем уникальность. 

 

Изменено пользователем garik66
Ссылка на комментарий
Поделиться на другие сайты

Сигнатуры делаются в олли. Там проще, потому что всё на автомате. В СЕ нужно ручками всё добывать, маску в том числе.

Какую ошибку выдавала игра? Более развернуто изложи проблему.

Честно говоря какую конкретно я уже не помню, давно делал. Но пока не меря помню что после включения скрипта с камерой игры происходило что-то странное, она вставала на месте и показывала дерево)) Ну проще говоря наводилась на ландшафт и замирала, сделать ничего нельзя было. А чаще после моих пыток DLL вылазила какая-то ошибка, если не ошибаюсь что-то вроде Fatall Error.

Ссылка на комментарий
Поделиться на другие сайты

Я делаю так:

Установку нужных инструментов смотри здесь.

 

PS: можно обойтись и без плагина, только с помощью сканера сигнатуры:

3. Вручную копируем байты, оставляем байты только опкодов, остальные заменяем ХХ и проверяем уникальность. 

Спс большое, попробую.

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.