【求助】WM6.1中,DLL加壳加载(成功后分析原因)
最近解决了一个问题,是这样的
我们自己用arm-linux交叉方式编译生成四个库,
这四个库在WM5.0/6.0的几款手机上采用Loadlibary方式加载,加载成功可以正常使用,
在某些WM6.1中也是可以加载成功的
但有一款死活就是加载不上
首先怀疑是机子硬件和平台的问题
通过比较 内核都是一样的 wince5.0 只有cpu主频有差异
试了很多方法,最后给这是个DLL用UPX加了一层压缩壳,结果就加载成功了 。
表面来看 就是这层压缩壳起了作用?但是不知道这加了压缩壳的dll是怎么加载的?
望达人不吝赐教 先谢谢啦^^
......................................................................
压缩下来的程序,section会变成三个。UPX0,UPX1,UPX2。
其中UPX0是虚段,具备实际的段名称和段地址,但是RawDateSize是0。所以这个段在载入后是全0数据。
数据和解压代码合并在了UPX1段中,由UPX1的解压代码注入UPX0的段中。解压代码附在了最后,从入口点到段实际内容结束点之间的范围。
而UPX2的段是一个单独的ImportTable,仅仅导入了Kernel32.dll中ExitProcess,LoadLibrary和GetProcessAddr三个函数。UPX1在解压并且注入UPX0后,会调用这三个函数来分析和获得每个导入表项的地址,然后完成导入表的动作。
upx0 解压缩后是原数据部分
upx1 原始的dll的function名,然后是解压缩代码
upx2 resouce及重新构建的import table
以上是在网上看到的有关UPX 压缩后的dll的三个section的解释