想写一个自己的crackme很久了,委实下不了手。于是这段时间看了些密码学的东西,有所悟,感觉能连在一起便写点东西吧。
介绍下散列函数,说得直白点就是将一段内容变成定长的另一段,假设明文为a,密文为b 那么有b=f(a)。这个F就是散列函数,当然了这个说法相当的相当宽泛,任何对内容的处理几乎都可以这样来表白,但是,散列的这个F便有些不同的地方,第一,他没有参数,不像其他的加密方式,会带有参数,也就是人们常说的密钥,也就是要表示成b=f(a,x,y...)这些xy便组成了单个或者一组密钥。再者,F必须要满强碰撞理和弱碰撞。这个两个又是什么意思了,打一个通俗的比方,比如明文是一做连年失修的房子,你随便动个地方房子就倒了,不可能存在说推了东墙能在西墙上给补上,而且房子倒之后你都看不出来这倒下去的一堆东西以前是个房子。再者,不同的房子在不同的地方碰他下,他倒下之后的一堆东西都不一样,而且差别很。然而。如果说最后f求得的b用两位来表示,也就是说,结果就四种可能,那么,无论房子怎么倒,就只能倒这四种可能。如果结果用200位处理,那么有2的200次方大小,这是个人类难以企图暴力破解的高度,虽然根据鸽巢原理,要无限的消息中总会有相同的,但是对于加密来说,足够了。但是,又不是越长越好,长了对计算时间又有要求,不能在实现时间内完成处理,因此要找一个折中的方案。
又想到自己准备写一个crackme,我想了很多种方案,站在一个逆向者角度来思考,怎么样才能把自己给难住,那么自己能想到又会被自己给破解。用异常?自己写的异常自己当然知道自己处理, 该NOPNOP,该跳到异常处理也不含糊,复杂的加密?自己的写的算法我还真信不过。又想到想要写点真正能难住的,还必须写汇编原码,毕竟汇编对内存操作上有时候还是对C略胜一筹,虽然我现在觉得C已经很接近汇编了。但是,我又想到,如果用汇编,如果我一行一行的写出来,为什么别人不能不能一步步跟出来。就算是一步步步入,最后被破解也是时间的问题,问题就在于分析汇编的时间和我写汇编的时间,假如我要花一天的时间写一个程序出来,那么别人很可能花一个小时就能破解,毕竟写比看花时间少多了。那么对于加密人员来说,这无疑是致命伤。因为破解逆向人员花的精力永远比你少。反正就是拼吧,也看能不能找到那个阀值,一个逆向人员可能花一天,两天,一星期来破一个壳,也许在最后马上成功的时间放弃了,那么加密的目的也就达到了。面对多如牛毛的汇编,无论是对逆向人员还是加密人员来说都是挑战,都是伤脑筋的事,高手过招,又说讲究的是内力。如果有人花大把钱来请专门人员破解,那么逆向人员有了动力,也就更加卖力不知疲倦。若是只是像我一般的入门级别的,放弃是很轻松的事。就像是去商店买东西,对商品需求强烈那么就是卖方市场,可就由不得你了。逆向人员和加密人员都不知道对手会是谁,我拿到一个软件可能是集了对方一个公司的力气加密而来。然而也有可能对手是一家安全公司。世事而不得知。所能做的只是加密加密再加密,然而又涉及到人力成本问题,在软件投放市场的那时候也是在搏。
考虑到给对方加分析成本这是双方都在探讨的问题。我曾想过,用高级语言来写crackme特别是用了一些框架。这个.net不在中,典型的比如mfc,mfc导出的函数也没个字串全是序号,导致可读性极差,大大加高了分析成本。然而对于逆向人员来说,破壳,又有高手提出来过著名的esp定律,给破壳的门槛降了不少。现在又是虚拟加密的时代,软件保护又进入ring0。转战各地,杀得我的windows里焦外嫩。
这不是几句话能讲清楚的事,一个漫长的博弈过程,有人说以前没有病毒加密,只有功能,也没有加密,有了想自己改软件的人就有了软件保护。专心务实的学点东西比什么都重要。