微信小程序终于可以做游戏了,最近有一款名为“跳一跳”的游戏特别火,很多人都在玩。我也试着玩了一下,发现确实很容易上手,不过可能我对自己力度的控制没有想象的那么好,最多也就跳个几十分,和那些动辄成百上千的大神没法比。
不过人嘛,总还是要有一些攀比之心的。网上也有一些所谓的攻略,有发现所谓可以加分技巧的,有通过数学计算借助刻度尺计算的,也有外挂的。不过对我这种懒人来说,这些都很麻烦,而且非常耗费时间,我的要求很简单,就是可以快速简单的拿到高分。
然后呢,正如想瞌睡的时候来个枕头。新年刚开始就爆出一个小程序的漏洞:可以下载任意小程序、小游戏源代码。作为一名多年不碰代码的伪程序员,我找到了这篇原帖:https://www.v2ex.com/t/419056
居然发现只要知道appid和版本号,就可以直接下载源代码(.wxapkg的打包),无需任何验证。
抱着试一试的态度,我输入了上面提供的网址,真的可以耶。我一口气下了三个版本的源码包。
三个文件都不大,大概3M左右。既然代码下了,我就试着按照操作步骤来进行解压。
1. 安装Python
因为我从来没用过Python,所以首先需要安装Python环境。虽然我用的Mac OS自带Python,不过版本应该比较低,为了稳妥起见,还是去官网下载一个。我下的是版本是2.7.14.
https://www.python.org/downloads/release/python-2714/
然后运行安装程序,跟着提示点击“下一步”即可。
2.解压源代码
如何解析wxapkg文件:
首先将帖子里提到的Python脚本文件代码拷贝下来(https://gist.github.com/thedreamwork/01691af73eeda292e7327bc6bd3e1d08),如果无法打开链接,可拷贝下列文本:
#!/usr/bin/python
# usage python unwxapkg.py filename
import sys,os
import struct
class WxapkgFile:
nameLen = 0
name = ""
offset = 0
size = 0
if len(sys.argv) < 2:
print 'usage: unwxapkg.py filename'
exit()
with open(sys.argv[1], "rb") as f:
if len(sys.argv) > 2:
name = sys.argv[2]
#read header
firstMark = struct.unpack('B', f.read(1))[0]
print 'first header mark = ' + str(firstMark)
info1 = struct.unpack('>L', f.read(4))[0]
print 'info1 = ' + str(info1)
indexInfoLength = struct.unpack('>L', f.read(4))[0]
print 'indexInfoLength = ' + str(indexInfoLength)
bodyInfoLength = struct.unpack('>L', f.read(4))[0]
print 'bodyInfoLength = ' + str(bodyInfoLength)
lastMark = struct.unpack('B', f.read(1))[0]
print 'last header mark = ' + str(lastMark)
if firstMark != 0xBE or lastMark != 0xED:
print 'its not a wxapkg file!!!!!'
exit()
fileCount = struct.unpack('>L', f.read(4))[0]
print 'fileCount = ' + str(fileCount)
#read index
fileList = []
for i in range(fileCount):
data = WxapkgFile()
data.nameLen = struct.unpack('>L', f.read(4))[0]
data.name = f.read(data.nameLen)
data.offset = struct.unpack('>L', f.read(4))[0]
data.size = struct.unpack('>L', f.read(4))[0]
print 'readFile = ' + data.name + ' at Offset = ' + str(data.offset)
fileList.append(data)
#save files
for d in fileList:
#print 'd.name = ' + d.name
#print 'name = ' + name
d.name = '/' + name + d.name
#print 'openFile = ' + root + d.name
#print 'openFile = ' + root + d.name
os.makedirs(path)
#print 'openFile = ' + root + d.name
w = open(root + d.name, 'w')
f.seek(d.offset)
w.write(f.read(d.size))
w.close()
print 'writeFile = ' + root + d.name
f.close()
打开刚安装好的IDLE,然后点击“File” -> “New File”,将代码粘贴到新建文件中,保存命名为“unwxapkg.py”。
进入Mac “其他”,打开“终端”。
运行刚刚保存的Python的脚本来解压下载的源码包。这里要注意,一定要确定脚本和源码包的路径正确。一个小窍门,如果不确定路径,可以用鼠标选定文件然后拖拽到终端窗口,这样会自动匹配正确路径。我选择解压的是4.wxapkg。
这里我最开始遇到一个问题,解压过程中老是提示以下错误:
Traceback (most recent call last):
File "/Users/hj/Downloads/unwxapkg.py", line 75, in
w = open(root + d.name, 'w')
IOError: [Errno 20] Not a directory: '/Users/hj/Downloads/4.wxapkg/app-config.json'
根据提示,应该是检测到非文件夹报错。不知道是不是Python的版本问题,我撸了一遍脚本的代码,然后将其中一行代码改为(如果你直接拷贝这篇文章的代码,则已经修改完毕):
接下来就可以顺利解压了。
解压后的文件夹结构很简单,其中game.js有1.3M大,应该是一个打包后的文件。
3.搭建小游戏开发环境
下载安装“微信开发者工具”(注:小程序和小游戏的开发环境不一样,这里需要下载小游戏开发环境):
点击“小程序项目”,创建新的项目(选择“小程序/小游戏”),不要选择快速启动。这里我新建了一个名为“little jumping”的目录。
然后把刚才解压好的所有文件复制到刚创建的“little jumping”目录,这时开发工具会提示编译错误:
编译出错:
Error:ENOENT:no such file or directory, open '/Users/hj/Desktop/little jumping/game.json'
这个时候在根目录下创建一个叫game.json的文件,然后写入如下代码,表示游戏竖屏玩。
保存后发现还是无法编译通过,这个时候需要点击开发者工具右上角详情按钮,把调试基础库改为“game”。
现在,就可以在本地运行了。
4. 配置代理
不过这样也是没法玩的,会遇到如下错误提示:
gamePage.html:1 Wed Jan 03 2018 11:12:42 GMT+0800 (CST) request 合法域名校验出错
gamePage.html:1 如若已在管理后台更新域名配置,请刷新项目配置后重新编译项目,操作路径:“项目-域名信息”
https://www.charlesproxy.com/latest-release/download.do
下载以后安装,跟着流程很简单完成。完成安装后运行Charlesproxy,首先安装根证书:
双击“Charles Proxy CA”,然后在弹出的对话框选择“始终信任”。
证书安装完成后,开始配置代理。运行Charlesproxy,选择“Proxy” -> “Proxy Settings...”按照如下进行配置:
这里注意,Charles跟Fiddler不同,Fiddler安装证书后就可以抓HTTPS网址的包了,Charles则麻烦一些,需要选择"Proxy" -> "SSL Proxy Settings...“,点击Add按钮,在弹出的表单中Host填写域名,比如填servicewechat.com,Port忽略。
到这里我们就完成了所有的配置,这个时候可以在Charles里看到抓取的数据包。
领取专属 10元无门槛券
私享最新 技术干货