前两天下了个游戏,名字叫做“咚嗒嗒部落”。感觉还挺好玩,然后就忍不住尝试去破解一下。
解压游戏的安装包,用Androidkiller分析了一下,发现这是个Unity写的游戏。
Unity的游戏肯定要找找Assmbly-Csharp.dll啊,于是把它丢进felector。开发者不用心啊,代码都不混淆,于是试着找点有用的东西。这期间试着把关卡冷却时间调成0,本地上成功了,但是服务器端还有另一层冷却验证,冷却时间只能不了了之。又更改了英雄的攻击,结果一进入战斗页面就闪退==可能是我改得不好,反正通过改dll我得不到什么好玩的东西。想了想,干脆做个挂机的软件吧。于是用fiddler抓了包,进行了相关的分析。抓包的过程不详细写了,就把分析的结果贴上来吧。这个游戏在登录时会向..54.:发包,结构如下:
..54.:/default.ashx?
MsgId=2
Sid=
Uid=0
St=
actionId=
Handler=Login
MobileType=1
PassportId=puluter
Password=密码屏蔽下qwq
DeviceID=android-0fa7feb41ece
RetailID=
RetailUser=
sign=b5eddaeec83c
然后服务器会返回一个token和一个UserID,结构如下。
{
"StateCode":0,
"StateDescription":"",
"Vesion":"1.0",
"Handler":"Login",
"Data":
{
"Token":"04cfe4f03****7b4a42fcdaf",
"PassportId":"puluter",
"UserId":,
"UserType":0,
"IsGuest":false
}
}
这个部分主要是获取UserID。然后会向主服务器(..54.:81)索取其他服务器的名称和IP地址。
..54.:81/Service.aspx?d=MsgId%3d4%26Sid%3d%26Uid%3d%26St%3d%26actionId%3d%26GameID%3d1%26Pid%3dpuluter%26sign%3d80f97b67d3a4c0dbaf3fe3
分析↑这个包,我们会发现,其实这个包信息部分是“d=”后面的那一块,一眼看出这是Urlencode,我们解码来看一下。解码后的结构如下:
MsgId=4
Sid=
Uid=
St=
actionId=
GameID=1
Pid=puluter
sign=80f97b67d3a4c0dbaf3fe3
MsgId我在一开始还以为要严格保证递增==实际上MsgId是多少无所谓。Uid是上面获取到的UserId。然后比较麻烦的就是这个sign了。可以发现这个sign是一个MD5,经过一些尝试发现这个MD5和前面的请求有关,那它到底是怎么加密的呢?这个时候我突然想起来还有个dll没有分析呢,发包加密方式肯定在那个dll里。先搜索一下MD5,然后再analyze一下这个函数被怎么调用,发现如下代码:关键部分是:
s_strPostData=s_strUserData+"sign="+getMd5String(s_strUserData+s_md5Key);
sign的值是md5(前面的那些请求+s_md5Key).这个s_md5key是什么东西?再搜一搜,最后在netwriter类里找到了它。所以我们现在得出,sign=md5(quest+"");有了sign,接下来的事情就很简单了。在得出sign之后,我们还需要Sid这个东西。它来自于与服务器的第一次交互:
/default.ashx?d=MsgId%3d27%26Sid%3d%26Uid%3d%26St%3d%26actionId%3d%26MobileType%3d1%26Token%3dbd5efee****e5b73ebcfd%26DeviceID%3dandroid-bd19f5edebdff8ff0eadcd%26RetailID%3d%26sign%3dd0b7c6affdfdc
MsgId=27
Sid=
Uid=
St=
actionId=
MobileType=1
Token=ed5ef*****5p5b73ebcfd
DeviceID=android-bd19f5edebdff8ff0eadcd
RetailID=
sign=1304e9bfc3c45fcba0dd
这个包的返回sponse里会含有Sid,我通过正则表达式获取它。然后进入这篇文章的正题:刷关。分析包得出,某个小关卡胜利前后,游戏会发送两个极为重要的包,分别是:
MsgId=36Sid={$sid}Uid=St=actionId=BigLevel={$big}SmallLevel={$small}Difficulty={$dif}
MsgId=57Sid={$sid}Uid=St=actionId=1
之前反编译的时候,其实还反编译出了一份action表:
publicconstintAddCharacteristic=0x44b;publicconstintAddFish=0x7d3;publicconstintAddFriend=0x3fe;publicconstintAddGoldAndDiamond=0x7d1;publicconstintAddHero=0x3f1;publicconstintAddItem=0x7d5;publicconstintAddOrChangeHeroTotem=0x3f4;publicconstintAddOrChnageOrClearGod=0x3f8;publicconstintAddResources=0x7d4;publicconstintAddTotem=0x7d2;publicconstintBindPhone=0xd;publicconstintBindVerificationCode=0xb;publicconstintBuyComfirmedShop=0x40c;publicconstintBuyDiamond=0x40b;publicconstintBuySundryItem=0x40e;publicconstintBuyVip=0x4b0;publicconstintChangeHeroFightQueue=0x3f0;publicconstintChangeHeroName=0x3f5;publicconstintChangePwd=0x3ee;publicconstintChangePwdByCode=0xc;publicconstintChangePWDVerificationCode=0xf;publicconstintChangeRoleHeadImg=0x3f9;publicconstintCheckBaiDuPayment=0x;publicconstintCheckPhoneBind=0xe;publicconstintCheckUCOrder=0x45a;publicconstintCheckXiaoMiPayment=0x;publicconstintClickFriendSeed=0x;publicconstintComposeTotem=0x3fc;publicconstintCateRote=0x3ed;publicconstintDeleteFriend=0x;publicconstintDeleteMail=0x41c;publicconstintDiamond10Fishing=0x;publicconstintDiamondFishing=0x;publicconstintDiamondRefashPVPTargets=0x;publicconstintDirServer=0x3e9;publicconstintDismisseHero=0x;publicconstintEatFish=0x;publicconstintFashSundryShop=0x43c;publicconstintFeRefashPVPTargets=0x42f;publicconstintGetAiBeIOrder=0x;publicconstintGetAllInfos=0x;publicconstintGetAnnouncements=0x;publicconstintGetBossDoubleReward=0x;publicconstintGetDailyTaskInfo=0x;publicconstintGetDiamondShop=0x40a;publicconstintGetEventSysInfoDta=0x;publicconstintGetFaith=0x43f;publicconstintGetFightEventSysInfoDta=0x;publicconstintGetFishBag=0x;publicconstintGetFishingInfoData=0x;publicconstintGetFoverTaskInfo=0x;publicconstintGetFriendRequests=0x;publicconstintGetFriends=0x3ff;publicconstintGetGameInfo=0xa;publicconstintGetGodChangeFaithData=0x41a;publicconstintGetHeapReward=0x;publicconstintGetItemBag=0x;publicconstintGetLands=0x;publicconstintGetLoginIn7DaysInfo=0x45b;publicconstintGetMailBag=0x41b;publicconstintGetNotice=0x;publicconstintGetOffLineReward=0x;publicconstintGetPVPInfoData=0x;publicconstintGetPVPTargets=0x;publicconstintGetRe北京最好看白癜风医院北京最好白癜风医院信息