能力值:
( LV3,RANK:20 )
2 楼
头大,发现思路混乱的时候不适合敲代码,没有效率啊。不能心急,要随性而敲。
能力值:
( LV2,RANK:10 )
3 楼
我刚接触windwos编程
能力值:
( LV4,RANK:40 )
4 楼
1.这个思路有问题吗?
2.CALLBACK KeyboardProc啥都不处理,这个啥都不处理有问题吗?
3.谁来处理这个yes和no的信息呢?是需要在dll文件中再添加一个处理yes 和no的函数吗?
4.如果点了yes后,谁来处理这个消息呢,收到yes消息后怎么才能让程序按照正常的流程启动呢?毕竟CreateProcess入口函数的几个byte已经被修改了。
5.自定义的那个功能函数不需要被导出吧? 1、这种hook建议采用IAT HOOK,不建议采用Inline hook.很麻烦的说。。
2、CALLBACK KeyboardProc啥都不处理,没有任何问题,但是返回的时候,要按照msdn上的要求返回。
3.谁来处理这个yes和no的信息呢?这个很简单,你
if(IDOK==MessageBox(0,"","",MB_OKCANCEL))
{
//.........Continue
}
else
{
ExitProcess();
}
4、这就是建议你用IAT HOOK的原因。因为inline hook要这样处理很麻烦,首先得还原hook,,然后再次调用,此时椎栈还没平衡,还需要手动平衡。,压力山大呀
5、自定义的函数,你有需要就导出,没需要就不导出了。
能力值:
( LV2,RANK:10 )
5 楼
的确,楼上说的对,IAT Hook只要遍历到需要的函数,然后改成自己的地址就是了,简单,明了。
能力值:
( LV3,RANK:20 )
6 楼
哦,好吧,我早上做梦,在梦中突然梦到了IAT hook是怎么个回事了。输入表和输出表有了更深入(其实也没那么深,只有有那么点感觉了)的了解后感觉有水到渠成的感觉。。之前感觉IAT hook好深奥
我今天试试。 十分感谢。:)
能力值:
( LV3,RANK:20 )
7 楼
因为在网上搜到的一骗文字是64位下的inline hook,感觉能看的个大概明白就试着这种hook的方法,结果发现,嗯,怎么说呢,
大致的测试代码是这样的:
#include "windows.h"
#include "stdio.h"
int MyFunction();
BYTE szOldAPI[9]={0,0,0,0,0,0,0,0,0};
BYTE szNewAPI[9]={0xb8,0x71,0xEA,0x4F,0x77,0x50,0xc3,0x90,0x90};
DWORD CreateProcessAAddr;
DWORD MessageBoxAAddr;
DWORD dwJmpAddr=0;
int main(void)
{
HMODULE hModule;
HANDLE hHandle;
int n=0; hModule=LoadLibrary("kernel32.dll");
CreateProcessAAddr=GetProcAddress(hModule,"CreateProcessA");
hModule=LoadLibrary("user32.dll");
MessageBoxAAddr=GetProcAddress(hModule,"MessageBoxA");
ReadProcessMemory((void *)-1,CreateProcessAAddr,szOldAPI,9,NULL);
WriteProcessMemory((void *)-1,CreateProcessAAddr,szNewAPI,9,NULL);
ReadProcessMemory((void *)-1,CreateProcessAAddr,szOldAPI,9,NULL);
hHandle=CreateProcess("c:\\windows\\notepad.exe",NULL,NULL,NULL,FALSE,0,NULL,NULL,NULL,NULL);
return 0;
}
在od中发现能够调到MessageboxA中,但是没有弹出Messagebox的对话框,
004010FB |. 6A 00 push 0 ; /pProcessInfo = NULL
004010FD |. 6A 00 push 0 ; |pStartupInfo = NULL
004010FF |. 6A 00 push 0 ; |CurrentDir = NULL
00401101 |. 6A 00 push 0 ; |pEnvironment = NULL
00401103 |. 6A 00 push 0 ; |CreationFlags = 0
00401105 |. 6A 00 push 0 ; |InheritHandles = FALSE
00401107 |. 6A 00 push 0 ; |pThreadSecurity = NULL
00401109 |. 6A 00 push 0 ; |pProcessSecurity = NULL
0040110B |. 6A 00 push 0 ; |CommandLine = NULL
0040110D |. 68 1CF04100 push 0041F01C ; |ModuleFileName = "c:\windows\notepad.exe"
00401112 |. FF15 48414200 call dword ptr [<&KERNEL32.CreateProc>; \CreateProcessA
00401118 |. 3BF4 cmp esi, esp
0040111A |. E8 81000000 call _chkesp
0040111F |. 8945 F8 mov dword ptr [ebp-8], eax
-----------------------------------------以上OD中内容--------------------------------------
在0040111A |. E8 81000000 call _chkesp 中就显示这个:
---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Error!
Program: D:\VC6++CN\MyProjects\My_HooKOne\Debug\My_HooKOne.exe
Module:
File: i386\chkesp.c
Line: 42
The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
(Press Retry to debug the application)
---------------------------
中止(A) 重试(R) 忽略(I)
---------------------------
这就是堆栈平衡的问题是吧。。
能力值:
( LV3,RANK:20 )
8 楼
没弹出messagebox对话框的原因是因为 MessageboxA中只是将ASCII 转化为UNICODE的一个过度函数,而真正执行的应该是 MessageboxW吗?(内核的那个还不会,暂时就不考虑了)
还是说是因为MessageboxA中没有给它参数?所以不弹框?
但是MessageboxA中不是有会调用MessageboxW的吗?
困惑!!!
能力值:
( LV3,RANK:20 )
9 楼
恩,慢慢来吧。