逆向教程-当乐启动图分析手记

news/2025/1/16 16:17:13/

demo-愤怒的小鸟当乐版下载地址:
http://pan.baidu.com/s/1ntDnlSt

首先反编译,回编译,然后将apk放到模拟器运行,得到如下画面:
这里写图片描述
是不是看着很不爽,作为游戏发烧友来说,任何延长游戏启动的画面都是在XX游戏!所以就有了本课的目的:去除splash启动图!
用AK神器反编译后,进入入口:
这里写图片描述
点开java代码查看:
这里写图片描述
找到oncreate这个函数,函数如下:
public void onCreate(Bundle paramBundle)
{
super.onCreate(paramBundle);
this.component = getClassText();
RelativeLayout localRelativeLayout = new RelativeLayout(this);
localRelativeLayout.setBackgroundColor(-1);
ImageView localImageView = new ImageView(this);
localImageView.setImageBitmap(getAdsImage());
if ((imageMD5cmp == null) || (imageMD5cmp.length != imageMD5.length))
{
finish();
return;
}
for (int i = 0;; i++)
{
if (i >= imageMD5.length)
{
localImageView.setId(1000);
RelativeLayout.LayoutParams localLayoutParams = new RelativeLayout.LayoutParams(-2, -2);
localLayoutParams.addRule(13, -1);
localImageView.setLayoutParams(localLayoutParams);
localRelativeLayout.addView(localImageView);
setContentView(localRelativeLayout);
start();
return;
}
if (imageMD5cmp != imageMD5)
{
finish();
return;
}
}
}


一般看到函数有判断的时候首先看看判断中的语句
我们可以在上述代码中看到判断中的语句是finish()而后return
而finish函数一般就是结束当前页面的意思,那猜测会不会是结束当前页面直接进入游戏呢?
我们可以从smali中找到相应的调用finish的语句:
invoke-virtual {p0}, Lcom/inject/InjectActivity;->finish()V
我们直接将他插入到定义imageview之前,看一下什么效果
结果模拟器非常不给我面子,闪退了。看来想的跟我不同啊。
那我们继续来看oncreate函数,顺着看,好像发现了什么
对,我们看到了start();函数。
那就可以大致的判断这个什么意思了。大概就是这个启动图专属activity,这个页面结束,那就跳到我们游戏中
大概的思路就是启动start函数,并且结束当前页面。
————————–那我们将启动新页面,以及结束当前页面结束这两句调用就好
smali方面的代码,将以下代码插入到定义图片之前(new-instance v2, Landroid/widget/ImageView;):
invoke-direct {p0}, Lcom/inject/InjectActivity;->start()V

invoke-virtual {p0}, Lcom/inject/InjectActivity;->finish()V

打包后我们看到的效果是,启动以下,闪退了···诶,不对,又进去了
那么酱紫可以确定一个事情
invoke-direct {p0}, Lcom/inject/InjectActivity;->start()V
是从启动页到游戏的关键,剩下都是渣渣
那么,我们将oncreate函数修改为这样(已经知道思路的那就可以精简代码了)
.method public onCreate(Landroid/os/Bundle;)V
.locals 8
.param p1, “savedInstanceState” # Landroid/os/Bundle;

.prologue
const/4 v7, -0x1#v7=(Byte);
const/4 v6, -0x2.line 152
#v6=(Byte);
invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V.line 153
invoke-direct {p0}, Lcom/inject/InjectActivity;->getClassText()[Ljava/lang/String;move-result-object v4#v4=(Reference,[Ljava/lang/String;);
iput-object v4, p0, Lcom/inject/InjectActivity;->component:[Ljava/lang/String;.line 155
new-instance v3, Landroid/widget/RelativeLayout;#v3=(UninitRef,Landroid/widget/RelativeLayout;);
invoke-direct {v3, p0}, Landroid/widget/RelativeLayout;-><init>(Landroid/content/Context;)V.line 156
.local v3, "rl":Landroid/widget/RelativeLayout;
#v3=(Reference,Landroid/widget/RelativeLayout;);
invoke-virtual {v3, v7}, Landroid/widget/RelativeLayout;->setBackgroundColor(I)Vinvoke-direct {p0}, Lcom/inject/InjectActivity;->start()Vinvoke-virtual {p0}, Lcom/inject/InjectActivity;->finish()Vreturn-void   

.end method

代码精简过后,我们继续朝着start函数进发,得到如下结果:
private void start()
{
if (!copyDir()) {
new Timer().schedule(new MyTask(this.component), 2500L);
}
}

这里我们明显看到了一个比较显眼的2500L,据我所知,smali中以L为单位的一直都是显示的时间的,没有看到其他的用途

看到时间那就好办了,时间改为一毫秒就好,即将2500L改为1L,那我们定位到smali函数块,修改为如下:

.method private start()V
.locals 5

.prologue
.line 328
invoke-direct {p0}, Lcom/inject/InjectActivity;->copyDir()Zmove-result v0.line 329
.local v0, "flag":Z
#v0=(Boolean);.line 330
new-instance v1, Ljava/util/Timer;#v1=(UninitRef,Ljava/util/Timer;);
invoke-direct {v1}, Ljava/util/Timer;-><init>()V.line 331
.local v1, "timer":Ljava/util/Timer;
#v1=(Reference,Ljava/util/Timer;);
new-instance v2, Lcom/inject/InjectActivity$MyTask;#v2=(UninitRef,Lcom/inject/InjectActivity$MyTask;);
iget-object v3, p0, Lcom/inject/InjectActivity;->component:[Ljava/lang/String;#v3=(Reference,[Ljava/lang/String;);
invoke-direct {v2, p0, v3}, Lcom/inject/InjectActivity$MyTask;-><init>(Lcom/inject/InjectActivity;[Ljava/lang/String;)V#v2=(Reference,Lcom/inject/InjectActivity$MyTask;);
const-wide/16 v3, 0x1#v3=(LongLo);v4=(LongHi);
invoke-virtual {v1, v2, v3, v4}, Ljava/util/Timer;->schedule(Ljava/util/TimerTask;J)V.line 333
.end local v1    # "timer":Ljava/util/Timer;return-void

.end method

修改完了以后,打包,安装,进入游戏,发现没有当乐启动图了呀,好开森!
最后总结一下思路:查看oncreate函数,查找关键调用函数,修改时间长度,[处女座的可以精简一下代码],保存


http://www.ppmy.cn/news/628297.html

相关文章

国内手机游戏营收6成靠山寨手机 安卓不赚钱

http://cd.qq.com/a/20110608/001085.htm 腾讯科技讯&#xff08;雷建平&#xff09;6月8日消息&#xff0c;尽管Android、iPhone在国内火热&#xff0c;国内手机游戏厂商却不是靠这些流行平台赚钱。据手机游戏厂商摩卡CEO宋啸飞(微博)透露&#xff0c;国内手机游戏厂商收入5成…

游戏行业常见术语

游戏行业常见术语 https://www.jianshu.com/p/65eea701914b 游戏行业术语 1. 【UCD】 以用户为中心的设计 user-centered design 2. 【UE】 用户体验 user experience 3. 【HCI】 人机交互 human-computer interaction(相互作用) [ˌɪntərkʃn] 4. 【QC】 品质控制 qua…

当乐网CEO肖永泉:手机游戏赚钱已经不成问题

“手机游戏的最大特点就是太容易赚到钱。”12月9日&#xff0c;在《中国企业家》杂志举办的“中国企业家领袖”年会——“APP&#xff0c;黄金时代如何掘金”圆桌分论坛上&#xff0c;当乐网CEO肖永泉短短一句话&#xff0c;便语惊四座。在诸多开发商苦苦寻找赢利模式时&#x…

gameloft java 游戏_每一款JAVA游戏都是经典,但只有四款游戏,是90%玩家从小玩到大...

2000年彩屏手机开始流行,诺基亚作为当年世界第一的手机厂商,更是研发出了多款造型酷炫的手机,例如翻盖、推盖以及后来的触屏机,都曾被我们使用过。我还记得当年小的时候,拿着爸爸的手机在上面搜索和下载各种游戏,以至于后来他的话费经常隔三差五地就要充5、60块钱,毕竟当…

熟知ios与android游戏渠道的区别,艾瑞:2013Q4中国iOS官方游戏分发渠道和Android游戏分发渠道产品榜单热门产品情况...

导语&#xff1a;在2013Q4中国iOS官方游戏分发渠道每日Grossing-TOP10产品榜单和2013Q4中国Android游戏分发渠道每日曝光量TOP10产品榜单各自曝光频次最高的20款产品中&#xff0c;游戏类型方面&#xff0c;前者榜单上大多为中重度游戏&#xff0c;后者榜单上大多为轻度游戏&am…

一个java游戏有各种天书三国,机号申请的网络游戏,天书九卷,这游戏是免 的,里...

话题&#xff1a;机号申请的网络游戏,天书九卷,这游戏是免 的,里面的回答1&#xff1a;不能了。。。。。话题&#xff1a;登陆不了jar格式的网络游戏、怎么回事&#xff1f;3g卡 问题详情&#xff1a;登陆不了jar格式的网络游戏、具体是这样的&#xff1a;我玩的是一回答1&…

【JS 逆向百例】当乐网登录接口参数逆向

文章目录 声明逆向目标逆向过程抓包分析参数逆向 完整代码d_cn_encrypt.jsd_cn_login.py 声明 本文章中所有内容仅供学习交流&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#x…