首页
社区
课程
招聘
[原创]Windows Mobile平台DLL中API列表分析
发表于: 2008-12-27 08:55 11017

[原创]Windows Mobile平台DLL中API列表分析

2008-12-27 08:55
11017

DLL中API列表的分析

        大家知道DLL文件是Windows系统中非常重要的文件。很多API函数或者资源都在DLL中。对DLL的分析可以帮助我们加深对系统的了解。特别是如果能够获取DLL中API函数的列表,并扫描学习可以大大提升我们的编程功力。

        我就是在获得了DLL中API函数列表之后才编写出ShowLastError宏;才知道Window Mobile 4.21开始就可以支持“安全字符串处理API”(MSDN中声称WM5才支持。);查到MD5 API函数提取摘要;使用gx.dll中奇怪的函数名调用游戏API函数,正因为攻占了游戏API我们才拥有了直接攻击显存的能力........

        首先我浏览了PPC中的各个目录,没有找到DLL文件。在EVC的虚拟机中通过显示隐藏文件的功能发现DLL都在\Windows目录下。尝试拷贝一个DLL出来分析失败,系统提示找不到文件。

     使用FindFirstFileW和FindNextFileW在\Windows目录下逐个枚举*.DLL文件获得成功。在PPC 2003中枚举到283个DLL。这里需要注意的是Windows CE系统的WIN32_FIND_DATA 结构和桌面系统不同。我已经在Xarm中声明了。枚举过程中把文件大小也取出,写入文本文件中。这样就得到了全部DLL的文件名和大小列表。

         到这个时候有两条路线研究DLL。
         一条是从文件出发,按PE格式分析文件得到API列表。
         一条是从内存映象出发,也是按PE格式分析。

         从文件路线走:
         有了文件名就尝试使用CopyFileW函数将文件拷贝出来,函数出错。找不到文件。
         尝试用CreateFileW获得文件句柄,函数出错。找不到文件。
         其他文件API也对其无能为力都提示找不到文件。
         使用FindFirstFileW查找coredll.dll文件获得其文件属性发现有FILE_ATTRIBUTE_ROMMODULE属性。
         尝试使用SetFileAttributesW函数修改属性失败,找不到文件。
         因为WIN32_FIND_DATA 结构中有dwOID 参数尝试从结构对象存储出发看能否有突破,依然失败。
         尝试研究虚拟机文件,发现ppc.dess才是真正存储了虚拟机中新增文件的硬盘文件。但是保存一个
         可执行文件后其容量的增量并不和文件相同。而且在这个文件中发现的PE标志不像是PE文件。
         可能是压缩了。这条路线基本失败。

         从内存映象路线走:
         LoadLibraryW得到了DLL的实例句柄,但是我们很快发现这个实例句柄并不是内存地址。
         通过GetModuleInformation函数可以查到DLL的装载地址和入口点等信息。
         直接访问装载地址失败。
         估计是这段内存没有可读属性,尝试使用VirtualProtect修改内存属性失败。(这个函数对写加密病毒非常重要!)
         尝试使用SetKMode进入系统状态访问仍然失败。
         通过VirtualQuery函数查询这段内存发现是PAGE_NOACCESS属性的难怪无法访问。

         看来微软是严防死守不让我们研究DLL!无论文件还是内存映象都严密控制了。
         在春节前一天突然想到一个问题,我们要得到DLL的函数列表关键是分析DLL的输出表。这个
         部分一般在文件的后半部分,系统对这部分是否也控制了呢?

         立即试验!
         发现对于装载在内存中的DLL,系统只将最初的4K设置为PAGE_NOACCESS属性后面的可以自由访问!
         太好了!立即编写程序将从DLL装载位置4K偏移量以后的部分Dump到文本文件中。使用WinHex处理
         这个文本文件,终于得到了我们梦寐以求的API函数列表。后来针对WM6作试验发现同样只有最初4K
         被设置为PAGE_NOACCESS属性后面部分可以访问。

总结:
         这个“DLL中API列表分析”问题前后用了4周才攻克。是我们学习Windows CE / ARM以来第一个重大
难关。不过研究的过程是很快乐的。因为我们不断的尝试新的方法,大大提高了对系统的认识。不断
研究的过程就是不断学习积累的过程,至少我们知道这个办法不行。还有另一些有趣发现。

01.    PPC 2003 中DLL的装载地址是64K对齐的。所有地址的末尾都是0000。
02.    WM 6       中DLL的装载地址是4K对齐的。所有地址末尾都是000。DLL量增加了,密度也增大?
03.    所有的DLL都是顺次排列好的。一个挨一个,有的未加载的就给她空着的。     
04.    ★ 这个最有趣:用FindFirstFileW/FindNextFileW可以得到一个DLL列表。这个列表产生的方式
              恰好是DLL在内存中装载地址从高到低排列的方式。

         同时让我们明白编写程序检测系统中是否存在某个文件时不能使用CreateFileW尝试获得文件的句柄。
而是应该使用FindFirstFileW。否则遇到DLL这样的文件就认为她不存在了。

问题:
01.    为什么FindFirstFileW这样的函数可以找到这些DLL的信息?而其他API函数不行?
02.    为什么FindFirstFileW/FindNextFileW枚举DLL的结果和装载地址有这样的联系?
03.    上述两个函数是否是从类似于文件分配表这样的结构中获得的DLL信息?
04.    如果能够用上述两个函数找到DLL,能否用他们的工作原理取出DLL文件来分析?

后记:
         这篇文章总结了我们攻克“DLL中API列表获取”难关时经历的一些失败教训和有趣发现。可能有更好的办法解决这个问题。如果您知道其他方法或者对这个问题有其他高见欢迎您发邮件,指教!作者感激不尽!

编写时间:22:00:34        2008 年 03 月 15 日  星期六

修改时间:18:13:39        2008 年 03 月 16 日  星期日


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (16)
雪    币: 2604
活跃值: (64)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
2
这篇文章是放在Xarm 1.0中发布的研究文章。

Xarm 1.0是Windows CE/ARM平台的汇编开发系统。
使用ARM汇编语言调用Windows CE系统的API和COM方法编写应用程序,功能上和MASM32类似,但是针对的是Windows CE嵌入式平台。

如果有朋友感兴趣可以到谷歌上搜一下,3月份就在网上发布了。
2008-12-27 09:55
0
雪    币: 2604
活跃值: (64)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
3
在桌面平台分析DLL中的API列表很简单,因为系统DLL大多在system32目录下可以直接拷贝出来分析。而Windows CE中这些DLL是在\Windows目录下,并且由系统保护直接在模拟器上根本看不到,绝大多数API都无法访问这些DLL所以很难分析DLL内部有哪些API。
2008-12-27 09:57
0
雪    币: 2604
活跃值: (64)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
4
用户要查看\Windows下的DLL可以使用“远程文件查看器”。这个工具在EVC,VS2005,VS2008中多有。但是只能看到不能导出来分析。
2008-12-27 09:59
0
雪    币: 2604
活跃值: (64)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
5
本人最近两年主要在做Windows CE嵌入式平台底层研究开发。
包括ARM汇编、Windows CE API、Windows CE平台病毒、木马、逆向工程。做过一些Windows CE平台的概念病毒。

本论坛高手众多是很好的交流平台,希望和大家多多交流共同进步!
2008-12-27 10:02
0
雪    币: 251
活跃值: (25)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
6
楼主好强啊
2008-12-27 10:22
0
雪    币: 2604
活跃值: (64)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
7
您实在过奖了!
我只是很看好Windows CE这种通用嵌入式平台的发展,所以对她花了比较多的时间研究。
这里高手很多,还要向大家多多学习!
2008-12-27 10:39
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
8
至于这么麻烦嘛。。。去下载解决方案包,BIN都有了
2008-12-28 11:24
0
雪    币: 2604
活跃值: (64)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
9
我们现在遇到的问题是:
我想知道Coredll.dll这样的动态链接库里面有哪些API可用?我需要一份他的列表。
2008-12-28 22:43
0
雪    币: 2604
活跃值: (64)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
10
比如在没有这份列表之前我查看MSDN并不知道CE提供了取MD5摘要的API。
当破解了Coredll.dll之后发现里面有3个这样的API,通过查看PC平台的同名函数的解释,再动态查找API地址,成功实现了在Windows Mobile手机上取MD5摘要的功能。

很多未公开的功能可以通过这样的方法分析。
2008-12-28 22:46
0
雪    币: 155
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
学习。WINCE看起来好像比LINUX难啊,。。。
2008-12-29 05:32
0
雪    币: 2604
活跃值: (64)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
12
破解只是为了更深入的了解底层的东西和一些微软尚未公布的东西。
用户一般比较熟悉桌面Windows平台,Windows CE和桌面平台很相似而且很多API和桌面平台同名所以Windows CE还是比较容易。
2008-12-29 08:19
0
雪    币: 242
活跃值: (1664)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
13
WINCE没研究过..支持一下
2008-12-29 13:18
0
雪    币: 220
活跃值: (341)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
系统里有些文件是无法直接拷出来的
可以通过把ROM解开而得到所有的文件(包括DLL)
2009-1-8 13:27
0
雪    币: 53
活跃值: (280)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
解开ROM即可,直接根据厂商发布的BIN,使用专门的工具就可以揭开,以前导出过不少PPC的NK。
使用CE内核关键数据结构的地址也可以遍历出DLL的API,
http://www.xfocus.net/releases/200507/a809.html
2009-2-7 20:19
0
雪    币: 224
活跃值: (15)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
16
wince内核有调试器吗?
2009-2-10 09:23
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
17
正想了解些相关知识,谢谢
2009-2-10 12:49
0
游客
登录 | 注册 方可回帖
返回
//