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

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

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.06.2017, 16:45   #1
LD-One
Пользователь
 
Регистрация: 18.03.2012
Сообщений: 47
Вопрос Ошибка линковки memset

Столкнулся с такой вот проблемой при компиляции, нигде _memset не использую, видимо его за собой что-то тянет. Появилась ошибка после добавления этого кода:
Код:
size_t
_strlen(const char *str)
{
	const char *s;

	for (s = str; *s; ++s)
		;
	return (s - str);
}



int
_strcmp(const char *s1, const char *s2)
{
	while (*s1 == *s2++)
		if (*s1++ == 0)
			return (0);
	return (*(unsigned char *)s1 - *(unsigned char *)--s2);
}

DWORD GetProcessId(IN PCHAR szExeName)

{
	DWORD dwRet = 0;
	DWORD dwCount = 0;

	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

	if (hSnapshot != INVALID_HANDLE_VALUE)
	{
		PROCESSENTRY32 pe = { 0 };
		pe.dwSize = sizeof(PROCESSENTRY32);

		BOOL bRet = Process32First(hSnapshot, &pe);

		while (bRet)
		{
			if (!_strcmp((char*)pe.szExeFile, szExeName))
			{
				dwCount++;
				dwRet = pe.th32ProcessID;


			}
			bRet = Process32Next(hSnapshot, &pe);
		}

		if (dwCount > 1)
			dwRet = 0xFFFFFFFF;

		CloseHandle(hSnapshot);
	}

	return dwRet;

}


bool InjectDll(DWORD ProcessID, const char* DllFilePath)
{
	DWORD ThreadTeminationStatus;
	LPVOID VirtualMem;
	HANDLE hProcess, hRemoteThread;
	HMODULE hModule;

	hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessID);
	if (hProcess == NULL)
		return false;

	VirtualMem = VirtualAllocEx(hProcess, NULL, _strlen(DllFilePath), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
	if (VirtualMem == NULL)
		return false;

	if (WriteProcessMemory(hProcess, (LPVOID)VirtualMem, DllFilePath, _strlen(DllFilePath), NULL) == 0)
	{
		VirtualFreeEx(hProcess, NULL, (size_t)_strlen(DllFilePath), MEM_RESERVE | MEM_COMMIT);
		CloseHandle(hProcess);
		return false;
	}

	hModule = GetModuleHandle(L"kernel32.dll");
	hRemoteThread = CreateRemoteThread(hProcess, NULL, 0,
		(LPTHREAD_START_ROUTINE)GetProcAddress(hModule, "LoadLibraryA"),
		(LPVOID)VirtualMem, 0, NULL);

	if (hRemoteThread == NULL)
	{
		FreeLibrary(hModule);
		VirtualFreeEx(hProcess, NULL, (size_t)_strlen(DllFilePath), MEM_RESERVE | MEM_COMMIT);
		CloseHandle(hProcess);
		return false;
	}

	WaitForSingleObject(hRemoteThread, INFINITE);
	GetExitCodeThread(hRemoteThread, &ThreadTeminationStatus);

	FreeLibrary(hModule);
	VirtualFreeEx(hProcess, NULL, (size_t)_strlen(DllFilePath), MEM_RESERVE | MEM_COMMIT);
	CloseHandle(hRemoteThread);
	CloseHandle(hProcess);
	return true;
}
Как избавиться от этой ошибки?
Изображения
Тип файла: jpg 2017-06-27_163956.jpg (55.3 Кб, 75 просмотров)
LD-One вне форума Ответить с цитированием
Старый 27.06.2017, 18:04   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Подключить нужную библиотеку.
В стандартных проектах LIBC библиотека цепляется по умолчанию, у вас что-то не так с настройками проекта.
waleri вне форума Ответить с цитированием
Старый 27.06.2017, 18:30   #3
LD-One
Пользователь
 
Регистрация: 18.03.2012
Сообщений: 47
По умолчанию

Гугл посоветовал подключать string.h или memory.h, ничего не изменилось.
LD-One вне форума Ответить с цитированием
Старый 27.06.2017, 19:58   #4
LD-One
Пользователь
 
Регистрация: 18.03.2012
Сообщений: 47
По умолчанию

С проблемой вроде бы справился, добавил это
Код:
void * __cdecl memset(
	void *dst,
	int val,
	size_t count
)
{
	void *start = dst;

#if defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC) || defined (_M_IA64)
	{
		extern void RtlFillMemory(void *, size_t count, char);

		RtlFillMemory(dst, count, (char)val);
	}
#else  /* defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC) || defined (_M_IA64) */
	while (count--) {
		*(char *)dst = (char)val;
		dst = (char *)dst + 1;
	}
#endif  /* defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC) || defined (_M_IA64) */

	return(start);
}
После чего компилятор сказал, что такое работать с /GL не будет, убрал /GL из настроек, появилась в некоторых .h файлах ошибка на _fltused, добавил в них extern "C" int _fltused = 0; и ошибка вовсе исчезла, пока не знаю как это повлияло на работоспособность.
LD-One вне форума Ответить с цитированием
Старый 27.06.2017, 20:15   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

А зачем такой изврат?
p51x вне форума Ответить с цитированием
Старый 27.06.2017, 23:00   #6
LD-One
Пользователь
 
Регистрация: 18.03.2012
Сообщений: 47
По умолчанию

Единственное решение, которое я смог найти
LD-One вне форума Ответить с цитированием
Старый 27.06.2017, 23:19   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Сказали ж, посмотреть настройки проекта и видимо подключить нужную стандартную библиотеку (не хедер). Или просто новый проект создать если там нет какой-то сложной конфигурации сборки.

A зачем вам аналоги стандартных strlen и strcmp?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 27.06.2017, 23:25   #8
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Сказали ж, посмотреть настройки проекта и видимо подключить нужную стандартную библиотеку (не хедер). Или просто новый проект создать если там нет какой-то сложной конфигурации сборки.

A зачем вам аналоги стандартных strlen и strcmp?
Че из кода не видно? Стандартный инжектор в чужой процесс. А там к либе доступа нет, там аллоцируется страница и в нее чистый ассемблер копируется, чем меньше импортов - тем круче.

...скрипткиды на С++ 8-0 ...однако

Последний раз редактировалось alexzk; 27.06.2017 в 23:30.
alexzk вне форума Ответить с цитированием
Старый 27.06.2017, 23:36   #9
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

По теме - очень старый код (для виндовс 32 бита) и билдера 5.

Врядли заработает как есть, но можно взять идеи. Позволяет встроить нормальную ДЛЛ в чужой процесс (у ДЛЛ вызывается стартап функция - забыл уж название - оттуда можно и плясать). Так же, использования этих классов из нормальной ДЛЛ позволяет заменять стандартные ф. системы в пределах процесса (MITM attack на системные вызовы). Рекомендую подвязать DETOUR - это дизассемблер, так что будет обходить нек. неточности автоматом.

Вобщем суть такая, у вас 2 проекта:
1. Инжектор - создает удаленный поток, в него в кач. ф. потока ставится апи вызов кернеля на загрузку длл.
2. длл - тоже все компилим нормально, с момента загрузки длл получает доступ ко всей памяти - делай че хочешь.

Т.о. проблемы с нехваткой библиотек решены.
Вложения
Тип файла: 7z 111.7z (7.5 Кб, 12 просмотров)

Последний раз редактировалось alexzk; 27.06.2017 в 23:55.
alexzk вне форума Ответить с цитированием
Старый 27.06.2017, 23:55   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
А там к либе доступа нет
Вообще-то можно линковаться статически.
waleri вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка линковки LNK 2019(С++) |wanderer| Помощь студентам 6 04.05.2012 19:34
Ошибка линковки + вопрос hvz- Win Api 17 14.03.2012 22:47
Ошибка линковки! Hacker19_90 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 19.01.2012 06:43
Шаблонный класс, ошибка линковки revaldo666 Общие вопросы C/C++ 1 12.12.2011 15:57
Банальная ошибка линковки prouser Общие вопросы C/C++ 2 24.07.2011 04:22