rootkid 发表于 2015-6-14 21:23

新手第一次逆向破解C#软件 图文并茂

[为什么写这篇文章]
   在这里受益于论坛里大神的文章,我只看到了第三节,就是前三个教程,学会了OD一些简单软件和如何去绕过验证机制的方法,想亲自试一试,恰好,有朋友让我来试试这个软件,联网破解的,我就试试了,作为小白的我花了很大的劲才把它搞定。
   第一次发帖,如有不规范的地方,版主请直接提出来。我一定谦虚接受,谢谢。
   这属于我的处女作,当然存在很多的问题,希望你提出不同的见解和评价;当你是一位喜欢阅读的朋友,希望你能够静下心来,慢慢阅读,浮躁与焦急总是我们思考问题的阻力,你要坚持看完相信你有不少的感悟和收获。
如果你觉得还不错,记得评分一下哦,谢谢!
    总之,谢谢你读到这段话的朋友,接下来我们将进入正式的逆向工程之旅中。


[目标概述]
   本次是对一个不知名的软件,基于保密要求,我用AShell来代替他的软件名。它的主要作用是输入用户名/密码后进入软件界面,在软件界面上和网站的接口进行数据对接,当别人对网站进行数据补充或者修改时候,软件能够实时监控到数据流的动向(PS:数据流我又想起了工程师)。不过这个AShell软件比较麻烦,要去购买一个账户才能登录,账户是试用的,只能用一天,通过修改本地时间是不行的,因为服务器时间会与本地时间进行对比,而且,用户名和密码是联网验证,也就是传输到服务器,服务器进行对比后返回TRUE值回来。我擦勒,这可就难了哦,那么我们现在需要做的是:


1>逆向它的登入口,实现任意账户登录
2>逆向软件使用时间,把软件使用时间调整到2099


[准备工作]
凡事预则立,不预则废。我们在做逆向分析之前要有充分的理论功底和强悍的分析工具,因为自动化工具可以帮助我们解决很多人脑无法解决的问题,也能节约不少时间,本次的逆向主要有这几个工具:
1> OD专版软件
2>PPId加壳检测软件
3>.NET Reflector 8.5
4>Reflector插件
5>DotNET Reactor工具
6>De4dot
7>NETUPACKER
需要的理论基础有:
1> C/C#基础,当你要逆向一个东西时候,你必须要了解正向编程。
2>汇编代码的阅读
3>工具软件的使用方法
4>inl文件的操作方法


[第一步:初次分析]
拿到这个软件了,首先去用用,去注册玩玩,看看他的大体样貌,做到心里有数。现在就是本次的软件的截图。可以看见:需要输入用户名和密码,才能登陆,看这个界面,你的第一反应是什么语言写的呢?不外乎就两种哦,C++、C#,语言的不同我们会采用不同的分析思路的,那么究竟是什么语言写的呢,我们首先要明白,其实很简单,除了用工具检测,还可以放在虚拟机(xp系统),由于C#需要.net平台支持,那么如果在虚拟机里面提示错误,显然!,它就是C#了。不巧的是,通过社会工程学,我得到了作者给出了他的介绍,说需要安装.net平台才能用,那我只好肯定喽~OK,我们知道了它是.NET2.0,那么接下来就要采用.NET的逆向方法了。其工具就是我上面介绍的那几个,作为一位开发人员,都知道,软件肯定会加壳的,除非是beta版本,显然!这个软件我们应该去检测一下,有无壳,用什么工具呢,当然是神器:PPId加壳检测软件 ,(这个软件是位大牛开发的:小生我怕怕),看来大牛都很谦虚嘛。通过这个工具我们获取到这样的信息。如下图蓝色的。我们可以看出来是加壳了的,怎么看,百度下就好。那么这就麻烦了,加壳了怎么去脱呢?我们看到这个软件,做工一般,可见加壳技术也不是很难,先用工具去脱。



[第二步:脱壳]
软件的加壳与脱壳在这里不赘述了,知识太多了,你可以查阅资料然后简单了解下,加壳相当于压缩,脱壳相当于解压。好了我们就通过一个软件去脱壳它,但是我们还不知道脱壳工具是哪个呢?NETUPACKER这个工具我们派上用场了,脱壳可以手动,也可以工具,对于这种简单的我们可以选择工具脱壳,手动的话我完善好了可以写一篇文章。 脱壳技术是一位逆向工程师必须要掌握的技术,不能因为外表漂亮就把自己迷惑了,其实剥离之后,软件内心很纯洁的。所以要有耐心去脱。好了,我们现在看到了已经脱出来的软件了,仔细看看,只是大小不一样了,为什么不一样,我刚说过的哦,不告诉你~好了,这个文件我们暂时名:AShellClean.exe.如下图:脱壳之后出现的EXE,好了,这个脱壳完毕了,我们看到了真正的EXE,下一步,我们进行反编译。



[第三步:反编译]
反编译工具,我们请来了.NET Reflector 8.5 这位大师兄,首先加载这个CLean.exe文件,不能加载原始的文件哦,元素的文件加壳混淆了的,你看到的源码全部都是乱的,乱的你眼镜都可以花,特别是变量名都可以变来乱码,那看毛- -,所以,一定要注意不能加载错误了!现在我们看它的源码截图,这个是反编译出来的源码,我们只能观察,不能修改,也不能运行编译,因为编译需要一个环境的。见图。这就是源码,不过这个源码我们还不能动,只能看,看有个P用,当然要分析修改了,那么怎么办,我们用上了Reflector插件 ,这个插件安装上软件后,可以支持VS查看源码,这样就更加便于我们的分析了。下面我把登录部分的代码截图进行分析。下面是一些逆向软件使用期限的分析过程。



由这段代码我们可以看到,输入了用户名和密码后要进行MD5加密而且混合了字符串里面的个别字符一起加密传到Config文件里面进行对比,这就麻烦了,本地图片,请重新上传我们这是联网验证!这一步不能跳过的,跳过了当然就返回不到数据,这个返回数据返回了true以及使用时长,还有MAC绑定情况,因为这个软件不能两个机器使用,只有一个机器绑定使用。既然这里不行,我们仔细研究下面的代码。


红色部分的代码我想你已经看懂了,不外乎就是对本地时间的对比,然后框框里面激活Result窗口本地图片,请重新上传,那么我们把这行代码做一些改动,将base.dialogResult = OK,提到if之外,让第二个窗口始终处于激活状态,那么我们可以把这部分绕过了,这样的话,就算我们的使用期限过了,我们仍然可以正常激活窗口。到了这一步,你是否想到了,可能不止是Login这里有登录窗口的检测呢,其他地方呢,好了这个问题我们告一个段落。

[第四步:任意用户登录]
同样的道理, 我们把用户验证的代码找到,然后把这段代码注释掉,或者跳转了。这就达到了任意用户名的目的。这样的工作我们似乎做完了,不过还有更加重要的,这些代码如何修改后编译回去呢,目前我们只有YY一下,所以我们继续下一步。



[第五步:使用DotNET Reactor]
既然我们要编译回去,那么我们就有两种思路:一是拿到"源码",这个后面介绍。要么直接对其操作,所以DotNET Reactor这个工具可以帮助我们去完成这个艰巨的任务。DotNET Reactor它能够带着我们去"把exe反编译为il类型的文件",然后通过VS查看后修改,最后再把il编译回来,这个过程是很难的,需要很多的理论基础,il会用了就很方便,但是也许就和汇编一样,过于底层,导致写代码特别困难,你想想,那么多的if else 在底层的已经醉了,还怎么想去修改il,不过,我仍然去试了,而且绕过了一部分,不过由于突击学习的il,掌握不熟练,导致后面的功能都不能用了,显然!不能达到我们的预期效果,把软件都逆向坏掉了。


那么我们就只能想办法把源码搞到,然后重新手工编译一个,因此,我用工具把源码自动导出了。工具就是 反编译工具自带的,直接拖出源码。

这里,我需要提醒的是:这个做法我是第一次,不过考虑到但是都1点过了,而且,源码很多,我有没有能力去弄好呢,果然不出所料,到处的源码是很乱的,乱的我都不知道自己姓什么了,乱的我连变量名都看不懂什么意思,全是string_1这种形式,由于阅历太浅,不知道是代码混淆的原因,还是作者本身写的很乱。后来我苦苦研究了N久,终于研究出了一些逻辑关系,所以呐,这东西你一定要静下来去搞,你要去揣摩作者的实现逻辑,要不是根本看不懂他怎么写的,更别说从哪里下手了。好了,代码找到了,不过作者的开发环境和自己的环境是不一样的,特别是这个还牵涉到网页交互的问题,WEB控件也存在里面,各种VS报错,10个ERROR,7个WARNING,瞬间就亢奋了,因为这是我意料之中的,作者在开发过程中使用了很多类库,比如UNTITY库,还有JSON库这些,有了这些才能和特殊的网站数据对接起来,做到这里,我也是醉了,只能通读代码,一个一个改错,在面对对象设计过程中,BUG是很麻烦的事情,因为,牵涉的关系特别复杂,你改对了一个,另外一个又错了,瞬间,我就采用了排除法,把ERROR地方做一些注释,先排除简单的,然后再去解决难的,此时,已经凌晨2点过了,仍然继续奋斗,奋斗接近三点时候终于搞定了,完成了所以ERROR排错,期间把各种搜索引擎都启动了,因为排BUG时候遇到的问题太多了,漫漫bug路,都没想到真的可以弄完。上图。很顺利!再一次编译回来了,效果和原版的效果一样。



[第六步:手动查找修改代码]
前文已经介绍了,检测机制存在很多地方,代码也很乱,我们去查找相关的检测函数,比如resultdialog这类变量,还有提示框出现过的,比如XX时间过期,我们把“过期作为查找项”整个sln里面查找,把相应的时间修改到2020.10.10,为什么不修改到2099,因为我发现网站的证书有效期达不到2099,太长了,软件会给出太多的验证提示,这是因为我们访问的是支付网站,这里不透露哦~好了,改到这里也就算是一个段落了,下面贴上修改之后的源码。你看界面我们都获取到了,你现在可以做你想做的事情,界面、代码都在逆向在你手里了,想怎么搞就怎么搞了。你看我把界面都修改了,完美版的软件哦~




[第七步:编译运行源码]
现在和之前的界面对比呢,多了[完美版三个字],现在可以实现了
1>任意用户登录
2>无限期使用时间2020年呢,其实这是个BUG,我绕过了联网验证代码,结果时间没法更新了,无所谓,知道是永久就行了。

[结束]
至此,凌晨3点半了,两个功能完成了,历时6个小时。也算是逆向系统处女作完成了,非常开心,比考试不挂科还开心,哈哈~

[感想]
这是我第一次尝试逆向工程,之前一直没有接触,唯一一次在看了三篇大神写的简易教程,教程一共加起来不过400字吧,然后几幅图,看到了跳转语句的反汇编,当时是针对C++,这次是C#,也是一次伟大的尝试,而且成功了。后来想,很多事,我们不去做都觉得遥遥不可及,努力去做了,不在乎时间,不在乎孤独,获得的是内心的丰盈,这是我第一篇逆向工程文章,我很用心去写,希望读后的你也能将你的所见所闻通过文字与大家分享交流,只有这样世界才不孤单。

如果你觉得还不错,就评分鼓励下小白哈~~~我会继续努力,多写文章分享!
http://attach.52pojie.cn/forum/201502/11/102621i33e74zxnxifeedm.jpg












顶级流氓 发表于 2015-6-15 00:23

rootkid 发表于 2015-6-19 19:41

smile1110 发表于 2015-6-18 23:14
关于拖壳这一点我觉得完全没有必要了,带壳调试吧,这是vmp壳 .net反汇编,还不错的样子,俺觉得你修改那个 ...

大牛~毕竟才开始,不知道也可以带壳调试,觉得必须把壳over了才能反汇编。学习了~

KevINBy 发表于 2015-6-14 21:31

看起来还不错

rootkid 发表于 2015-6-14 21:46

有人问:之前图挂了怎么是QQ空间的,我现在给出答复:因为我的QQ空间同步发布,排版整齐,我就直接转移过来了,想不到图片是不能转出来的,只好自己手动换一个工具截图下来传到这里。对于恶意攻击的言论,不予理会。

Norton 发表于 2015-6-14 21:48

楼主给力

wylgogogo 发表于 2015-6-14 21:59

   不错,又天赋。比我还来得晚,这造诣不错。

wxmyg 发表于 2015-6-14 22:23

支持一下楼主

2505068035 发表于 2015-6-14 22:56

赞一个,学习了!

rootkid 发表于 2015-6-15 00:05

2505068035 发表于 2015-6-14 22:56
赞一个,学习了!

多谢你的支持,好东西大家分享~

rootkid 发表于 2015-6-15 00:10

wylgogogo 发表于 2015-6-14 21:59
不错,又天赋。比我还来得晚,这造诣不错。

大神多多指教哦~我也才入门,连OD都不熟练使用...

rootkid 发表于 2015-6-15 00:11

2505068035 发表于 2015-6-14 22:56
赞一个,学习了!

可以呀,一定要分享~
页: [1] 2 3 4 5 6 7
查看完整版本: 新手第一次逆向破解C#软件 图文并茂