简单介绍一下背景,本人之前是一个Java/C++开发者,没有任何破解经验,一个月之前开始尝试破解一个网络验证机制,刚开始查资料,熟悉OD,甚至花了一周来学习汇编语言,把王爽的书看了一遍,但让人啼笑皆非的是,我却还没有找到真正的算法逻辑,我已经无计可施,只好发到看雪上来,不说跪求,但也差不多了,下面我详细介绍这个算法机制。
流程是客户端发送http post到服务器,里面主要是一个xml数据,其中最重要的是一个叫做kbsync的值,如果这个值不对服务器就拒绝相应,网上有人说是RSA+BASE64算法,但不一定是标准的,下面是我的一次抓包:
<key>kbsync</key>
<data>AAQAA3pub3OF9pcJYTOg3hyiF6Qzv2/yoGxGO0ZEW0NYMAoLPZHiuGJYQmupeAVTLPV+ 9viJ3Ual4gxxBIhRoDulmSjFE1cTVwTJkL8uw8ImxdsPzHGEz73LD79AbxTVHAkLxt2P Fs3D8UZVdMrdvXtUW51vHnibEt70PigzYKIWHbPCCDjTxFFayXidTf8eli8LwYO6uooI eSVoPpsBDQRl1qyTvk7DQb/NtNnQcmhL7XRlzvdnDbUInVX4550pT1SIwg==</data>
我不用传附件了,其实就是apple itunes(最新版即可),上面的数据就是我下载免费app的时候抓的包,没有壳用OD附加都没什么问题,但问题就是我还没有找到生成kbsync的算法逻辑,一般人能想到的步骤就是“查找所有参考文本字串”,输入“kbsync”:
5DF22CE3 50 push eax
5DF22CE4 8B4424 24 mov eax,dword ptr ss:[esp+0x24]
5DF22CE8 50 push eax
5DF22CE9 51 push ecx
5DF22CEA 52 push edx ; ntdll_1.DbgUiRemoteBreakin
5DF22CEB E8 109C6300 call iTunes_2.5E55C900 ;这个方法里面非常复杂,参数好像都是常量,不变,但里面好多jmp,根本不知道在干啥,但经它处理过后的第7个栈中的数据是给下面ecx赋值,非常关键
5DF22CF0 83C4 1C add esp,0x1C ;恢复栈,为下面ecx赋值
5DF22CF3 85C0 test eax,eax
5DF22CF5 75 28 jnz short iTunes_2.5DF22D1F ;不跳转
5DF22CF7 68 D010BF5E push iTunes_2.5EBF10D0 ; ASCII "kbsync"
5DF22CFC FF15 9009AE5E call dword ptr ds:[<&CoreFoundation.__CF> ; CoreFoun.__CFStringMakeConstantString 处理key
5DF22D02 8B4C24 04 mov ecx,dword ptr ss:[esp+0x4] ;给ecx赋值,给下一个call传参数,值是乱码,根本不是那堆字符串,但也不排除是另外一种数据表现形式
5DF22D06 50 push eax
5DF22D07 8B4424 0C mov eax,dword ptr ss:[esp+0xC]
5DF22D0B E8 8037BDFF call iTunes_2.5DAF6490 ;这个方法是将kbsync作为key,ecx作为value放入字典中,后面发送http之前调用C:\Program Files (x86)\Common Files\Apple\Apple Application Support\CoreFoundation.dll中的一个方法,这个方法将字典的数据按照key和value的对应方式转换成xml数据,然后发送给服务器。
上面的注释不知道我的理解有误吗,有误的话还请高手帮忙指正,之所以迷茫,主要是因为之前看雪有篇文章提到过这个算法:
http://bbs.pediy.com/showthread.php?t=150224
但fosom的解答非常粗略,我按照他提供的线索,比如根据CFStringGetFastestEncoding,memset下的断点,甚至连内存断点我也尝试好多次,最终都以失败告终,找不到真正算法的逻辑,也没法用IDA仔细的分析了。
我知道破解这个东西不是一天两天就搞得定的,但我已经搞了一个月了,心里很着急,可能是小弟走进了死胡同,还请各位高手给小弟指条明路,帮忙用OD看看这算法
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)