Do everything if needed

Only to note everything I meet.

直接编辑DLL文件,去掉某个链接函数

  近日,在做一款产品时,因为对开机速度的要求很高,我们将系统剪裁到最小,只剩下kernel,filesys,device和需要的驱动等。但我们使用的一个DLL链接了PostMessage,这个函数应该在GWES存在时才会有。所以该DLL不能被加载。因为该DLL是第三方提供的,没有源码,我们无法去掉对PostMessage的调用。厂家也不愿意修改。所以尝试直接编辑DLL。

  首先,用IDA分析,找到使用PostMessage(编号865)的内存位置。但这段内存在IDA中不可读取,更别说编辑了。所以用uledit打开该DLL文件。找到对应的地址后,发现DLL用一段内存在存放import,整个import区形成一个表,每个项目占用一个32位单元,PostMessage在coredll中对应的编号为865(0x361),在这个import表中的值为:0x80000361,以字节表示即为:61 03 00 80,猜测所有的coredll的import值都是0x80XXXXXX。将这个值修改成其它函数的编号之后保存。

  系统启动后发现还是会加载编号为:865的函数。就是说刚才的改动没有起作用。但通过IDA找不到其它与此相关的东西。后来直接查找 61 03 00 80,发现文件中其它位置还有一个类似的表,如法炮制,将这个值也改掉。发现一切正常。

  

     这样一来,对于以后出现类似的问题就很好办法了,如果我们链接的函数在coredll中,将函数编号的十六进制值或上0x80000000之后,直接在文件中查找这个值,应该有两处,将其直接修改成其它函数编号。如果不至两处就再分析是不是我们需要改的地方。

posted on 2011-08-10 07:07  microsun  阅读(2768)  评论(0编辑  收藏  举报

导航