Сообщение от Спартак21:
Спасибо за ссылку
Сообщение от Спартак21:
мне интересно, как реализуется та или иная функция в WinAPI
Сообщение от Спартак21:
спасибо за ответ, но с этим я знаком
мне интересно, как реализуется та или иная функция в WinAPI
Сообщение от X0R:
IDA Pro
Сообщение от Spectator:
я бы посоветовал Visual C++ в режиме смешанного просмотра С++/ASM кода
Сообщение от X0R:
все пути винапи ведут к ядру и драйверам)) А там и до WinDbg недалеко)))
Сообщение от Spectator:
Очень познавательно видеть во что превращаются твои сишные выкрутасы, раз, облегчает понимание конкретных асмовских операций - два.
Сообщение от Hopkroft:
Вот это ты загнул Сейчас наоборот идёт упор на статический анализ самого кода, а ты всё с асмом.
Сообщение от Спартак21:
да, правильно тобой сформулирована постанавка вопроса. именно это меня и интересует
#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; }