玩心未泯

卡尔斯希普拉斯

C++博客 首页 新随笔 联系 聚合 管理
  19 Posts :: 0 Stories :: 98 Comments :: 0 Trackbacks
       近日接到一个wince外包项目,要求我给他的软件提供License控制,本来这个问题很容易解决,如果有源码的话,只需要在进入主程序之前进行license校验就可以搞定了,然而要命的就是他没有源代码,要求我直接对其exe进行加密。
      
       这可是有点难度的,之前我也没接触过汇编,更没有仔细去研究过PE文件格式,想起来还是觉得很有挑战的,不过我这人就喜欢挑战,没有挑战,怎么能促进自己学习呢?首先从原理上对这个实现进行一下分析:
       1)Wince上的可执行exe文件,也是遵从PE文件格式的,这个以前我略有了解,加密解密不知道这个文件格式肯定是不行的。要实现对现有的EXE文件进行加密,先进行License校验,再根据校验结果判断是否转到主程序代码,从汇编的角度来说,就是我自己要写一段代码来完成License校验,然后判断结果,使用条件跳转指令来控制是否跳转到原来的主程序入口点继续执行,而我自己写的这段代码也就是ShellCode了,病毒、黑客技术中这个词出现的就多了。对于PE文件而言,就是要把我的ShellCode(包括根据结果判断跳转的部分)加到原来的EXE文件中,并且更改原EXE文件的入口点地址到我的shellcode处。
       2)我自己以前没接触过汇编,这下段时间内全部用汇编完成License的校验代码,显然是不那么容易的,我选择了折中的办法,准备在我的ShellCode中去加载一个DLL,而License校验就在DLL中实现。虽然这种方法很容易被破解,暂时也只能是采取这个权益之计了。
       3)ShellCode中要使用到一些API函数,因此必须找到一个办法,在系统内核的地址空间内定位到这些API函数。

       根据上面的分析,就把主要的任务分成了三个部分,第二个部分对我来说是最简单的了,随时都可以完成,因此我把它放在最低优先等级,我只写了一个空壳dll可以用来加载作测试。那么接下来我们要做的就是1、3,pe文件格式的资料还是很多的,我想这个也不困难,而关于如何在系统地址空间内定位API函数地址的资料,就不那么好找啦,Windows下面的可能还好点,WindowsCE下面的我还没看到过。于是我决定从这里入手,如果这关过不去,我就不用再做别的事情了。

        经过搜索,关于定位WinCEAPI函数地址的资料,几乎都出自一篇Hacking Wince的文章,虽然还有《WinCEAPI机制初探》等中文文章,其实都是从Hacking Wince中间转出来的。Hacking WinCE是篇英文的,大家可以在网上搜索了看看,文章写的还是比较详细的,根据文中的方法,先定位到KDataStruct结构,然后再顺藤摸瓜往下找,虽然很复杂,但确实可以定位到API函数地址,但是这时我犯了个错误,就是我在这篇文章中只看了一下它的实现原理,和它的C++语言的实现,没有去读它的汇编实现,因为我不懂啊~我也照着他的C++语言实现自己写了一遍,调试了一下,基本上了解了是怎么一个过程,然后我就开始学习汇编了,而我犯的错误就是从这里开始,我到处找来的汇编资料,然后先了解汇编有哪些指令什么什么的~最后照葫芦画瓢,写了一段汇编代码实现上面的过程,到头来要编译了,才想起来,貌似我用的是8086的汇编,而在WinCE上似乎不是用这个,因为大部分的嵌入式设备采用ARM处理器,所以一般写wince上的汇编代码是用arm汇编的,这个时候我才发现我走错了路,赶紧回头找了arm汇编的资料,arm汇编的资料也不甚多,一个chm的文档而已,看了一下,从寄存器开始都和8086的汇编不一样了,然后仔细学习了一下。最后好歹还是让我给写出了arm汇编的代码,在我的HP2790(windows Mobile 2003)上运行正常,这时候真的是兴奋的不得了了。急忙联系给我外包的老大,让他试试看这段代码在他设备上能否成功加载dll,结果却是令人遗憾的不可以。

        为何不可以呢,我又回到Hacking Wince上去,我记得当时看到这么一段,但是当时没有认真去研究,KDataStruct的定位方法是不能在User Mode下使用的,因为要访问的是系统内核的地址空间,在User Mode方式下是禁止访问的。而作者之所以这么用是因为PPC上应用程序都是以内核模式运行的,所以可行。但是老大说他的PPC上也运行不了,后来问到他的PPC操作系统是Mobile5的,看来Mobile5的应用程序也不再是以内核模式运行了,我用VS2005打开Mobile5的模拟器试验了一下,从寄存器上看到的果然是用户模式,而在PPC2003的模拟器上,同样是用户模式,看来这方法行不通了。

        好在Hacking Wince上介绍了另外一种方法,就是SystemCall的方法,这个方法呢原来就是wince系统会开辟一片地址空间0xf0000000~0xf0010000保留不使用,而当执行到这个地址空间的时候,会引发一个异常,然后系统再根据这个异常处理判断是否引发一个API函数调用,每一个API函数都根据一定的算法映射到这片地址区域(详细算法请自己阅读Hacking Wince,我可不想剥夺你学习的乐趣,也不想因为我的错误理解误导你:P)。这个方法的好处是比前面所讲的搜索的方法更高效,而且用户模式下也是可用的。于是乎我又用这个方法实现了我的ShellCode,然后费解的是,我使用的arm汇编指令stmdb,只要后面跟的寄存器写成{r0-r4}这种形式,在mobile5上运行的时候到这一步就没反应了,实在是非常的费解。不过我想那位老大跟我说的他的设备是基于Wince.net 4.2 Core的,也就没在这个问题上花功夫(实际上我后来绕过这一步,到了后面的SystemCall调用的部分,在Mobile5上也出现问题,貌似这个SystemCall的方法只能在WinCE4.2中使用)。完成了shellcode,但一时没能联系上给我外包的老大,所以就动手做下一步了。

       最后一部就是研究PE文件格式,把我自己的ShellCode“感染”到EXE中间去,这个涉及到一些病毒技术,我就不多说了,网上这方面的资料也不少。我也轻松实现了这一步骤。

       而所有的一切在我的PPC2003上运行正常之后,终于联系上那个老大,程序发过去被认为是病毒隔离了,预料之中,可是放到他设备上还是运行不起来,那就是预料之外了。终于这老大要求的时间也到了,咱做的东西又没实现功能,估计这老大对我失望了,不理咱了~唉~~~~

       这次的学习过程还是让我了解了不少东西,虽然这外包最终还是失败了,但还是不觉得亏,毕竟一周的时间里,因为这个外包的压力,以及求知的兴趣,让我看到了很多之前有时间却没看到的东西。不过整整一周都没好好陪老婆,老婆大人还是蛮有意见的~~:P
posted on 2007-06-26 11:04 SuperPlayeR 阅读(1942) 评论(4)  编辑 收藏 引用 所属分类: WinCE/Mobile应用开发

评论

# re: 学习Hacking Wince 2007-07-06 14:01 SuperPlayeR
这次的最大收获是入门了汇编,感觉又增加了不少新的见识。  回复  更多评论
  

# re: 学习Hacking Wince 2012-06-03 20:08 cjh
佩服,学习能力这么强。看你真是领会了学习的乐趣了  回复  更多评论
  

# re: 学习Hacking Wince 2012-06-18 11:34 kerlw
自己都忘记自己还曾经做过这事了,哈哈哈,老了。  回复  更多评论
  

# re: 学习Hacking Wince 2013-08-28 21:39 liuhui
嗨,我们有wince系统搭建,有兴趣吗。  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理