网络验证的目的是:将关键数据放到服务器上,从服务器上取得数据后软件才能运行。拆解的一般思路是拦截网络返回包,分析程序是如何处理数据包的。
当一个连接建立后,就可以传输数据了。常用的数据传送函数有 send()、recv() 两个 Socket 函数,以及微软的 WSASend()、WSARecv() 。
在书上给的例子中看一下:
首先需要注意的是,这个程序和上个程序类似,也是基于按钮事件触发的。直接上 IDA 看是最简单的,可以看到相应的函数,然后在 x64dbg 中调试。
首先会对服务器进行连接,连接失败则:
若连接成功,则程序会将信息(按照 字符数1+字符数2+随机数+字符串1+字符串2 )发送给服务器,并执行 Sleep()函数,然后再执行 Recv() 函数,接受服务器的返回信息:
返回成功后 eax == 5A ,并会接受服务器的返回信息,然后进入一个循环,总共循环 5A 次,即将返回的信息全部与 6E 进行 Xor 运算,并存储到 41AE68 开头的地址中:
然后依次与特定位置的值进行对比,都不跳转,即验证正确:
因为数据包会发送到服务器进行处理,导致返回的数据难以猜测是如何加密的,因此分析客户端加密方式的意义不大。
可以直接使用 jmp 指令跳过该程序验证阶段或者不执行,或者修改 host 文件(以域名访问服务器) or 在 inet_addr() / connect() 处下断,修改 ip 地址,自己编写服务器并返回值。