-
-
[原创]防守题目提交:NNCrackme
-
发表于: 2018-5-24 12:35 2284
-
说明:纯算法题,无壳无花无ANTI,希望你不要被绕晕。
注册码:F13FE02140。注册成功后显示“Congratulation”
设计思路:
最近对人工智能比较感兴趣,收集了一堆神经网络BP算法。当前比较火的是G家的TensorFlow库,在Python下封装了大部分常见神经网络算法,比如卷积神经CNN(通常用作图像识别),循环神经RNN(通常用作自然语言识别)等等,实现起来非常简单,还有可视化的图表动态显示训练过程,很好玩。但是封装好的东西就学不到原理了,又找了一些入门级的BP源码,C语言实现起来居然非常简单,这个Crackme就是基于3层神经网络实现的加法,训练过程非常快,误差到0.003以内只需要252次训练,对于10以内的浮点数加法计算结果还是比较准确的。下面具体说一下这个Crackme的实现过程。
1.设计一个3层BP网络,输入值有2个,输出值有1个,神经元18个。(为什么用18个神经元?因为对同一样本测试了不同神经元数量,发现18个时收敛的最快。)
2.输入样本820组,样本数据见源码。(为什么是820组?因为网上的源码就是这么定的。为什么要用这个样本?因为对于随机样本,一般需要1000到2000次训练才能达到误差0.003以内,大约需要2秒多时间,但是这个样本居然只要252次不到0.3秒就到了,可能是样本的随机性比较好吧。)
3.对样本训练252次。训练过程为:
1>initBPNework()对样本进行归一化处理,即把输入数和输出数映射到(0,1)之间。
2>trainNetwork()样本输入BP算法第一层开始学习,前向传播算法forwardTransfer()用的是sigmod()函数。统计每轮学习后的误差。
3>训练到指定次数或误差小于指定值时,训练结束。
4.Crackme算法的实现过程:
1>注册码输入10位16进制字符,转化为5字节16进制数据。后面会要求注册码第6位必须为“0”。
2>分别用前2字节和后3字节初始化2个浮点数,要求浮点值为1到10之间。
3>2个浮点数作为输入值,给训练好的神经网络进行计算(即计算加法结果),得到1个输出值。
4>输出的浮点值转化为字符,检测第2位必须为“.”。
5>把第1,3,4位作为三角形的三条边,计算三角形的面积,面积大于15.5;且输入值相加的结果与输出值的误差小于0.003时,即为正确注册码。
5.采用gcc+m64编译,64位程序先把OD踢出局,不过在IDA里接近于源码显示了。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
看原图
赞赏
雪币:
留言: