-
-
[原创]第二个CM的制作过程及源码和注册机
-
发表于:
2010-1-18 22:29
6950
-
CM地址:http://bbs.pediy.com/showthread.php?p=747497
非常感谢坛子里还有人关注我的CM,说希望看源码和制作过程。本来不想发布源码的,因为觉得保护手段太弱了,想了想还是发布的好,以后我发布的CM会都在2个周之后发布源码并附一些简单的说明。本文没有丝毫的“高科技”,都是一些很菜很菜的手段,有自己想的也有参考别人的,高手就当看笑话了,哈哈
本CM参考了xiager的【原创】一个高难度CrackMe的制作过程,的一部分的思想。
(1)算法
有不标准的base64算法, blowfish算法,MD5算法,还有一些自己乱想的算法,那个时候还不会RSA算法,第三个CM才用到了RSA算法。
(2)动态反调试
开了2个线程来相互验证,只要发现另外一个线程出问题了,就执行自删除的代码退出。为了防止破解者直接nop启动线程的函数,我故意让一部分的解密操作在线程里执行,这样如果你让线程不执行的话就不能解密了。
(3)静态反调试
这个静态反调试主要是用Hex编辑器配合OD来操作的,非常非常低级,而且制作非常麻烦,我的这个地方做的很简单很低级,没什么参考价值了,不会的只学方法就好。因为你有静态反调试就必然要把关键机器码进行加密,而执行这个机器码之前要进行一个解密的动作,这时真正的机器码就浮出水面了。
(4)制作过程
A.调用一下用OD修改用到的加密函数和一些用到的空间的地址(本人逆向水平太菜,这样我就知道函数地址和空间的地址,方便我用OD修改,高手完全不用那么做)
B.无聊的一些循环,哄小孩玩的
C.检测线程状态,发现异常就执行自删除,退出
D.获得机器码和注册码,用SendMessage,就不用常规的GetDlgItemTextA
E.简单判断一下注册码是否合法(时间校验),加解密要 PostThreadMessage
F.简单判断一下注册码是否合法(自身MD5校验)
G.blowfish 加密
H.base64加密
I.MD5加密
J.再次检测线程状态
K.最后的判断是否成功,
L.显示成功消息,显示字符串是简单的加密处理的(eg。倒序等等,自己随便想),用OD直接查找字符串是查不到的
用OD做静态反调试的版本:
第一阶段加密
版本001 原始 (能否正常注册成功 √)
版本002 去掉按钮里面的MessageBox,和定位用的代码 (能否正常注册成功 √)
版本003 填充nop空间,修改一下jmp,(到004026DD) (能否正常注册成功 √)
版本004 修改jmp和后面的空间(00407723C)代码 (能否正常注册成功 ×)
版本005 UltraEdit修改PE文件 00407400部分 6个加密点组成的60个字节,
然后用blowfish算法加密,生成的64位密文(能否正常注册成功 √)
版本006 修改004026dd开始的6个加密点,每个地址开始的10个字节进行随机填充
(能否正常注册成功 √)
第二阶段加密
版本007 将我们的call修改为跳转,跳到 00407386,同时平衡好堆栈 (能否正常注册成功 ×)
版本008 修改00407386的代码,简单算法加密三个地方,
①blowfish密钥设置代码②第七个加密点③第一阶段的加密跳转(能否正常注册成功×)
版本009 用UltraEdit修改PE文件使其正常运行 (能否正常注册成功 √)
版本010(完成) 发现不具有动态反调试功能,修改了一下 (能否正常注册成功 √)
注册机部分就很简单了,自己看源代码就ok了,另外为了OD手动添加的代码具有可写可执行属性(有的Section段不具有可写可执行属性)我在编译器(vc6.0)里面的Link选项-》Project Optios里添加 /section:.text,rw 当然也可以在编译出可执行文件之后用LordPE等工具修改Section段的属性。
总结:其实这里面(3)静态反调试最麻烦,出一点错误都不行,要非常小心才行,我做这个部分至少做了10次才成功。
ps:有看不明白的跟帖说明,我会给出解释。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!