-
2020-10-29 20:29:11
文档介绍
利用python写"猜数字”,"猜词语”,"谁是卧底”这三个游戏,从而快速掌握python编程的入门知识,包括python语法/列表/元组/字典/流程控制/库函数等等。
环境参数
linux平台,python3.4。需要在linux中把python3.4编译一下,这样编写python程序时保存为.py格式的文件并添加执行权限再终端运行即可(原理跟shell脚本相同),非常方便。
ps:贴出来的python程序代码在windows中也兼容,只不过运行方式不是命令行,而是要通过python软件。python软件可以上官网下载安装点击打开链接,在学习的时候,可以直接在python软件上面输入python语句即可打印结果,也就是说python无需编译即可运行,很多人也称之为"脚本”语言。
设计实现
猜数字
很多人在聚餐时都玩过猜数字游戏,由某人随机出一个指定范围内的数,然后其他人一个一个猜,猜的过程中区间不断缩小,直到猜中为止。
这里的猜数字游戏就是用程序来代替那个出数字的人,程序算法设计为:
1.输入数字区间--->2.系统产生区间内的随机数--->3.玩家输入自己猜的数字--->4.比较玩家猜的与答案的高低并提示--->5.未猜中则回到3,猜中则提示猜次数
代码很少,如下所示:
#!/usr/local/bin/python3
import random
bot=int(input('Set range bottom '))
top=int(input('Set range top '))
rand=random.randint(bot,top)
print ('Random number in ['+str(bot)+','+str(top)+'] generated!')
num=int(input('###Guess the number### '))
cnt=1
while (num!=rand):
if (num
print('*_* Lower than the answer')
else:
print('T_T Higher than the answer')
num=int(input('###Guess the number### '))
cnt=cnt+1
print('^_^ You get the answer with [%d] times'%cnt)
第一行是要让linux系统知道这是python3程序,random是产生随机数的库函数,要注意的是python对格式要求很严格,因为它不用通过{}而是通过缩进量判断流程。
通过这个可以掌握基本的语法和编写规则了,下面再试试有点难度的,用到词组和循环控制等知识。
猜词语
电视节目中的”你来比划我来猜"大家应该都看过,而且很多人也玩过,规则就是一个人看词语比划相应动作和说一些提示,另一个人看不到词语要通过比划的动作猜出来,猜的过程中主持人判断是否符合规则。
某一组玩家猜词语的算法设计为:
1.开始计时--->2.猜词语--->3.答对则正确数加1并回到2,要跳过或犯规了则直接回到2,超时了直接跳到3--->3.循环10次后或时间结束后统计答对的题数
有num组玩家就进行以上流程的num次循环,当然也要准备x组词语,因为每组玩家猜的词语是不同的。
代码量不大,如下所示:
#!/usr/local/bin/python3
import time
num = int(input('有多少组玩家 '))
guessWord = []
correct = []
#定义列表,num+10是不想让guessWord下标不合法
for i in range(0,num+10):
guessWord.append(0)
correct.append(0)
wordNum=10
guessWord[0] = ['打情骂俏','海绵宝宝','娇媚','金鸡独立','狼吞虎咽','睡眼朦胧','鹤立鸡群','手舞足蹈','卓别林','穿越火线']
guessWord[1] = ['眉飞色舞','英雄联盟','扭秧歌','偷看美女','大摇大摆','回眸一笑','市场营销','大眼瞪小眼','自恋','处女座']
guessWord[2] = ['狗急跳墙','捧腹大笑','目不转睛','愁眉苦脸','左顾右盼','宫保鸡丁','升国旗','暗恋','臭袜子','趁火打劫']
flag='n'
for i in range(0,num):
start = time.time()
for k in range(0,wordNum):
#显示词语
print (('%d.%s')%(k+1,guessWord[i][k]))
flag = input('请答题,答对请输入y,跳过请输入任意键')
end = time.time()
sec = end-start
#统计用时
if (110<=sec<=120):
print ('还有10秒钟')
if (sec>=120):
print ('时间到!游戏结束')
break
if (flag=='y'):
correct[i]=correct[i]+1
continue
else:
continue
str_temp=('第%d组答对数目:%d') % (i+1,correct[i])
print (str_temp)
其实词语可以做成从独立的文件中读入的方式,这样方便更新和管理,下面就介绍一种用"字典”的方式来获得"谁是卧底”的卧底词。
谁是卧底
谁是卧底也是深受很多人喜欢的游戏,起码要三人以上才能玩,大致分为几个阶段:1.分配平民词语和卧底词语--->2.玩家依次发言--->3.根据发言投票认为谁是卧底--->4.得到票数最多的玩家出局--->5.出局玩家刚好是卧底则平民胜利,如果出局玩家是平民则被冤死并继续第2步,当剩下的平民只有1个时卧底胜利。
特殊情况是,出现两名或以上的玩家票数相同,则相同票数的玩家重新发言,然后全体针对这几个玩家投票。
程序设计思想:输入玩家数num,玩家编号为0~num-1,然后定义三个含有num个元素的列表:词语列表,计算玩家票数的列表,死亡玩家的列表。列表下标从0~num-1,随机产生该区间的数x,代表x号玩家是卧底,然后分配卧底词和平民词。注意,提示几号玩家是卧底或冤死的时候,要将打印信息时候的下标加1,比如下标数0代表的其实是1号玩家。在生活中,没多少人会习惯说自己是"第0个人”这种说法吧,除了程序员--;
在每轮游戏中,依次进行发言,投票,票数最多的玩家出局(出现相同票数则重新发言),出局玩家归入死亡玩家列表。然后开始下一轮。
那么,如果有num位玩家,则最多有多少轮游戏结束?因为进行到只有2位玩家游戏就结束了,所以答案是num-2轮!也就是说上述流程要循环num-2次。
编程思想定了就可以敲代码了,程序代码如下:
#!/usr/local/bin/python3
import random
from spyword import spyword
num=int(input('请输入玩家数(至少为3) '))
#卧底玩家
spy=random.randint(0,num-1)
#随机产生词语 定义词语列表 计算玩家票数的列表 统计死亡玩家的列表
list_rand=spyword.popitem()
word=[]
cnt=[]
dead=[]
#给三个列表赋值
for i in range(0,num):
word.append('a')
cnt.append(0)
dead.append(num+2)
#给玩家词语 其中print是调试用的,sanmeVote是出现相同票数的标志,spyWin是卧底胜利的判决条件
for i in range(0,num):
if (i==spy):
word[i]=str(list_rand[1])
else:
word[i]=str(list_rand[0])
print (word[i])
sameVote=0
spyWin=0
#游戏开始
for x in range(0,num-1):
for k in range(0,num):
if ((k not in dead) & (sameVote==0)):
print ('%d号玩家发言时间'%(k+1))
print ('发言环节结束')
#将各位玩家的票数置0
for j in range(0,num):
if (j not in dead):
cnt[j]=0
for j in range(0,num):
if (j not in dead):
vote2p=int(input('请%d号玩家投票'%(j+1)))-1
cnt[vote2p]=cnt[vote2p]+1
sameVote=0
for y in range(0,num):
if((cnt[y]==max(cnt)) & (y!=cnt.index(max(cnt)))):
print ('不止一位玩家得到最高票数,请这些玩家重新发言')
sameVote=1
if (sameVote==0):
dead[x]=cnt.index(max(cnt))
if (dead[x]==spy):
print ('卧底得到最多票数,游戏结束')
spyWin=1
break
print ('%d号玩家被冤死!'%(dead[x]+1))
#游戏结束
if(spyWin==0):
print ('只剩两名玩家,卧底胜利!')
有一行代码是
from spyword import spyword
这里spyword是我自己定义的卧底词字典,运行时把这个文件放在python的工作目录下,就可以让python程序调用该字典了。要查看python工作目录,你需要运行python后输入
>>>importos
>>>os.getcwd()
当然你也可以更改python工作目录。
python是一门简洁高效,通俗易懂的高阶动态编程语言;很多人也称之为"胶水语言”,在接到大项目时往往用python写好主体框架,然后在一些特定模块再用java/js/C++之类的语言实现特定需求。掌握python并不难,通过这篇博客讲到的三个小游戏,希望您能发现python的乐趣,快速找到python编程的窍门。
总结
以上就是本文关于python基础练习之几个简单的游戏的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:Python3中的列表,元组,字典,字符串相关知识小结、Python爬虫实例爬取网站搞笑段子、python实现人脸识别代码等,有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持!
更多相关内容 -
游戏修改软件全部源代码
2006-02-23 09:05:59搜索速度极快我的收藏夹 提供快速装载游戏的方式 内存修改 内存数值高阶和低阶的搜索以及编辑 存档编辑 存档文件的数值高阶和低阶的搜索以及编辑 图象捕捉 抓取游戏图象 游戏记录 编写攻略和记录流程 -
android studio 安卓扫雷小游戏源代码
2021-06-13 21:04:41android studio 安卓扫雷小游戏源代码 运用Android 制作扫雷游戏,制作简单,没有复杂的代码,对于熟悉Android的页面布局,跳转有帮助理解=。这个扫雷还有点瑕疵,广大程序员们可以对其修改和完善。 -
手机软件APP下载类网站源码 游戏软件应用网站源码 自适应手机端 Pbootcms模板
2021-12-21 16:13:14手机软件APP下载类网站源码 游戏软件应用网站源码 自适应手机端 Pbootcms模板 安装教程https://www.a5ymg.cn/480.html 手机软件APP下载类网站pbootcms模板 游戏软件应用网站源码 模板自适应手机端 pbootcms内核开发... -
手机软件APP下载类网站pbootcms模板 游戏软件应用网站源码 模板自适应手机端.zip
2021-12-19 15:42:34手机软件APP下载类网站pbootcms模板 游戏软件应用网站源码 模板自适应手机端 pbootcms内核开发的网站模板,该模板适用于手机APP网站、游戏软件网站等企业,当然其他行业也可以做,只需要把文字图片换成其他行业的... -
手机软件APP下载类网站Pbootcms模板 游戏软件应用网站源码 模板自适应手机端
2022-04-18 12:28:58手机软件APP下载类网站pbootcms模板 游戏软件应用网站源码 模板自适应手机端 pbootcms内核开发的网站模板,该模板适用于手机APP网站、游戏软件网站等企业,当然其他行业也可以做,只需要把文字图片换成其他行业的... -
CryoFall:CryoFall游戏源代码,包括Core和Editor软件包-Source code editor
2021-03-24 20:31:01所有游戏代码都可以实时编辑,并且更改立即由游戏引擎应用。 改装先决条件 请按照。 贡献 欢迎提出请求,但始终最好在开始任何工作之前与我们联系,以确保您的贡献对项目有用。 请确保您的代码符合Microsoft建议的... -
十款真正的编程游戏软件
2022-04-20 14:02:54十款真正的编程游戏软件1. 概述
说到游戏化编程,相信很多人第一时间想到的是scratch。实际上,scratch的游戏化程度并不高,存在缺乏游戏引擎、难以绘制精美的角色等诸多问题。那么有没有能让我们的编程学习,像真正的玩游戏一样呢?
今天给大家分享10款“真正”的游戏编程软件/工具。
2. CODE COMBAT
- 全称:code combat
- 简介:原型是一个开源的编程游戏,你可以通过代码控制角色闯关。上面的链接是国内代理公司的网址,上面可以直接玩,如果有精力可以自己在github上下载源码,然后用自己电脑做本地服务器。需要注意的是,这种自己下源码搭的服务器,不能用来盈利。
3. Paracrafe
- 全称:Paracraft
- 简介:深圳一家公司开发的3D沙盒编程游戏,学生可以在游戏中通过图形化指令或者文本编码控制角色运动,也可以像玩Minecraft一样创造世界,建造,游玩。
4. Makecode-Minecraft
- 全称:Makecode minecraft
- 简介:微软推出的一个系列的青少年编程平台中的一个子平台,可以编写程序,控制你的mc中的角色运动、建造等。
5. 树莓派-Minecraft
- 全称:Minecraft Pi
- 简介:树莓派内置的可编程Minecraft,可以通过终端内的Python代码控制mc中的角色运动、建造等。
6. ROBLOX
- 全称:Roblox(罗布乐思)
- 简介:ROBLOX是一个像素游戏创作、发布平台,国外用户超过5亿,2019年与腾讯成立国内分公司罗布乐思,它有点像mc,但是却比mc做得更深,因为你可以通过他们提供的组件轻松制作自己的各种沙盒游戏。它就像是另一个世界,你可以在里面创建游戏,可以使用里面的货币购买别人的游戏。除此之外,它们已经让平台游戏可以打包上架部分应用商店。ROBLOX使用的是一个叫做Lua的编程语言,不是图形化,但是对于有一定编程基础的学生也比较容易掌握,它有可能解决现在小学高年级及初高中代码编程推广效果较差的问题,从根源上激发学生的创作兴趣,让这个年龄段的学生,像小学低年级第一次接触图形化编程平台那样感到兴奋与好奇,愿意积极探索。
7. Kudo
- 全称:Kodu Game Lab
- 简介:微软推出的,面向儿童的3D游戏创作工具,使用者不需要掌握复杂的编程语法,只需要通过拖拽创建角色,然后点击角色,设置角色的运动规律等即可。
8. Playgrounds
- 全称:MAC Playgrounds
- 简介:苹果公司推出的一款学习swift语言学习软件,在上面你需要通过编程控制角色拾取宝石,以闯关的形式不断学习新知识,趣味性较高。
9. 扣叮游戏实验室
- 全称:扣叮游戏实验室(码上跳一跳)
- 简介:腾讯旗下扣叮系列编程平台中面向低龄儿童的编程平台,与上面的Playgrounds类似,这里是编程控制角色拾取星星,不过最大的区别在于,扣叮的控制指令是图形化指令。
10. Makecode-Arcade
- 全称:Arcade
- 简介:微软推出的青少年图形化编程平台之一,可以通过图形化积木或js、Python制作可以下载到掌机上的游戏,平台自带模拟器,即便没有掌机,也可以通过键盘控制模拟器上的按键,运行自己的游戏程序。
11. TileCode
- 全称:TileCode
- 简介:微软团队推出的一种将掌机变为具备编程能力的编程平台的方案,用户只需要下载对应程序到自己的掌机中,就可以单纯依靠掌机创建/修改游戏。
写在最后
后续我还会发布项目源码或学习资料,希望大家可以持续关注,有什么问题可以给我留言。
不管你是转行也好,初学也罢,进阶也可,如果你想学编程~
【值得关注】我的【C/C++源码资料学习群】点击进入C语言C++编程学习基地
-
JavaScript用200行代码制作打飞机小游戏实例
2020-12-01 22:24:53这是自己第一次通过js写的小游戏,那个时候对象的原理跟结构体的概念不是特别的清晰,所以没用对象来写,所以直接导致后期我对这个程序进行修改的时候出现问题,太过于复杂了,我终于了解什么叫做牵一发动全身了。... -
Mudar Idiomas - The Sims 3:更改游戏语言-开源
2021-04-28 22:17:32更改《模拟人生3》游戏语言的一种简便方法,您可以选择所需的语言,然后程序会更改更改语言所需的内容。 用C#编写,并且其源代码可供任何想知道该程序如何工作的人使用。 -
VT虚拟化驱动+内存读写+机器码修改源代码(2020年开源)
2020-03-16 12:04:33纯c++源代码,不是.sys,不懂编程的就别下载了,会浪费你的积分的。 可以修改CPUID和硬盘ID,里面集成了各种钩子处理、隐藏驱动、伪装、PatchGuard、文件保护、窗口保护、拦截数据包、绕过反调试、等等...非常... -
gg 修改器游戏被保护_某游戏DLL保护分析,以及偷学一点Unity代码保护思路
2020-11-21 08:43:19还原Opcode之后,再用dnSpy打开 代码被还原成功,可以被直接查看和修改了 之所以想写一篇分析记录,不仅仅是花了不小的时间来逆向这个游戏,也是因为这个游戏保护dll文件的方法较为全面,常用的手段基本都用上了,...本人虽然是个手残,却非常喜欢尝试各种音游,即使被虐到爆炸也停不下来。
最近看上一款某渊的音游,它的判定线移动打拍的玩法挺不错的,于是乎又手贱买了,然后被虐到体无完肤。
本着至少要给自己爽一下的原则,就准备对它下毒手了。
首先拆一下压缩包,发现是unity引擎,而且还是Assembly-CSharp.dll的方式,感觉也许会轻松不少(并不是
拖出来,上dnSpy,理所当然地出错。
拖进UltraEditor,发现可以明显地看出PE文件结构,就是有点怪而已。所以这应该不是那种简单地把整个dll文件套个加密算法,然后加载的时候解密那种方法。
大概是加密了关键部分,然后在解析的时候再解密吧。
试一下能不能Dump,ida附加,结果游戏直接闪退,估计是有反调试之类的,咱一个逆向萌新,对安卓方面的反调和反反调完全不懂,瞬间懵逼。
于是咱打算换一个歪门邪道,用GG修改器的Dump功能,这个游戏似乎没有针对GG修改器做什么。
Dump下整个游戏进程,然后在里面搜索DLL,把文件提取出来,但是发现,其他什么UnityEngine什么的都有,唯独缺了Assembly-CSharp.dll。
抱着不祥的预感在内存中搜索6D 7A 90 00 03 00 00 00 04,发现dll文件本身在内存中没有半点变化……
估计是魔改mono文件,然后用自己的一套来解析的吧……
拖libmono.so到ida里面,结果发现libmono.so也被搞了……
看一下Hex,被大量无意义字节填充了,估计是在载入so的时候再将原函数填回去……
还真是到处搞事情啊,不过so方面不比dll,到了内存里面你总得把这些函数给我还回来吧。
还是上GG(真好用),把libmono.so给Dump出来,记得选范围时要完整,宁可范围搞大一点,也别少选
修复一下Dump出来的文件,可以参考这里:内存dump 获得基于Unity3d的游戏相关代码
再拖进IDA,现在就没问题了
通过之前的试探,我们大概可以猜测一下dll被加载的过程,首先是原文件读入内存,再通过魔改后的mono使用自己的一套方法来解析文件。
看其他dll都没有事,所以在这个魔改后的mono中应该分开了两种不同的加载方式。
mono加载dll的时候,首先是进 mono_image_open_from_data_with_name这个函数(这个应该就不用细说了),然后走到 do_mono_image_load对PE文件进行分析。
static MonoImage *
首先是mono_image_load_pe_data函数对PE文件进行解析,这里有一个检验MZ头的步骤,而这个dll的头部是mz,所以这里应该有问题
不仅仅认正常的MZ,也认修改后的mz,没错了。
顺着加载过程摸下去,我们还可以找到魔改后同时认可PE和pe的部分
修改这里两处标识后之后,继续尝试读取dll文件,仍旧失败,根据失败原因继续走,发现时dll文件的段头被加密了,在mono中对应部分找到解密方法
段头的每一项都被单独处理,加密过程中密钥会随着改变的一个流加密,有伪代码的情况下还原解密方法没什么难度。
继续读取,发现PE结构解析部分没有问题,但还是出错了,继续往后跟,发现是.Net部分读取时出了问题。
在#~读取的时候,其中的各个项都出现读取失败的情况,但是奇怪的是,最开始的几个项读取正常。在load_tables函数中发现,读取MaskValid时做了处理,将MaskValid和MaskSorted异或后再保存。
但是在分析这个函数的时候,发现它和原版有很大的区别,它对一个全局变量进行赋值,将Reserved和Maskvalid拼接后保存了。先记下来,估计之后会用到。
修复MaskValid后,发现可以正常读取#~中的内容了,Method项中的函数名也可以被正常读取,但是在反编译函数时提示错误
所以游戏应该还在函数上单独加了料
Method中保存了所有函数的RVA,转化为Offset后可以直接定位到函数在文件中的位置。
找过去,在函数头里发现了猫腻,dll文件中的函数头按照正常的解析方式得出来的函数大小全部都是0,在ida中寻找解析函数头的对应位置,发现确实动了一点小手脚
都被或2了,同时,在这个函数中,还发现了对函数体解密的部分,正好一起搞了
这里利用了之前保存的Reserved和MaskValid进行解密,还有……这算啥?低配虚拟化?
然后,采用这种方法解密函数体后,反编译仍旧出错,排查了好久,发现在使用完解密完header和函数体后,它还在mono_method_get_header对函数体每一个字节异或0x30,真是麻烦,到处下坑。
解密完全部函数体,将它拖到dnSpy中,依旧爆炸……
虽然绝大部分函数炸了,但是却还有一些极小的函数可以被正常反编译
看到这里,我大概猜到它做了什么……
它应该是打乱了Opcode表,重构了读取Opcode的方法……
我自己也干过这事……在加密dll的时候打乱Opcode……
没辙,Opcode被打乱,我就只能对照着正常dll加载的函数和魔改版来分析修改后的Opcode表
分析Opcode的函数快两万行,我的电脑配置不够,要是用伪代码的方式一下就直接卡死,只能扣掉F5,一点点看汇编……
花了两个多星期,我才把新的Opcode分析完。它不仅仅打乱顺序,一些相邻的Opcode码,比如ldarg0,ldarg1这些,原版是采用n-ldarg0的方式来一次性分析这一个系列的Opcode,但是魔改版直接将n-ldarg0这个值固定死,然后把这些必须相邻的Opcode也拆开来分析了,给我造成了巨大的麻烦……
还原Opcode之后,再用dnSpy打开
代码被还原成功,可以被直接查看和修改了
之所以想写一篇分析记录,不仅仅是花了不小的时间来逆向这个游戏,也是因为这个游戏保护dll文件的方法较为全面,常用的手段基本都用上了,现在来总结一下。
①篡改PE文件中的标识符。最基本的就是“MZ”,“PE”两处,在.Net中,还可以对“BSJB”,“#~”标识下手
②改变PE文件结构。在这个游戏中,它加密了段头部分,除此之外,还可以修改各个值的偏移量,数值等等,如果有那个精力和实力的话,你甚至可以重构mono对PE文件结构的解析部分,自创一个结构
③对.Net中特有的元数据结构下手。以前将将整个元数据部分用垃圾数据填充,在读取时再填回来的方法,这个游戏只是单纯地篡改了MaskValid来干扰我们读取#~表。事实上可以做的事情还有很多,比如改变#~中项的顺序。在这里注意一点,Reserved是一个闲置的项,可以被利用来存一些标志或密钥之类的,不管是保护还是逆向都应该多注意一下。
④针对函数的加密。这其实不是什么新鲜玩意了,很久以前就有用hook掉mscorre的方法来加密函数体,在mono中只是实现起来更加方便一点。对函数体加密的话,可以保证使用Dump的方法几乎没啥用,毕竟内存中至始至终都没有出现过被解密的dll文件,攻击者一次最多Dump一个函数……
⑤最后,是最恶心的Opcode替换了。攻击者必须忍受恶心来对一个巨大的函数进行分析,这已经不是技术手段了,这是赤果果的精神攻击!由于在mono中对Opcode分析并没有封装,所以保护者必须对Opcode有一定的了解,否则一不下心就会出错。没有时间精力来了解这个的话,也有一个办法,之前举办过一个比赛,上面就有一个替换Opcode的例子。它对解析Opcode的函数没有更改,只改了Opcode.def文件中的值而已,算是利用了一个小巧合吧。比赛题目链接:Gslab 2017游戏安全技术竞赛
这一次对游戏dll的加密分析到这里就结束了,我也就将Note判定稍微改松了一点,来慰藉我这个手残受伤的心灵……
这个游戏有内购功能,所以为了厂商着想,就不放任何成品以及解密代码了,感兴趣的人可以根据什么的过程自行走一便,知道答案的解题过程不会很难……除了还原Opcode部分(不能让我一个人恶心!!!)
在网上查dll加密,铺天盖地的是XXTEA加密文件再在读取时解密,毫无新意,保护力度为5,。代码保护这种东西,怎么能用别人的成品?那不就相当于所有门用同一把锁,那把锁的钥匙都还满大街人手一份。
所以,保护厂商在做代码保护时,可以借鉴思路,但是绝对不能套用!否则就是对自己产品的不负责!
希望这里写的一点浅薄的东西能够给没有技术大牛支持的厂商们带来一点点思路。
- End -
看雪ID:Mengluu
https://bbs.pediy.com/user-848784.htm
本文由看雪论坛 Mengluu 原创
转载请注明来自看雪社区
热门图书推荐戳
立即购买!
热门文章阅读
1、GandCrab V2.0 详细分析
2、SSDT-HOOK
3、一篇文章带你理解PE三表
4、看雪众测平台第15期,新项目已上线!
公众号ID:ikanxue
官方微博:看雪安全
商务合作:wsc@kanxue.com
戳原文,查看更多干货!
-
反编译 注入修改游戏或APP的调用参数新手系列教程——使用theos tweak 注入hook修改游戏执行代码上传动态...
2020-06-13 12:23:372020年 IOS 逆向 反编译 注入修改游戏或APP的调用参数新手系列教程——使用theos tweak 注入hook修改游戏执行代码上传动态头像开篇需求&最终效果bfinject对正在运行的APP脱壳打包成.ipa注入自己的动态...2020年 IOS 逆向 反编译 注入修改游戏或APP的调用参数新手系列教程——使用theos tweak 注入hook修改游戏执行代码上传动态头像
开篇
太懒这篇其实文章很早就该写的了,一方面记录一下自己的代码另一方面分享。
需求&最终效果
游戏本身不支持上传gif动态图片,上传前图片会客户端会做截图处理,通过注入修改代码,成功上传动图。
环境要求与即将使用的工具
之前我的MacOSX版本是10.10,只能安装xcode7以下的版本,xcode7以下的版本没有真机调试功能,于是升级了版本到MacOSX Catalina 10.15.4也安装了最新版xcode,但是这个版本太卡而且有些问题,很多软件兼容不了了,想以后降级。
环境 版本 操作系统 MacOSX Catalina 10.15.4 版本太新了不太好用很多工具用不了,我后面打算降级 手机系统 Iphone7 IOS11 需要越狱 mac上面的 theos 最新版 手机助手传输工具或SSH连接操作 - xcode 11.5 手机端FLEXible(具备浏览appUI结构和APP抓包功能);或者用charles来抓包 - mac 上面的 hopper disassembler反编译工具 - 工具介绍
theos是用来编写tweak代码并且打包成deb包的工具。
FLEXible是手机端调试神器,可以查看APP的UI层级和代码头文件的方法和变量,更有抓包的功能!ios11的ssh本人用不了,从cydia安装了openssh,但是用命令行执行ssh报无法打开二进制文件的英文错误,不知道为何,谁能在ios11运行ssh并且电脑连接手机ssh的麻烦告知我一下谢谢。
实现过程
思路
思路a:首先我要找到上传图片的POST请求,然后把上传图片参数的图片url地址改掉。
思路a行不通,因为上传的时候游戏客户端对全部参数通过加密算法计算出了一个sign的参数提供给后台,如果修改了其中任意参数会导致后台验证签名失败。
思路b:在本地上传图片裁剪窗口点击保存图片的的时候把本地图片路径改成我指定的路径。
思路b可能可行但是我想还有更简单的做法。
思路c:在上传前对组装的参数数组的代码注入,强行改变图片参数的url。也不会影响sign的生成正确逻辑。
思路d:反编译看汇编代码逆向sign参数的加密过程。这个难度比较大,耗时,但是如果把sign的生成过程解密了基本所有请求就都可以通过中间人攻击来伪造数据。
思路c会简单一点。用思路c的做法来做理清图片上传请求过程
可以先通过FLEXible来看看目录结构,有哪些控制器类和方法大致看看。
其实也可以不用看层级结构,我只要让图片上传触发抓包就行。
打开FLEXible的menu再选择Network History ,点击一下Settings把抓包功能开启。
然后返回游戏界面随便上传一张图片,再打开Network查看抓包列表。
可以看到两个比较可疑的POST请求就是最前面两个:upload.qiniup.com和update_user_info
打开详细查看
图片看不全,我还是copy成curl贴出来吧。
如果不知道curl的同学可以自行去其他地方了解一下。curl -v -X POST ‘https://upload.qiniup.com’ -H ‘User-Agent: QiniuObject-C/7.3.2 (iPhone; iOS 11.2.6; ABE768DC-FA02-4CAB-9DF8-2720B0E7C890; GcvQmcsBpX-WqRIW_YTKKXua3PbSXh831RS_u2NW)’ -H ‘Content-Type: multipart/form-data; boundary=werghnvt54wef654rjuhgb56trtg34tweuyrgf’ -H ‘Content-Length: 27824’ -H ‘Cookie:’ [TOO MUCH DATA TO INCLUDE]
这一个请求是把图片流提交上去,当然这里的boundary无法写全,FLEXible工具无法显示图片流数据。Cookie数据也没补全。cookie里面是用户的sid等之类的信息。
其实这个请求还依赖列表第三的那个请求的token,需要先获取token再请求上传,后面我会写shell来体现。
成功上传的话最终返回的是图片的key和hash值,这一步仅仅只是把图片上传到了图床,还没有链接在游戏头像上。
返回:{ "key" : "sa/fc6861905d20200613100399.jpg", "hash" : "FifEYajsNl7aqU88gsOYSyewk199" }
这个key就是下面请求用到的headimgurl参数。
另外的一个POST请求:
下面我对于敏感参数用“某某”代替。curl -v -X POST ‘https://某某.com/user_api/update_user_info’ -H ‘market: apple’ -H ‘Content-Type: application/x-www-form-urlencoded’ -H ‘某某Version: 4.3.31’ -H ‘某某UserID: 某某-5631-4446-某某-09da14d65cb9’ -H ‘某某Product: 某某’ -H ‘User-Agent: 某某/4.1.31 (iPhone; iOS 11.2.6; Scale/3.00)’ -H ‘Accept-Language: zh-Hans-CN;q=1’ -H ‘nonce: 1592013691’ -H ‘Cookie:’ -d ‘build_tag=4531.0&device_id=某某-A6FA-4A74-8CA3-某某-1779-0000008790C7E566&device_name=iPhone%207%20Plus&device_system_platform=iPhone9%2C2&headimgurl=https某某com/sa/fc6861905d20200613100399.jpg&idfa=0D79361D-C19F-4A77-84Bd-D725AA96B4D8&market=apple&os_version=11.2&platform=1&sid=某某&某某_sign=%2B70m/3s/1314dgNQ641mE9YmN6c%3D&uid=某某&version=4.1.31’
这个POST请求就是修改用户头像的请求,最关键的参数就是其中的headimgurl,前面提到如果直接通过修改url请求参数变更headimgurl这个地址的话是行不通的,因为某某_sign这个参数是通过所有请求参数计算出来的,除非知道算法计算修改后的sign,否则后台会提示签名失败。
shell实现上传自己的gif动态图片到图床
我要注入的代码其实就是update_user_info这个请求拼装的方法,拼装headimgurl参数的时候修改成我要的图片地址就ok了。
那么我要先自定义图片上传到图床,不是用游戏上传图片入口,而是用我自己写的shell脚本来模拟post提交图片到图床!最终获取上传图片后的url地址。#! bin/shell#! bin/shell # 内容,查找的关键词 getContentByKeyword() { content=$1 keyword=$2 echo $content | awk -F \"$keyword\"\:\" '{ print $2 }' | awk -F \" '{print $1}' } getHeaderByKeyword() { content=$1 keyword=$2 echo $content | grep $keyword | awk -F $keyword\:\ '{ print $2 }' | awk -F \ '{print $1}' } content=`curl -v -X POST 'https://某某.com/config/get_upload_token' -H 'market: apple' -H 'Content-Type: application/x-www-form-urlencoded' -H '某某Version: 4.1.26' -H '某某UserID: 某某' -H '某某Product: 某某' -H 'User-Agent: 某某/4.3.26 (iPhone; iOS 11.2.6; Scale/3.00)' -H 'Accept-Language: zh-Hans-CN;q=1' -H 'nonce: 1589783647' -H 'Cookie:' -d 'bucket=某某&build_tag=某某.0&device_id=某某-A4FA-4A64-某某-某某-1779-某某&device_name=iPhone%207%20Plus&device_system_platform=iPhone9%2C2&idfa=某某-C18F-4A77-84BC-某某&market=apple&os_version=11.2&platform=1&sid=某某&某某_sign=8HX%某某%3D&type=2&uid=某某-5495-439f-某某-某某&version=4.1.26'` token=`getContentByKeyword "$content" "token"` echo $token >> test2.txt uploadResponse=`curl -v -i https://upload.qbox.me -F "token=$token" -H 'User-Agent: QiniuObject-C/7.1.0 (iPhone; iOS 11.2.6; 某某-FA02-4CAB-某某-某某)' -H 'Content-Type: multipart/form-data' -H 'Accept-Language: zh-cn' -H 'Accept-Encoding: br, gzip, deflate' -H 'Cookie:' -H 'Accept: */*' -F "file=@/Users/mac/Desktop/test4.gif"` nonce=`getHeaderByKeyword "$uploadResponse" "EagleId"` picPath=`getContentByKeyword "$uploadResponse" "key"` echo $nonce >> test2.txt echo $picPath >> test2.txt nonce=${nonce:8:10} timeStamp=`date +%s` nonce=timeStamp echo $nonce >> test2.txt
第一步获取token,通过用户uid sid等参数请求get_upload_token得到。
第二步请求upload.qbox.me把本地gif动态图片传上去
例如上面代码中 -F “file=@/Users/mac/Desktop/test4.gif”
上传成功得到类似的数据,key就是headimgurl要拼装的图片地址。{ "key" : "sa/fc6861905d20200613100399.gif", "hash" : "FifEYajsNl7aqU88gsOYSyewk199" }
反编译分析汇编代码找出注入的方法(函数)
先砸壳,本文略过,详情查看我文章:用bfinject脱壳、注入自己的动态framework、cycript的使用
的到Mach-O文件后,用 hopper disassembler打开,查找关键词。
例如我查找修改头像的api关键词:update_user_info
右键进入谁调用这个地址,跳转切换成伪代码一看。
基本是这个方法了userApiUpdateUserInfoWithDict。
意思是通过字典变量来修改用户信息。headimgurl就是其中一个字典键,只要我们修改headimgurl的值就达到换图片地址的目的。当然只是猜想。编写tweak
验证猜想。
我是这样做的,tweak写hook这个方法,打印一下这个方法的实参,看看是什么内容。
可以先用class-dump把头文件导出来看看参数类型是啥,这里省略。
写tweak hook。mac 执行命令nic.pl来新建个tweak工程。
choose a template 填11。
MobileSubstrate Bundle filter 要填写对应APP的bundleID,可以通过手机连接电脑查看电脑控制台来观察到相关关键字。
其他选项回车就行。
最终生成目录:
修改一下Makefile,在include $(THEOS… 上面新增两行代码ARCHS = armv7 arm64 TARGET = iphone:latest:8.0
指定arm版本和编译手机的ios版本
打开Tweak.xm写代码:
%hook SnakeAPI + (void)userApiUpdateUserInfoWithDict:(id)arg1 success:(id)arg2 failure:(id)arg3 { NSLog(@"打印。。。%@", arg1); %log; %orig; } %end
保存,mac执行make package最终生成一个deb包。把deb通过ssh或者手机助手工具拷贝到手机安装,如果手机有Filza文件浏览器,可以通过Filza打开deb安装;如果没有只能通过terminal命令行工具安装,命令如下:
dpkg -i 包名.deb
手机连接mac,打开mac控制台软件。
手机打开游戏,上传一下头像,观察mac控制台是否有触发到日志,日志要自己筛选。最终我看到了日志有输出。
内容类似:[headimgurl] = 'sa/234234234234234.jpg'
证明arg1是一个字典。
只要修改arg1的headimgurl就能实现图片自定义。因为arg1是一个不可变字典,直接修改key对应值是行不通的,所以我简单粗暴,销毁arg1从新定义一个。
最终tweak代码如下:%hook SnakeAPI + (void)userApiUpdateUserInfoWithDict:(id)arg1 success:(id)arg2 failure:(id)arg3 { NSLog(@"打印前。。。%@", arg1); arg1 =nil; arg1 = [NSDictionary dictionaryWithObjectsAndKeys: @"https://某某/sa/2345345345345345.jpg", @"headimgurl",nil]; NSLog(@"打印后。。。%@", arg1); %log; %orig; } %end
图片地址我写死了,就是我用shell上传图片返回的地址,是一张动图。
再次编译tweak代码生成deb安装到手机。
手机去上传一下头像。
上传成功,但是头像并不是我们的动态图,我猜是本地缓存,重启游戏,哟嚯,头像刷新了,变成我们要的动图:
结束
此教程仅做学习交流和知识记录方便以后查看使用,如果涉及到利益相关的请告知本人进行删帖处理。
本人想通过这些博客记录自己这两周内折腾的过程以及分享最后成功的成果。另外想结交志同道合对IT行业感兴趣的盆友,互相交流学习。可以通过博客联系我或加QQ号:1321691245
只交朋友不接受接单之类的骚扰。博文主索引目录入口
我会把这系列的文章更新到这个入口里面,分享我的心得,大家互相学习。
2020年 IOS 逆向 反编译 注入修改游戏或APP的调用参数新手系列教程主目录入口 -
手机上如何才能编辑程序代码?(软件推荐)
2021-03-23 19:11:14本篇文章就给大家介绍几款Android手机编辑代码的软件。首先大家要知道Android是一种基于Linux的自由及开放源代码的操作系统。一、AIDE,可编写,可运行。AIDE是一个AndroidJava集成开发环境,可以让你在Androi... -
java实现迷宫源码-game_building_blocks:基本游戏组件逻辑处理代码示例
2021-06-05 14:56:53视觉艺术中的软件素养和技术中的视觉素养”,将学习编码框架为涉及“查看许多其他代码:运行、更改、打破并增强它,直到您可以将其重塑为新的东西”[1]。 作为一种学习方法和一般实践,在创意代码社区中积极鼓励重复... -
Python滑雪小游戏源代码
2021-02-04 09:26:16Python滑雪小游戏源代码、源程序,完整程序包请前往文末链接下载,按任意键开始游戏,通过键盘左右方向键来控制滑雪者,完整程序包请在文末地址下载,程序运行截图: 主程序:Game4.py ''' Function: 滑雪小游戏 ... -
手机上可以编程看代码的软件
2020-08-11 14:41:43AIDE是一个Android/Java等集成开发环境,可以在Android手机上进行Android软件和游戏的开发,而无需借助PC端。 AIDE [1] 不仅仅是一个编辑器,而是支持编写-编译-调试的IDE,开发人员可以在Android手机或者平板机... -
手机APP游戏/软件/资源下载站源码/软件盒子整站源码
2022-03-09 21:55:29手机APP游戏下载、软件资源下载网站源码,软件盒子整站源码分享。比较适用于小工具、APP软件分享类网站源码使用。 安装教程 1:上传网站源码 / 解压 2:修改数据库 config / database.php 文件修改数据库链接 3:... -
三款游戏内存修改工具源代码
2006-05-31 10:41:11MemEdit0.2.rar (需要RX6控件) 侯思松先生写的 一个快速的游戏修改工具的Delphi6源代码 和金山游侠之类的很接近,速度较快。 -
unity游戏解包和修改代码
2021-03-06 22:35:562.DNSPY 用于反编译代码并进行修改 3.ILSPY 同上,差不多功能 资源部份 下面拿steam游戏《传说法师》作为例子进行解包。 游戏资源可以使用UnityStudio软件获取。如果是安卓包可以将后缀改为.zip解压出文件夹。首先... -
java源码包33个实例源码阳光酒店管理系统手机游戏J2ME毕业设计书籍管理系统网络电视源代码TV
2021-04-22 19:55:56用JAVA做的聊天软件,有安装程序和源代码.rar 用java写的SFTP代码.rar 用Java加密类实现DES、RSA及SHA的加密算法.rar 用jdom解析xml.rar 网上书店.rar 网络电视源代码TV-Browser.rar 网络蚂蚁Java版.rar 网页浏览器.... -
VC 课程设计 背单词软件源代码.rar
2019-07-10 12:19:30VC 课程设计 背单词软件源代码,VC 课堂作业,在visual studio2010环境下开发的背单词程序,附有完整的源代码,程序采用文件存储信息,有单词复习,修改录,单词游戏,单词测验等功能。背单词过程中,若忘记单词,可... -
absoluterisk:绝对风险游戏源代码-ab source code
2021-03-24 17:46:48绝对风险游戏源代码 绝对风险是一款经典的“世界统治风险”游戏,您可以在其中征服世界。 该游戏最多可玩10位玩家。 请报告错误或将您的想法发送至: 主要功能包括:支持人类或人工智能玩家,每个游戏最多支持十个... -
八种实用的免费游戏开发软件工具
2021-04-07 11:43:40【51CTO.com快译】如今,随着技术门槛的降低,任何人都可以使用正确的软件和稍懂一点的专业知识,来制作视频游戏。当然,这并不意味着游戏开发就此变得容易。如果您想让自己的游戏在视觉效果上感觉不错,那么就算是... -
python游戏最简单代码-python基础练习之几个简单的游戏
2020-11-01 12:05:09文档介绍利用python写“猜数字”,“猜词语”,“谁是卧底”这三个游戏,从而快速掌握python编程的入门知识,包括python语法/列表/元组/字典/流程控制/库函数等等。环境参数linux平台,python3.4。需要在linux中把... -
游戏修改工具源代码(修正)
2006-02-23 09:05:59游戏修改软件全部源代码 -
AvaWeb - The Avatar Webgame:越南制作的免费和开放源代码的Avatar网络游戏-开源
2021-04-29 08:28:38Avaweb是面向开发人员的免费开放源代码网站游戏。 此源使用PHP和MySQL数据库。 您可以免费下载并根据需要进行更改。 -
gg 修改器游戏被保护_王者荣耀安卓和IOS修改超长游戏名字方法
2020-10-25 19:38:47王者荣耀安卓和IOS修改超长游戏名字方法 21个字超长游戏昵称代码方法在文末者荣耀中,游戏ID虽然并不是被玩家所看重,但是更多的00后玩家喜欢一些酷炫一些并且与众不同的名字,因此又不少玩家都尝试在游戏ID中加入... -
微信小游戏开发入门:示例代码介绍
2018-06-22 17:51:10看前几天的科技新闻,微信中的“跳一跳”小游戏从去年12月发布,截至到今年3月份已经积累了3.9亿玩家,这是一个多么恐怖的数字,“跳一跳”游戏带火了整个微信小游戏开发圈。微信小游戏是个什么东西呢?参考一下万能... -
24个c++游戏源码
2020-12-22 01:38:1424个c++游戏源码是网友分享的经典游戏源码,采用c++语言编写,对于学习c++的朋友很有帮助,可以帮助你提升编程语言能力!C++语言介绍C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据...