EXE部分:
#pragma pack(1)//按1字节对齐
typedef struct _JMPCODE
{
DWORD index;
char FunName[30];
}JMPMSG,*PJMPMSG;
#pragma pack()
。。。。。。。。。。。。
void CLoadSYSDlg::OnBnClickedBtJmphook()
{
// TODO: 在此添加控件通知处理程序代码
HANDLE hDevice =
CreateFile("\\\\.\\rongge", //\\??\rongge 同驱动中的符号链接
GENERIC_READ | GENERIC_WRITE,
0, // share mode none
NULL, // no security
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL ); // no template
if (hDevice == INVALID_HANDLE_VALUE)
{
TRACE( "获取驱动句柄失败: %s with Win32 error code: %d\n","MyDriver", GetLastError() );
return;
}
//add_code
JMPMSG jmpmsg;
jmpmsg.index=0x7A;
sprintf(jmpmsg.FunName,"%s","NtOpenProcess");
DeviceIoControl(hDevice, jmphook_code , &jmpmsg, sizeof(jmpmsg), &bufret, 4, &dwWrite, NULL);
CloseHandle(hDevice);
}
。。。。。。。。。。。。。
SYS部分:派遣函数
case jmphook_code:
{
ULONG NtOpenProcess_OldAddr;
/*int jmpindex,jmpstr;
int * InputBuffer = (int*)pIrp->AssociatedIrp.SystemBuffer;
_asm
{
mov eax,InputBuffer
mov ebx,[eax]
mov jmpindex,ebx
lea ebx,[eax+4]
mov jmpstr,ebx
}
int* OutputBuffer = (int*)pIrp->AssociatedIrp.SystemBuffer;
_asm
{
mov eax,1
mov ebx,OutputBuffer
mov [ebx],eax //
}
KdPrint(("传入数据%d:%s\n",jmpindex,(PCWSTR)jmpstr));//这里显示为"122:NtOpenProcess"
NtOpenProcess_CurAddr=GetNt_CurAddr(jmpindex);
NtOpenProcess_OldAddr=GetNt_OldAddr((PCWSTR)(jmpstr));*/这里始终为0;
NtOpenProcess_CurAddr=GetNt_CurAddr(0x7A);
NtOpenProcess_OldAddr=GetNt_OldAddr(L"NtOpenProcess");//这里就是正确的。
if((NtOpenProcess_CurAddr != NtOpenProcess_OldAddr) && (0 != NtOpenProcess_OldAddr))
{
KdPrint(("此函数被HOOK了,写入跳转\n"));
NtOpenProcess_OldCode=WriteJMP(NtOpenProcess_CurAddr,NtOpenProcess_OldAddr);
NtOpenProcess_Hook=1;
}
break;
}
不知道是不是宽字符和窄字符的问题,该如何赋值?
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!