「贪吃蛇大作战」的刷分尝试

昨天同学推荐了一个最近比较火的游戏「贪吃蛇大作战」,今天已经到了 AppStore 总榜第二的位置。这两天一有空就会掏出手机玩几盘,不过无尽模式玩到 3000 分左右就遇到了瓶颈,于是怀着单纯的目的想研究下这个游戏的接口… 使用 Charles 抓取请求 既然是研究接口,第一步就是看看接口的 URL 和参数返回都是什么了,请出神器 Charles。 通过 Charles 可以清楚地看到,游戏提交分数的接口和参数,至于返回,貌似没什么用。接下来仔细研究下请求,有几个参数能比较容易的判断他们的含义和作用。 device_id: 设备ID game_mode: 1是无尽模式 2是限时模式 kill: 击杀次数 length: 蛇的长度 market: 我抓的是iOS设备发的请求,所以这里是apple platform: 抓到的请求里是1,还不太明白具体的意思 push_channel: 也是1,不明白意思 push_id: 固定值111111111222222223333333344444444,后面逆向apk也证明了这一点 sid: 每次登录都会更新 snake_sign: 签名 uid: 用户ID version: 我使用的版本是固定值2.1 通过逆向 APK 获取签名算法 明确了参数的意思,接下来就可以伪造请求了,不过在伪造请求之前,还有一个参数比较麻烦,那就是 snake_sign,请求签名,从图中 snake_sign 的内容看,似乎有点像是一个 base64 过的东西,不过 base64decode 发现,根本不可读。与其猜签名算法,不如考虑一下其他办法。 「贪吃蛇大作战」还有安卓版本,并且引导下载的页面提供了 apk,于是下载 apk,使用jadx-gui进行逆向,使用 jadx-gui 打开 apk 后,代码一览无余。 通过查看代码,可以清楚的看到 snake_sign 字段的签名逻辑,首先将请求中所有参数按 ASCII 码顺序排列拼接成字符串,然后在字符串前添加POST& + [URL Path],添加后使用 Key 进行 SHA1 加密,key 也可以在代码中获取到。对加密生成的结果,需要做一次 base64,才是最终 snake_sign 字段的结果。 ...

八月 28, 2016 · 1 分钟 · Zhiya

在阿里云CentOS7中配置基于Nginx+Supervisor+Gunicorn的Flask项目

需要在阿里云的CentOS7中搭建Flask应用的生产环境,记录一下。 配置Centos7 root登录后,首先新建一个普通用户并设置密码 adduser user passwd user 接下来将用户的公钥复制到~/.ssh中,命名为authorised_keys,修改/etc/ssh/sshd_config禁用ssh中的root登录,修改默认ssh端口,并使用证书登陆,修改如下内容 Port 65535 PasswordAuthentication no PermitRootLogin no 配置完成后重启ssh服务 systemctl restart sshd.service CentOS7中用firewalld替换了iptables,需要手动将80端口和修改后的ssh端口添加到firewalld中 firewalld --add-port 80/tcp --permanent firewalld --add-port 65535/tcp --permanent firewalld --reload 配置Nginx yum中可以直接安装nginx yum install nginx 安装好后在/etc/nginx/default.d中添加location的配置,并指向8001端口,以后Flask会监听8001端口 location / { proxy_pass http://127.0.0.1:8001 } 配置好后重新载入nginx配置 systemctl reload nginx.service 安装Python CentOS自带Python2.7,如果使用Python3,需要单独安装。 wget https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz tar xf Python-3.4.3.tgz cd Python-3.4.3 ./configure --prefix=/usr/local --enable-shared make make altinstall 接下来在项目中搭建虚拟环境,Python2虚拟环境使用virtualenv安装(使用pip install virtualenv命令安装),Python3环境使用pyvenv安装(Python3自带pyvenv),以Python3环境为例,在Web项目中,建立虚拟环境文件夹venv pyvenv venv 接下来在项目路径下启用虚拟环境 source venv/bin/active 退出虚拟环境使用Ctrl+C或deactive命令 安装配置Gunicorn Gunicorn使用pip install gunicorn安装,注意需要在虚拟环境中使用pip安装,这样才对应虚拟环境中的Python版本。安装好后,新建一个Gunicorn的配置文件,比如deploy_config.py,加入内容如下 import os bind='127.0.0.1:8001' #绑定的端口 workers=4 #worker数量 backlog=2048 debug=True proc_name='gunicorn.pid' pidfile='/var/log/gunicorn/debug.log' loglevel='debug' 保存文件后在虚拟环境中使用Gunicorn尝试启动 ...

六月 11, 2015 · 1 分钟 · Zhiya

在viewDidAppear中PushViewController失败的问题

需要在 ViewController(FirstViewController)的 viewDidAppear 中 Push 另一个 ViewController()SecondViewController),于是使用如下代码: - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; UIViewController *secondViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"secondViewController"]; [self.navigationController pushViewController:secondViewController animated:YES]; } 在 iOS8 中,这段代码工作良好,当 FirstViewController 出现时,由于立刻 Push 了 SecondViewController,即使 animated 参数是 YES,Push 的动画都没有显示出来。但是在 iOS7 中却出现了不一样的情况,pushViewController 方法似乎没有执行,SecondViewController 也没有被推出。打断点可以发现 pushViewController 方法是被执行了的,但是界面上没有任何效果。 由于 pushViewController 方法是在 viewDidAppear 中被调用的,会不会是因为 viewDidAppear 时 FirstViewController 还有什么 UI 上的动作没有处理完,导致立即调用 pushViewController 失败?那么将 pushViewController 放入 dispatch_async 中应该就能解决这个问题。使用如下代码实现: - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; UIViewController *secondViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"secondViewController"]; dispatch_async(dispatch_get_main_queue(), ^{ [self.navigationController pushViewController:secondViewController animated:YES]; }); } ...

三月 13, 2015 · 1 分钟 · Zhiya

使用TestFlight进行应用的Beta测试

TestFlight 已经被 Apple 集成到 iTunes Connect 中,现在使用 TestFlight 可以很方便的进行应用的 Beta 测试。下面就来介绍一下如何使用 TestFlight 进行测试,已经其中的一些小问题。 首先需要在 iTunes Connect 中启用 TestFlight,可以针对每个 App 的某一版本,决定是否启用 TestFlight。进入 iTunes Connect -> My Apps -> 某个 App -> Prerelease,在上传的 Build 右上角,打开 TestFlight 的开关,接下来就针对这个版本启动了 TestFlight。 有了可以测试的应用,接下来还要有测试用户,TestFlight 测试用户有两种,一种是内测用户 InternalTester,最多 25 个,一种是公测用户 ExternalTester,最多 1000 个,内测用户需要首先成为 iTunes Connect User,而公测用户只需要知道他的 Apple Id 就可。要进行公测需要先经过 Apple Review 团队的审核。我们以添加一个内测用户为例,进入 iTunes Connect -> Users and Roles -> iTunes Connect Users,首先添加一个 iTunes Connect User,之所以要添加 iTunes Connect User,是因为 TestFlight 的测试用户必须是一个 iTunes Connect User,并且这个用户的角色必须是 Admin 或者 Technical。添加后,用户的邮箱里会收到一封邀请邮件,点击邮件中的链接可以激活成为 iTunes Connect User。进入 iTunes Connect -> Users and Roles -> TestFlight Beta Testers,激活的 iTunes Connect User 会出现在这里,选中点击右上角的保存,这个用户就成为一个内测用户了。 ...

十月 30, 2014 · 1 分钟 · Zhiya

iOS8中LaunchImage和LaunchScreen的完美结合

Apple 在 iOS8 中推出了 LaunchScreen.xib 来代替之前的 LaunchImage 作为程序的启动界面,相比与 LaunchImage,在 iOS 设备屏幕尺寸越来越多样的情况下,LaunchScreen.xib 依托 AutoLayout 无疑更方便,否则,对于一个兼容 iPhone5-iPhone6Plus 的应用,就需要有 4 长不同尺寸的 LaunchImage。 但是 LaunchScreen 只有在 iOS8 中才能被支持,所以一些开发者还是选择用传统的 LaunchImage 方式。不过,还有一种方式是将 LaunchImage 和 LaunchScreen 结合,在大尺寸 iPhone 中使用 LaunchScreen(iPhone6 和 iPhone6Plus 都是 iOS8 系统),在 iOS7 中使用 LaunchImage(使用 iOS7 的手机只有 4 寸和 5.5 寸的 iPhone,所以只需要两张图)。 首先进入 Target 配置,找到 App Icons and Launch Images,Xcode6 中默认使用了 LaunchScreen.xib,而 LaunchImage 则没有使用。 接下来点击 Use Assets Catelog,这时 Xcode 会在 Images.xcassets 中生成 LaunchImage,这里我们只需要给 4 寸 Retina 屏和 3.5 寸 2x 屏放两张 LaunchImage 就好了。 ...

十月 25, 2014 · 1 分钟 · Zhiya