用导入表方式拦截API, 我要拦截的是getprocaddress函数!被拦截的程序是动态调用getprocaddress(getmodulehandle('xx.dll'),'function')来获得function函数的地址!我要把我的DLL注入到被拦截程序里,然后拦截getprocaddress到mygetpeocaddress函数里,这样被拦截的程序加载getprocaddress函数就会转到我的mygetprocaddress函数里处理,然后在mygetpeocaddress里把我自己的myfunction地址赋值给mygetpeocaddress函数的返回值,这样被拦截的程序就会认为myfunction的地址就是function的地址!但是如果被拦截的程序要是先运行,然后在运行我的拦截程序!那么在没有注入DLL前,被拦截的程序就已经调用了getprocaddress函数,并且已经取得了function函数的地址了!这样的话,即使在拦截getprocaddress也没有用了!请问如果被拦截的程序先运行,那么我该怎么替换function函数的地址呢?

解决方案 »

  1.   

    不清楚..建议直接写个Shell来替换XX.DLL.
      

  2.   

    呵呵~如果你坚持如下两点: 利用导入表拦截目标函数;拦截程序与目标程序没有启动先后限制;
    那么恐怕没有什么好办法了。当然也可以暴力搜索目标程序地址空间,查找有没有目标函数地址,有则替换之...但这样也不可靠。我想解决办法一是用jmp修改dll,二是把你的拦截程序做成目标程序的调试器(以便在其启动的第一时间内完成拦截动作)。
      

  3.   

    那程序要是动态加载的getprocaddress函数来获得一个函数的地址,那在导入表里此函数不就没有记录了吗?,就象我以前问的那样!想解决办法一是用jmp修改dll,说说思路好吗?
      

  4.   

    如果只用getprocaddress来调用的话,导入表中的确没有记录的。
    jmp其实属于系统级的拦截了,可以拦截整个系统范围内的对此函数的调用。
    就是把目标函数地址头几个字节改成一个jmp语句,跳到自己的函数中来。
    当然要保存原来的地址。
      

  5.   

    jmp请问能在WIN98下用吗?不是说不可以的吗?
      

  6.   

    yansea(思宏)请问是不是在98下,可以直接用?不用申请内存映射文件吧?过程试了一下!好象可以!可有本书上说98下修改JMP会影响到别的进程?不知道是怎么回事!
      

  7.   

    具体我也不是很清楚了,在98下那段地址空间是所有进程共享的。
    到网上找一找吧,这样的例子很多,我这里就有一个从网上down的屏幕取词的例子,就是利用jmp跳转。若找不到可以发给你。