例子还是来自与加密解密第三版,具体来讲一下自己怎么解决这个例子的方式
例子传送门:链接:https://pan.baidu.com/s/1L3izhMo4Ft1vkMMQSaLI8w 密码:93ub
一些软件在运行时会向一些服务器发送获取关键数据的请求,当获取数据后才能正常运行,这就是网络验证技术
拦截软件与服务器之间交互的数据包就尤为关键
我们现在OD里面运行例子CrackMeNet.exe,看看有没有合适的地方下断点
在OD里函数表里没找到合适的,猜测应该是没识别,我们放到IDA里看一下,果然
看到了一对recv和send函数,很符合服务器和客户端的风格,处在的地址是4019C6,我们在OD里再次搜索
发现send函数被显示为#19,我们在函数表里跟踪#19
终于找到了,找个函数都这么累,不容易啊……
我们在数据窗口中查看Data,乱码应该是,反正我看不懂,应该是加密过了
我们来分析一下加密代码段,首先我们要找到加密代码段
怎么找呢,第一肯定在send函数的上面,其次肯定要在输出字符函数的下面,没输出怎么加密,我们在IDA里慢慢网上拖
看到两处GetDlgItemTextA,可以猜测这两处分别输入了用户名和密码,那么我们从40150E开始分析
我们可以看到两个strlen函数,基本可以猜到就是分别求用户名和密码的长度,然后有一大堆赋值操作,而且是往连续的地址在赋值,可以清楚的看到软件在拼造一个数组
数组实从[ebp+buf(354)]开始的,第一个元素是用户名长度,第二个元素是密码长度
第三个元素大家如果对位运算不熟悉可能会有些理解上的问题
直接说明一下这里的操作
先定义time(0),并且srand(time(0)),定义rand函数的种子,然后执行rand()
and eas,800000ffh的作用是,rand()%256,然后跳转到401558
那么很清楚了,第三个元素就是rand()%256
接下来还是两个memcpy赋值操作,分析得第四个元素是用户名,第五个元素是密码,整个数组分析完毕,这就是程序向服务器发送的完整数据(其实数组建立好之后,还有一个异或操作,大家可以看一下,我刚开始也遗漏了)
接下来就是分析客户端程序接收回服务器数据后的处理过程了,同理,设置recv函数断电后,开始分析
其实分析接收的数据,我们先要找到接收的数据放在哪里了,要是是明文,皆大欢喜
慢慢往下分析,是可以看到把数据放在41AE68的(先不要管上面的解密异或操作啦,找到地址先)
在IDA里41AE68发现数据是空的(毕竟是静态的,没接上服务器),我们在OD里看一下
因为所有解密操作都是对这段数据进行的,我们是要在代码中找出所有读取这里数据的代码就好办多了,我们对41AE68下内存读断点,找到定位代码
这样的方法很可能会遗漏,毕竟不一定只有一处读取了数据,断点是难以区分的
我们用IDA的getasm.idc脚本可以找出所有读取41AE68的代码段
以上我们基本把网络验证的流程都分析完了,**的方式大家应该也有思路的吧
1、将截取到的正确数据放置在程序的41AE68h处
2、消除send函数和recv函数(直接用跳过指令就好了)
3、跳过解密代码段,我们已经知道现成的数据了,不需要解密了
4、把error提示框消除,这个我们可以在OD里面搜索字符串,然后吧函数消除或跳过即可
总之,这是一种在获得数据后,直接修改自身程序,而不需要和服务器再连接的方法,是比较有趣和管用的