Большой Воронежский Форум
Страница 2 из 2
< 12
» Программирование>С++. Ассемблер. Прерывания
Hopkroft 23:30 27.01.2012

Сообщение от Спартак21:
Спасибо за ссылку

Книжка Пирогова на озоне.
К сожалению нету в продаже но можно найти на других ресурсах
Да, смотри сайт wasm.ru. Там огромное количество статей для начинающих. И с помощью софта сможешь сделать первые шаги в твоём любимом асме
X0R 23:31 27.01.2012

Сообщение от Спартак21:
мне интересно, как реализуется та или иная функция в WinAPI

IDA Pro
Спартак21 23:38 27.01.2012
Есть такие
Spectator 23:56 27.01.2012

Сообщение от Спартак21:
спасибо за ответ, но с этим я знаком
мне интересно, как реализуется та или иная функция в WinAPI

Programming Windows, The Definitive Guide to the Win32 API
Charles Petzold (Microsoft Press)

Крайне рекомендую. И книгу и автора в целом. Если Кнут для меня был книгой откровений в алгоритмах, то Петзольд разьяснил - каким местом думали Билли & co, когда разрабатывали винду.
Spectator 00:01 28.01.2012

Сообщение от X0R:
IDA Pro

Вещь, факт. Но в данном случае я бы посоветовал Visual C++ в режиме смешанного просмотра С++/ASM кода. Очень познавательно видеть во что превращаются твои сишные выкрутасы, раз, облегчает понимание конкретных асмовских операций - два.
Ну и попроще будет, чем IDA.
X0R 00:25 28.01.2012

Сообщение от Spectator:
я бы посоветовал Visual C++ в режиме смешанного просмотра С++/ASM кода

все пути винапи ведут к ядру и драйверам)) А там и до WinDbg недалеко)))
Spectator 00:36 28.01.2012

Сообщение от X0R:
все пути винапи ведут к ядру и драйверам)) А там и до WinDbg недалеко)))

Ну, батенька, это уже слишком глубоко. Если только драйвера разрабатывать. Но это уже отдельный разговор.

Так, Спартак, тема скатывается во флуд, ты уже должно быть понял что изначальная постановка вопроса неверна. Посему подразберись в полученной информации и сформулируй, при необходимости, другую тему. А эту я неторопливо прикрою.
Hopkroft 00:41 28.01.2012

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

Вот это ты загнул
Сейчас наоборот идёт упор на статический анализ самого кода, а ты всё с асмом.
Spectator 01:09 28.01.2012

Сообщение от Hopkroft:
Вот это ты загнул
Сейчас наоборот идёт упор на статический анализ самого кода, а ты всё с асмом.

Jedem das seine. Это первое.
Второе. Никакой "упор" не идет. Я баловался с теми штуками, о которых ты говоришь. ОЧЕНЬ интересно, но практической пользы - ноль целых, ноль десятых. Если только речь идет об очень крупном проекте, в котором ошибки надо предупреждать, поскольку цена каждой будет измерятся сотнями часов и, соответственно, тысячами долларов.
В качестве резюме: и то и другое нужно, просто в разных случаях.
Эту ветку я снесу в болталку, впоследствии. Или можно тему отдельную открыть, вопрос, в целом, вполне себе интересный. И мне в том числе.
Спартак "наш человек", поэтому зверствовать не буду (я крайне против флуда и подколов в темах, которые создали люди, которые незнакомы с контингентом данного раздела, но тут позволю и себе и остальным в меру пофлудить).
Но недолго, если будет интерес, создаем тему и там общаемся по поводу статического анализа кода. Так ее и назовем.
Спартак21 08:19 28.01.2012
да, правильно тобой сформулирована постанавка вопроса. именно это меня и интересует
Spectator 14:15 28.01.2012

Сообщение от Спартак21:
да, правильно тобой сформулирована постанавка вопроса. именно это меня и интересует

Кем? Мной? Я ничего не форумулировал.
Спартак, ну напиши же, наконец, что ты хочешь получить, вход, выход, язык, среда, ОС. Ты программист или куда? Чёткая постановка вопроса - это наше всё.
buhovik 13:15 09.02.2012
Ниже пример как, в usermode, получить iopl ring0 и бипнуть через порты (бип взят из hal.dll). У меня не пищит - потерялся динамик.

Код:
#include <tchar.h>
#include <iostream>
#include <windows.h>


bool SetPrivilegeState(HANDLE aToken, LUID& aPrivId, bool aState)
{
	TOKEN_PRIVILEGES tTp;
	bool tRes = false;

	tTp.PrivilegeCount = 1;
	tTp.Privileges[0].Luid = aPrivId;
	tTp.Privileges[0].Attributes = (aState ? SE_PRIVILEGE_ENABLED : 0);

	if (AdjustTokenPrivileges(aToken, FALSE, &tTp, sizeof(TOKEN_PRIVILEGES), NULL, NULL)) tRes = true;

	if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
	{
		tRes = false;
	};
	return tRes;
};

bool SetPrivilegeState(HANDLE aToken, const _TCHAR* aPrivName, bool aState)
{
	LUID tLuid;
	bool tRes = false;

	if (LookupPrivilegeValue(NULL, aPrivName, &tLuid)) tRes = SetPrivilegeState(aToken, tLuid, aState);

	if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
	{
		std::cout << "User has not privilege : " << aPrivName << std::endl;
	};
	return tRes;
};

bool SetTcbPrivilegeState(HANDLE aProc, bool aState)
{
	HANDLE tToken;
	bool tRes = false;

	if (OpenProcessToken(aProc, TOKEN_ADJUST_PRIVILEGES, &tToken))
	{
		tRes = SetPrivilegeState(tToken, _TEXT("SeTcbPrivilege"), aState);
		CloseHandle(tToken);
	};
	return tRes;
};

bool EnableUserIOPL_R0(HANDLE aProc)
{
	typedef NTSTATUS (__stdcall *TSetProcInfoFunc)(HANDLE, long, void*, unsigned long);

	int UserIOPL = 16;
	bool tRes = false;
	HMODULE tLib = LoadLibrary(_TEXT("ntdll.dll"));

	if (tLib)
	{
		TSetProcInfoFunc tSetFunc = (TSetProcInfoFunc)GetProcAddress(tLib, "NtSetInformationProcess");
		if (tSetFunc)
		{
			NTSTATUS tStat = tSetFunc(aProc, UserIOPL, NULL, 0);
			tRes = (tStat >= 0);
		};
		FreeLibrary(tLib);
	};
	return tRes;
};

bool EnableSystemIo()
{
	bool tRes = false;
	HANDLE tProcHandle;
	if (DuplicateHandle(GetCurrentProcess(), GetCurrentProcess(), GetCurrentProcess(), &tProcHandle, PROCESS_ALL_ACCESS, FALSE, 0))
	{
		if (SetTcbPrivilegeState(tProcHandle, true))
		{
			tRes = EnableUserIOPL_R0(tProcHandle);
		};

		CloseHandle(tProcHandle);
	};
	return tRes;
};

void BeepSignal(unsigned long aFreq)//hall.dll HalMakeBeep()
{
	const long tTimerFreq = 0x1234CF;
	__asm
	{
		in	al, 0x61
		and	al, 0xFC
		out	0x61, al
	};
	if (aFreq > 0)
	{
		aFreq = tTimerFreq / aFreq;
		if (aFreq < 65000)
		{
			__asm
			{
				mov al, 0xB6
				out 0x43, al
				mov	eax, [aFreq]
				out 0x42, al
				mov al, ah
				out 0x42, al

				in	al, 0x61
				and	al, 0xFC
				out	0x61, al
			};
		};
	};
};


int _tmain(int argc, _TCHAR* argv[])
{

	if (EnableSystemIo())
	{
		BeepSignal(600);
		Sleep(1000);
		BeepSignal(0);
	};
	return 0;
}
Страница 2 из 2
< 12
Вверх