首页
社区
课程
招聘
[求助]Hook NtDeviceIoControlFile 各种异常崩溃。。。
发表于: 2016-10-17 12:39 5050

[求助]Hook NtDeviceIoControlFile 各种异常崩溃。。。

2016-10-17 12:39
5050
表示,看了各位大大的提示,发现Hook了NtDeviceIoControlFile基本就一了百了了。。可惜碰到了一些问题。。。

NtDeviceIoControlFile这个函数,貌似是多线程,并且异步调用的!从而,Hook后。。。
      1:它是多线程调用的,冲突可以用临界区处理下。
      2:但特么它是异步的,经常自己还没处理完,资源指针类的东西,就被销毁了,然后就崩了~

不经常玩这种高级货,可能还有一些其它小问题,还请大大们帮下小弟!

我用的是Delphi7,能Hook,也能获取数据,修改数据,但就是非常不稳定。。。经常崩溃!

发下最简单的测试代码吧。。。

function myNtDeviceIoControlFile(FileHandle:THANDLE;Event:THANDLE;ApcRoutine:PIO_APC_ROUTINE;ApcContext:PVOID;IoStatusBlock:PIO_STATUS_BLOCK;IoControlCode:ULONG;InputBuffer:PVOID;InputBufferLength:ULONG;OutputBuffer:PVOID;OutputBufferLength:ULONG):NTSTATUS;stdcall;
var
  AfdInfo: PAFD_INFO;
  Buff: PAnsiChar;
  Len: DWORD;
  sid,Url,reStr,reVal:String;
begin
  Result := OldNtDeviceIoControlFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,IoControlCode,InputBuffer,InputBufferLength,OutputBuffer,OutputBufferLength);
  if Result <> 0) then Exit;                                         // 原始函数返回失败 则退出
  OutputDebugString(Pchar(IntToHex(FileHandle,8)));
   //就这么简单,Hook后,直接调用源函数,然后输出句柄。都经常崩溃。。。马丹
end;

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 364
活跃值: (1741)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
OutputDebugString(Pchar(IntToHex(FileHandle,8))); 这句代码本来就有问题,字符串要空结尾。格式放到一个数组后,以空结尾,再outputXX
2016-10-17 13:53
0
雪    币: 22
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
... 与这无关,这函数主要是异步,多线程。。。
2016-10-17 16:56
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
骚年,其实不复杂啦
多线程,主要是控制好对全局变量的访问,特别是写操作,少用全局变量,非用不可那就加锁
异步呢,主要是还得替换掉它的通知机制,比如它的通知用的是event,那你就把event句柄换成自己的,等event有信号了,就可以处理数据了,你的Hook函数处理完,再Set原来event就可以了,ApcRoutine方式也是一样,替换就好了
2016-10-17 17:26
0
雪    币: 22
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
嗯嗯,我刚好也测试到Event了。。。我发现我对Event乱来,它程序也会一直等待。。。

晚上再试试。。。感谢大哥!
2016-10-17 18:47
0
雪    币: 22
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
function myNtDeviceIoControlFile(FileHandle:THANDLE;Event:THANDLE;ApcRoutine:PIO_APC_ROUTINE;ApcContext:PVOID;IoStatusBlock:PIO_STATUS_BLOCK;IoControlCode:ULONG;InputBuffer:PVOID;InputBufferLength:ULONG;OutputBuffer:PVOID;OutputBufferLength:ULONG):NTSTATUS;stdcall;
var
  sid:String;
  isHttp:Bool;
  myeid,nteid:Dword;
begin
  isHttp := False;myeid := 0;nteid := 0;
  if ((IoControlCode = AFD_SEND) or (IoControlCode = AFD_RECV)) and (Event <> 0) then
    begin
      myeid  := CreateEvent(nil,False,False,nil);
      nteid  := Event;
      Event  := myeid;
      isHttp := True;
    end;
  //执行源函数
  Result := OldNtDeviceIoControlFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,IoControlCode,InputBuffer,InputBufferLength,OutputBuffer,OutputBufferLength);
  if not isHttp then Exit;
  if Result <> 0 then
    begin
      SetEvent(nteid);
      CloseHandle(myeid);
      Exit;
    end;
  WaitForSingleObject(myeid,INFINITE);
  //sid    := 'ddddddddddddddddddddd';
  sid    := InttoStr(FileHandle);
  //dbg(sid);
  SetEvent(nteid);
  closeHandle(myeid);
end;

我这样的Event,对么?替换了他原来的Event...  
但发现,只要调用了 IntToStr浏览器器就会几率性崩溃!!!
2016-10-18 20:49
0
游客
登录 | 注册 方可回帖
返回
//