提交 9b4611d8 编写于 作者: K khz_df

[内存读取] 增加读取方式选项

上级 ba1b7ea3
...@@ -12,6 +12,8 @@ ...@@ -12,6 +12,8 @@
#define IDC_COMBO_PROCESS 1002 #define IDC_COMBO_PROCESS 1002
#define IDC_EDIT_MEM_DATA 1003 #define IDC_EDIT_MEM_DATA 1003
#define IDC_BUTTON_READ 1004 #define IDC_BUTTON_READ 1004
#define IDC_COMBO1 1005
#define IDC_COMBO_READ_TYPE 1005
// Next default values for new objects // Next default values for new objects
// //
...@@ -19,7 +21,7 @@ ...@@ -19,7 +21,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS #ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 130 #define _APS_NEXT_RESOURCE_VALUE 130
#define _APS_NEXT_COMMAND_VALUE 32771 #define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1005 #define _APS_NEXT_CONTROL_VALUE 1006
#define _APS_NEXT_SYMED_VALUE 101 #define _APS_NEXT_SYMED_VALUE 101
#endif #endif
#endif #endif
...@@ -85,6 +85,7 @@ void CtoolsMFCDlg::DoDataExchange(CDataExchange* pDX) ...@@ -85,6 +85,7 @@ void CtoolsMFCDlg::DoDataExchange(CDataExchange* pDX)
DDX_Text(pDX, IDC_EDIT_LENGTH, m_mem_length); DDX_Text(pDX, IDC_EDIT_LENGTH, m_mem_length);
DDX_Control(pDX, IDC_EDIT_ADDRESS, m_mem_address); DDX_Control(pDX, IDC_EDIT_ADDRESS, m_mem_address);
DDX_Control(pDX, IDC_COMBO_PROCESS, m_combo_process); DDX_Control(pDX, IDC_COMBO_PROCESS, m_combo_process);
DDX_Control(pDX, IDC_COMBO_READ_TYPE, m_combo_read_type);
} }
BEGIN_MESSAGE_MAP(CtoolsMFCDlg, CDialogEx) BEGIN_MESSAGE_MAP(CtoolsMFCDlg, CDialogEx)
...@@ -93,6 +94,7 @@ BEGIN_MESSAGE_MAP(CtoolsMFCDlg, CDialogEx) ...@@ -93,6 +94,7 @@ BEGIN_MESSAGE_MAP(CtoolsMFCDlg, CDialogEx)
ON_WM_QUERYDRAGICON() ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_READ, &CtoolsMFCDlg::OnBnClickedButtonRead) ON_BN_CLICKED(IDC_BUTTON_READ, &CtoolsMFCDlg::OnBnClickedButtonRead)
ON_CBN_DROPDOWN(IDC_COMBO_PROCESS, &CtoolsMFCDlg::OnCbnDropdownComboProcess) ON_CBN_DROPDOWN(IDC_COMBO_PROCESS, &CtoolsMFCDlg::OnCbnDropdownComboProcess)
ON_CBN_SELCHANGE(IDC_COMBO_PROCESS, &CtoolsMFCDlg::OnCbnSelchangeComboProcess)
END_MESSAGE_MAP() END_MESSAGE_MAP()
...@@ -134,6 +136,11 @@ BOOL CtoolsMFCDlg::OnInitDialog() ...@@ -134,6 +136,11 @@ BOOL CtoolsMFCDlg::OnInitDialog()
m_mem_length = 0x20; m_mem_length = 0x20;
UpdateData(FALSE); UpdateData(FALSE);
m_combo_read_type.AddString(_T("ReadProcessMemory"));
m_combo_read_type.AddString(_T("BlackBone_R3"));
m_combo_read_type.AddString(_T("BlackBone_R0"));
m_combo_read_type.SetCurSel(0);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
} }
...@@ -229,18 +236,25 @@ std::string ToHexLines(PBYTE bytes, DWORD length) ...@@ -229,18 +236,25 @@ std::string ToHexLines(PBYTE bytes, DWORD length)
void CtoolsMFCDlg::OnBnClickedButtonRead() void CtoolsMFCDlg::OnBnClickedButtonRead()
{ {
// TODO: 在此添加控件通知处理程序代码 // 更新控件数据,清空16进制显示控件内容
UpdateData(); UpdateData();
m_mem_data.SetString(_T("")); m_mem_data.SetString(_T(""));
// 获取目标进程内存地址:ll_address
CString str_address; CString str_address;
m_mem_address.GetWindowText(str_address); m_mem_address.GetWindowText(str_address);
str_address = _T("0x") + str_address; str_address = _T("0x") + str_address;
LONGLONG ll_address = _tcstoull_l(str_address.GetBuffer(), NULL, 16, 0); LONGLONG ll_address = _tcstoull_l(str_address.GetBuffer(), NULL, 16, 0);
// 获取目标进程ID:pid
int nIndex = m_combo_process.GetCurSel(); int nIndex = m_combo_process.GetCurSel();
DWORD pid = m_combo_process.GetItemData(nIndex); DWORD pid = m_combo_process.GetItemData(nIndex);
// 获取读取方式:str_read_type
CString str_read_type;
m_combo_read_type.GetWindowText(str_read_type);
// 打开目标进程
blackbone::Process process; blackbone::Process process;
process.Attach(pid); process.Attach(pid);
if (!process.valid()) if (!process.valid())
...@@ -256,7 +270,7 @@ void CtoolsMFCDlg::OnBnClickedButtonRead() ...@@ -256,7 +270,7 @@ void CtoolsMFCDlg::OnBnClickedButtonRead()
} }
// ReadProcessMemory方式 // ReadProcessMemory方式
if (false) if (str_read_type == _T("ReadProcessMemory"))
{ {
SIZE_T byte_read; SIZE_T byte_read;
BOOL result = ReadProcessMemory(process.core().handle(), (LPCVOID)ll_address, (LPVOID)bytes, (SIZE_T)m_mem_length, &byte_read); BOOL result = ReadProcessMemory(process.core().handle(), (LPCVOID)ll_address, (LPVOID)bytes, (SIZE_T)m_mem_length, &byte_read);
...@@ -266,8 +280,8 @@ void CtoolsMFCDlg::OnBnClickedButtonRead() ...@@ -266,8 +280,8 @@ void CtoolsMFCDlg::OnBnClickedButtonRead()
return; return;
} }
} }
// blackbone方式 // blackbone方式: NtWow64ReadVirtualMemory64
else if (false) else if (str_read_type == _T("BlackBone_R3"))
{ {
NTSTATUS status = process.memory().Read(ll_address, m_mem_length, (PVOID)bytes); NTSTATUS status = process.memory().Read(ll_address, m_mem_length, (PVOID)bytes);
if (!NT_SUCCESS(status)) if (!NT_SUCCESS(status))
...@@ -277,14 +291,16 @@ void CtoolsMFCDlg::OnBnClickedButtonRead() ...@@ -277,14 +291,16 @@ void CtoolsMFCDlg::OnBnClickedButtonRead()
} }
} }
// 驱动方式 // 驱动方式
else else if (str_read_type == _T("BlackBone_R0"))
{ {
// 加载驱动
NTSTATUS status = blackbone::Driver().EnsureLoaded(); NTSTATUS status = blackbone::Driver().EnsureLoaded();
if (!NT_SUCCESS(status)) if (!NT_SUCCESS(status))
{ {
AfxMessageBox(_T("加载驱动失败。")); AfxMessageBox(_T("加载驱动失败。"));
return; return;
} }
// 驱动内存读取
status = blackbone::Driver().ReadMem(pid, ll_address, m_mem_length, (PVOID)bytes); status = blackbone::Driver().ReadMem(pid, ll_address, m_mem_length, (PVOID)bytes);
if (!NT_SUCCESS(status)) if (!NT_SUCCESS(status))
{ {
...@@ -339,3 +355,27 @@ void CtoolsMFCDlg::OnCbnDropdownComboProcess() ...@@ -339,3 +355,27 @@ void CtoolsMFCDlg::OnCbnDropdownComboProcess()
m_combo_process.SetItemData(nIndex, pid); m_combo_process.SetItemData(nIndex, pid);
} }
} }
void CtoolsMFCDlg::OnCbnSelchangeComboProcess()
{
// TODO: 在此添加控件通知处理程序代码
int nIndex = m_combo_process.GetCurSel();
DWORD pid = m_combo_process.GetItemData(nIndex);
blackbone::Process process;
process.Attach(pid);
if (!process.valid())
{
return;
}
if (process.modules().GetMainModule() == nullptr)
{
return;
}
CString str_address;
str_address.Format(_T("%llX"), process.modules().GetMainModule()->baseAddress);
m_mem_address.SetWindowText(str_address);
}
...@@ -38,4 +38,6 @@ public: ...@@ -38,4 +38,6 @@ public:
CComboBox m_combo_process; CComboBox m_combo_process;
afx_msg void OnBnClickedButtonRead(); afx_msg void OnBnClickedButtonRead();
afx_msg void OnCbnDropdownComboProcess(); afx_msg void OnCbnDropdownComboProcess();
afx_msg void OnCbnSelchangeComboProcess();
CComboBox m_combo_read_type;
}; };
B// Microsoft Visual C++ generated resource script. B// Microsoft Visual C++ generated resource script.
......
...@@ -16,8 +16,12 @@ ...@@ -16,8 +16,12 @@
#define CALL_64_86(b, f, ...) (b ? f<uint64_t>(__VA_ARGS__) : f<uint32_t>(__VA_ARGS__)) #define CALL_64_86(b, f, ...) (b ? f<uint64_t>(__VA_ARGS__) : f<uint32_t>(__VA_ARGS__))
#define FIELD_PTR_64_86(b, e, t, f) (b ? fieldPtr( e, &t<uint64_t>::f ) : fieldPtr( e, &t<uint32_t>::f )) #define FIELD_PTR_64_86(b, e, t, f) (b ? fieldPtr( e, &t<uint64_t>::f ) : fieldPtr( e, &t<uint32_t>::f ))
#ifndef LODWORD
#define LODWORD(l) ((uint32_t)(((uint64_t)(l)) & 0xffffffff)) #define LODWORD(l) ((uint32_t)(((uint64_t)(l)) & 0xffffffff))
#endif
#ifndef HIDWORD
#define HIDWORD(l) ((uint32_t)((((uint64_t)(l)) >> 32) & 0xffffffff)) #define HIDWORD(l) ((uint32_t)((((uint64_t)(l)) >> 32) & 0xffffffff))
#endif
// Set or reset particular bit // Set or reset particular bit
#define SET_BIT(v, b) v |= (1ull << b) #define SET_BIT(v, b) v |= (1ull << b)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册