想做个全局钩子,钩住 user32.dll的messageboxa

billy145533 2005-10-28 02:54:16
本来是想破解一个软件的nag窗口
想不到 这个软件调的messagebox是封装在一个函数里的,我一屏蔽掉这个messagebox
整个系统的消息提示框都出不来了
所以,我想做一个程序,作为服务进程(dll+exe)
实现的是一个钩子的作用,钩住messagebox
这样可以去掉无关的messagebox
但是,我 实现的好象是局部钩子,除了能钩住同一个进程的messagebox,其他的一点反应都没有

BOOL WINAPI InstallHook()//输出安装空的钩子函数
{
g_hinstDll=LoadLibrary("window.dll");
g_hHook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)Hook,g_hinstDll,0);
if (!g_hHook)
{
MessageBoxA(NULL,"SET ERROR","ERROR",MB_OK);
return(false);
}
return(true);
}
...全文
409 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
做鸡真好吃 2006-05-09
  • 打赏
  • 举报
回复
关注中~
billy145533 2005-10-31
  • 打赏
  • 举报
回复

谢谢
揭贴了!!!
mct1025 2005-10-31
  • 打赏
  • 举报
回复
加密解密技术内幕,看雪论坛精华1-6,MSDN

感觉这些东西学了以后,工作中基本用不到,只能作为业余爱好
billy145533 2005-10-31
  • 打赏
  • 举报
回复
多谢 mct1025(macuntao)的大力帮助
尽管还能很好的解决,但还是非常感谢
顺便问一下,我想学习 你上面给我那些编码,有哪些资料可以参考学习呢
mct1025 2005-10-30
  • 打赏
  • 举报
回复
其实我水平也一般,csdn的几位斑竹才是高手,各方面都比较精通
上面的代码看不太明白,是因为你以前接触的少,接触多自然就熟悉了

是不太严密,如果直接运行Whxt.exe,就控制不了
我所能想到的处理方法,也就这几个了
1、研究pb运行机制,真正的去掉Msgbox
2、hook msgbox
3、内存补丁,和hook一个指定进程差不多

你自己权衡一下,选一个合适的
我也只能帮你到这个程度了
billy145533 2005-10-29
  • 打赏
  • 举报
回复
做钩子确实是可以
但是 你要考虑 如何把 钩子注入目标进程
目标进程不只一两个
而且钩子 使整个系统性能会有所下降
还是 请一个高手能帮我破解一下
http://vip.deyv.com/billy145/software/soft.rar
只要除去nag就可以
我的邮箱是xzh_ab@163.com
qq:29768304
重重给分
billy145533 2005-10-29
  • 打赏
  • 举报
回复
mct1025(macuntao)
真是一个高手
上面的代码,我老实的说,看的不明白
内存补丁 给我的感觉 不够 严密啊
mct1025 2005-10-29
  • 打赏
  • 举报
回复
也可以自己写一个内存补丁,去掉msgbox
我在win2k下做的,别的系统不知道会不会在同一个地址
10C2589C 85C0 TEST EAX,EAX
10C2589E 75 7C JNZ SHORT PBVM80.10C2591C

去掉第一个MessageBoxA,写的挺乱

STARTUPINFO si = {sizeof(si)};
PROCESS_INFORMATION pi;
BOOL b = CreateProcess(NULL,
"Whxt.exe",
NULL, NULL, TRUE,
DEBUG_PROCESS,
NULL, NULL, &si, &pi);

//write break
BOOL bBreak = TRUE;
DWORD dwAddr = 0x10C2589C;
BYTE byWrite = 0xcc;
BOOL bWriteBreak = FALSE;

DEBUG_EVENT dbg = {0};
while (WaitForDebugEvent(&dbg, INFINITE)) {
if (dbg.dwDebugEventCode == EXCEPTION_DEBUG_EVENT) {
if (dbg.u.Exception.ExceptionRecord.ExceptionCode
== EXCEPTION_BREAKPOINT) {

LPVOID lpAddr =

dbg.u.Exception.ExceptionRecord.ExceptionAddress;
if(bBreak && (lpAddr == (LPVOID)dwAddr)) {
byWrite = 0x85;//clear break
WriteProcessMemory(pi.hProcess,

(LPVOID)dwAddr, &byWrite, 1, NULL);
bBreak = FALSE;

ContinueDebugEvent(dbg.dwProcessId,

dbg.dwThreadId, DBG_EXCEPTION_NOT_HANDLED);
//这个地址在下面还要断一次
}
else if(!bBreak && (lpAddr == (LPVOID)dwAddr)) {
//DBG_EXCEPTION_NOT_HANDLED之后
CONTEXT context = {0};
context.ContextFlags = CONTEXT_INTEGER;
if (GetThreadContext(pi.hThread, &context)) {
context.Eax = 1;
SetThreadContext(pi.hThread,

&context);
}
}
}
}
else if (dbg.dwDebugEventCode == LOAD_DLL_DEBUG_EVENT) {
if(!bWriteBreak) {//write

break,也许可以判断加载pbvm80.dll
b = WriteProcessMemory(pi.hProcess,

(LPVOID)dwAddr, &byWrite, 1, NULL);
if(b) bWriteBreak = TRUE;
}
}
else if (dbg.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT) {
::MessageBox(NULL, "EXIT_PROCESS_DEBUG_EVENT", NULL,

MB_OK);
break;
}
b = ContinueDebugEvent(dbg.dwProcessId, dbg.dwThreadId,

DBG_CONTINUE);
}

CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
billy145533 2005-10-29
  • 打赏
  • 举报
回复
mct1025(macuntao)
谢谢你的支持
这个确实很能转,我已经被转晕了
mct1025 2005-10-29
  • 打赏
  • 举报
回复
pb的程序我也看不懂,能力有限

在pbvm80.dll里面转来转去,也不知道怎么运行的,还申请了很多块内存
可能需要对pb的运行机制,有比较完善的理解才行,估计是个费时费力的活
billy145533 2005-10-29
  • 打赏
  • 举报
回复
我在自己的空间上已经把软件传上去了
http://vip.deyv.com/billy145/software/soft.rar
soft.rar
文件包括应用程序whxt.exe
pbvm80.dll(fnMessageBox)也就是nag窗口和所有消息对话框的所在地
jcclib.dll
ufhis.ini文件,这个文件如果不放在window目录下面,会产生一个ini文件错误的消息
lianglp 2005-10-28
  • 打赏
  • 举报
回复
如果调用了user32.dll中API:MessageBox(),你做了消息勾子后,
再拦载这个API就可以了。
billy145533 2005-10-28
  • 打赏
  • 举报
回复
谁要是觉得 这个nag窗口 破解 比较简单的话,请留下邮箱地址
我把软件发给他
破解成功后
我以再给200分
billy145533 2005-10-28
  • 打赏
  • 举报
回复
我把汇编文件 弹出 messagebix 的地方做了几个标志
然后把 普通的消息对话框也经过的几处去掉
目标就锁定在那几个地方了,对吧
就是不行啊
郁闷死了
billy145533 2005-10-28
  • 打赏
  • 举报
回复
大家说的都没错
都是 递归的层次太多了

我一直 找到 user32.dll 的messagebox
但是还没有找到 那个 该死的入口
显然 编码的人 还是对汇编比较懂的
我用 od破解的
dll的中文资源基本上都是乱码
所以采用静态分析是不行的
goodboyws 2005-10-28
  • 打赏
  • 举报
回复
估计是函数入口没有找对,MFC程序很可能不是直接包含user32.dll而是通过MFC42.dll,所以你的查找模块的过程需要有递归
billy145533 2005-10-28
  • 打赏
  • 举报
回复
我在网上参考了不少答案
都没有解决这个问题
billy145533 2005-10-28
  • 打赏
  • 举报
回复
我的邮箱是xzh_ab@163.com
大家有源码的最好
mct1025 2005-10-28
  • 打赏
  • 举报
回复
即使封装了,也应该只有一个函数入口
你可能找的地方不对,还需要往向上一级找
billy145533 2005-10-28
  • 打赏
  • 举报
回复
那个函数调用通过一个eax传函数地址的
很多地方都有用的
本人没有什么crack的功力
也没有脾气了
加载更多回复(5)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧