我的设想是这样的:拿记事本程序来说,现在有一个加密了的txt文件,当我们双击该txt文件的时候,系统创建notepad.exe,这时候给该进程下钩子,在它调用了某个读文件内容的API之后,读出文件内容之前我给它拦截住,把文件内容解密,再输出。
这个API我已开始觉得应该是ReadFile(),后来调试的时候发现不是,请问我该钩取的是哪个API?

解决方案 »

  1.   

    貌似记事本没用ReadFile,而是内存映射。 
    将文件映射到某片内存空间,然后直接访问对应内存地址就等于访问文件对应内容。
    第一次访问的时候会产生缺页中断,然后系统自动载入文件内容。
    真要加密文件,最好用驱动吧。
      

  2.   

    咋最近问这种问题的好多,去看看http://fxh7622.blog.51cto.com的博客,里面有如何HOOK API函数的代码,其实方法挺简单的!
      

  3.   

    里面的記錄事本可以Hook CreateFileW, 另存/保存也是這個函數, 只是方式不一樣, 打開是 讀, 另存/保存是寫.
      

  4.   

    NtCreateFile,NtOpenFile,NtReadFile
    IAT HOOK这三个函数即可
      

  5.   

    text:0100263A                 xor     edi, edi
    .text:0100263C                 push    edi             ; hTemplateFile
    .text:0100263D                 push    80h             ; dwFlagsAndAttributes
    .text:01002642                 push    3               ; dwCreationDisposition
    .text:01002644                 push    edi             ; lpSecurityAttributes
    .text:01002645                 push    1               ; dwShareMode
    .text:01002647                 push    80000000h       ; dwDesiredAccess
    .text:0100264C                 lea     eax, [ebp+String1]
    .text:01002652                 push    eax             ; lpFileName
    .text:01002653                 call    ds:__imp__CreateFileW@28 ; CreateFileW(x,x,x,x,x,x,x)
    .text:01002659                 cmp     eax, 0FFFFFFFFh
    .text:0100265C                 mov     [ebp+hObject], eax
    .text:01002662                 jz      loc_10026F9
    .text:01002668                 push    edi             ; lpOverlapped
    .text:01002669                 lea     ecx, [ebp+iSize]
    .text:0100266F                 push    ecx             ; lpNumberOfBytesRead
    .text:01002670                 push    400h            ; nNumberOfBytesToRead
    .text:01002675                 lea     ecx, [ebp+Buffer]
    .text:0100267B                 push    ecx             ; lpBuffer
    .text:0100267C                 push    eax             ; hFile
    .text:0100267D                 call    ds:__imp__ReadFile@20 ; ReadFile(x,x,x,x,x)
    .text:01002683                 test    eax, eax
    .text:01002685                 jle     short loc_10026ED
    .text:01002687                 cmp     [ebp+iSize], edi
    .text:0100268D                 jz      short loc_10026ED
    .text:0100268F                 push    [ebp+iSize]     ; iSize
    .text:01002695                 lea     eax, [ebp+Buffer]
    .text:0100269B                 push    eax             ; lpv给你反汇编了一下xp下的notepad,开打文件时的操作如上。看!调用了CreateFileW和ReadFile,楼主是不是Hook不对啊?
      

  6.   

    大牛哇!!请教一下,你是如何实现反汇编的?
    还有,调用RriteFile的进程是什么能查看出来吗?
      

  7.   

    IDA+ollyICE,我xp下调试了下,在执行打开后,先createfile再readfile。