• 标 题: 浅谈API函数调用的方法
  • 作 者:nbw
  • 时 间:004-07-05,13:01
  • 链 接:http://bbs.pediy.com

浅谈API函数调用的方法

      API函数地址的查找在很多时候都需要,比如做DIY的时候难免需要调用API函数。关于API函数的调用有不少方法,今天我大体说一些,不是具体的步骤,只是一些原理。

1、  查看软件的引入表。如果被修改的软件中已经导入了你需要用到的API函数,这最好不过,可以用PE工具察看引入表,就可以得到该函数的RVA;

2、修改引入表。
    如果软件中没有该函数的信息,可以手工把该函数的信息导入到引入表中,手工导入需要理解PE导入表的相关格式,比较麻烦,但是占用资源少。
    一般来说,用PE工具也可以导入动态连接库的信息,但是前提是需要把动态连接库的信息重新导入,这有很大不便。具体来说:
    假如我们需要把Messageboxa函数导入到一个软件中。
    因为Messageboxa函数在User32.dll,则利用PE工具导入的时候存在2种状况:


     1、该软件中没有引入了User32.dll,那么可以利用Stu_pe等工具把User32.dll库的信息导入到软件中,顺便把Messageboxa函数信息导入到其中。具体方法请参考那些PE软件的说明;
     2、该软件中已经引入了User32.dll,有时候利用PE工具(例如PEdit,Stu_pe等)把Messageboxa函数的信息导入到软件中时候,如果强行按照上面的方法导入User32.dll和Messageboxa,那么新导入的信息可用,但是以前的User32.dll信息无法使用。就是说新添加的Messageboxa是可以用了,但是人家以前导入的Use32.dll中的函数都没办法使用了。导致软件运行不正常;改进方法当然有了,据说用LordPE可以,呵呵。


3、利用Loadlibrary函数和GetProcessAddress函数相结合,然后获取需要的函数的地址,这种方法看起来比较麻烦,事实上也比较麻烦:) ,但是我感觉比较安全,不会出什么乱子,我一般采用这种方法;

4、搜索软件的导入表。动态搜索软件的导入表,这种方法是动态修改软件的时候需要用到的,一般来说用于加壳软件或者病毒。具体方法我就不介绍了。有兴趣的可以去查查相关资料,我这也有一些。

5、直接利用Kernel32.dll中的函数,这种方法很少见到DIY方面的朋友采用。由于Kernel32.dll是系统核心,随时都在运行,可以利用他里面的函数地址。比如说需要用到CreateFile函数,可以查出来Kernel32.dll中导出的CreateFile的地址,然后call这个地址就可以了。但是这种方法存在明显缺陷:由于操作系统的不一样(比如XP中就不是Kernel32.dll库),会导致函数地址的不同。这一点需要注意。这种方法是我看Vbin写的病毒的时候发现的,感觉不错。不过我还没用过,要有不便我以后给大家再说。

    以上介绍了一些方法,具体的方法可以查相关资料,或者和我讨论(www.fcgchina.com)。这些方法各有好处,统统掌握也不是坏处,呵呵。

如果你还有什么方法,请一定告诉我。先谢过了!我发现这个格式编辑实在太麻烦了,半天也没处理好,大家将就着看吧。