这是一个可以在任何应用界面打开的负一屏工具,你可以添加常用的应用,快捷方式,网址,图片,联系人以及小工具,当然你也可以从你的系统小部件中选择你想要的任何部件添加上去,只需轻轻一滑,一切尽在眼前
前段时间上论坛发现我的帖子和头像都不见了,当时也没太在意,最近看到说头像不见了是因为一级用户不允许上传头像,升级又需要积分,只好发俩帖子来混混积分了
0、用到的工具:
androidKiller
jadx-gui
DDMS
ida
如果本篇帖子中有什么错误、不足、需要指正的、或者遗漏的地方,热烈欢迎大家,在评论区留言
先把软件签名打开看看有没有什么问题,发现启动后负一屏界面不显示东西,也添加不了东西
1、过签名
在dex搜索signatures
,获取签名但没有任何判断,猜测可能在so文件中做校验
IDA加载libbase.so
文件,shift+f12
打开字符串窗口,搜索signatures
双击进入查看引用函数
f5
查看伪代码,但这伪代码看的有些许难受
我们找到函数第一个形参,按y
,把数据类型修改为JNIEnv*
,这样看起来就舒服多了
简单看了一下,发现函数最终返回一个bool
型变量v40
,v40
在函数开头和判断完赋值,我们可以把开头的v40
赋值为1,然后不让他判断了
ctrl+alt+k
打开keypatch
修改汇编保存;
当然也可以简单的修改为
MOV.W R0, #1
BX LR
把so文件塞回apk,测试可用
点击付费,提示:您还没有激活高级版,请到【关于】中点击获取
2、解锁付费功能
那我们到Androidkiller
中所搜这个字符串,什么都没有,字符串似乎被加密或者放在so中了,用DDMS分析一下,toast是Oo00O0oo.onClick
调用O0oOOo0o.Oo0O00Oo
弹出的
进入Oo00O0oo.onClick
,这个弹窗是根据this.Ooo00OOO
判断的,按住ctrl
跟进去,发现this.Ooo00OOO
是由Ooo00OO0.Ooo000Oo()
的值确定的,再次跟进去,把这个函数的返回值改为返回true
再次打包,其他的都能使用了,但还有一个问题,就是选择新建页面
的时候没有任何反应
那就找一下这个点击事件,分析一下
DDMS分析所得点击事件在com.example.xf.negativeonescreen.pro.O0OOOo00
类中,根据传入参数类型找到调用的方法在com.example.xf.negativeonescreen.pro.O0OOOo0o
类,又是调用方法,继续跟进
最终到达这个地方,可以看出调用函数判断,不为true则什么都不干,问题可能就出现在这里,跟进判断的函数
发现是native层的函数,看了下调用这个函数有几处,直接改so文件吧
再次载入libbase.so
文件,发现输出函数并没有我们的这个函数,可能是动态注册,找到JNI_OnLoad
函数
根据java方法名我们找到isActivated
,进去,这个函数在这里做各种验证
int __fastcall isActivated(JNIEnv *a1, int a2, int a3)
v12 = 1;
v11 = (*a1)->NewStringUTF(a1, "sign");
v10 = 0;
v9 = 0;
v8 = (void *)j_getLocalDeviceId(a1, a2, a3);
if ( j_isEmpty(a1, v8) )
{
v12 = 0;
}
else
{
v9 = (void *)j_getStringPreference(a1, a3, v11);
if ( j_isEmpty(a1, v9) )
{
v12 = 0;
}
else
{
v10 = (void *)j_makeMD5(a1, v8);
if ( j_equals(a1, v10, v9) )
{
v7 = (*a1)->NewStringUTF(a1, "info");
v6 = (void *)j_getStringPreference(a1, a3, v7);
v5 = (void *)j_getDeviceInfo(a1);
if ( !j_equals(a1, v6, v5) )
{
v4 = (*a1)->NewStringUTF(a1, "nos_count");
j_putStringPreference(a1, a3, v4);
v12 = 0;
(*a1)->DeleteLocalRef(a1, v4);
}
(*a1)->DeleteLocalRef(a1, v7);
(*a1)->DeleteLocalRef(a1, v6);
(*a1)->DeleteLocalRef(a1, v5);
}
else
{
v12 = 0;
}
}
}
(*a1)->DeleteLocalRef(a1, v11);
(*a1)->DeleteLocalRef(a1, v8);
(*a1)->DeleteLocalRef(a1, v10);
(*a1)->DeleteLocalRef(a1, v9);
return v12;
最后还是返回bool
型,我们简单的改为上面讲的
MOV.W R0, #1
BX LR
塞回去,打包,测试,可用