AbemaTV-无料インターネットテレビ局 附:破解教程(支持部分日系锁区限制软件)

注:仅破解区域限制,观看还需挂日本IP梯子 ,在此不提供梯子。

AbemaTV-无料インターネットテレビ局”是一个日本网络电视台“アベマTV”出的视频 App,里面不少节目和视频都是免费的。

但是我安装后发现这个 App 有区域限制,启动时全屏显示 “このサービスはお住まいの地域からはご利用になれません。”提示,无法继续(已经用了日本IP的shadowsocks)。

简单地尝试下破解了这个 App 的区域限制。步骤如下:

1. 从 apkpure 下载 AbemaTV app 最新版的 apk

2. 用 apktool 这个工具解包下载的 apk. apktool 是一个 java 包,需要安装 Java 运行。

java -jar apktool_2.2.4.jar d “AbemaTV 无料インターネットテレビ局_v3.5.1_apkpure.com.apk”

3. 解包后的文件在当前目录下 “AbemaTV 无料インターネットテレビ局_v3.5.1_apkpure.com/” 文件夹。其中,res/ 是资源文件,smali/ 和 smali_classes2/ 是 java 源码编译后的 smali 文件。这个 app 好像没怎么加密什么的。

在整个目录里搜索 “このサービスはお住まいの地域からはご利用になれません。” 字符串,找到:

<string name=”error_abroad_description”>このサービスはお住まいの地域からはご利用になれません。</string>

搜索 error_abroad_description,找到:res/values/public.xml:
<public type=”string” name=”error_abroad_description” id=”0x7f0a0114″ />

搜索 0x7f0a0114,找到 smali_classes2tvabemacomponentsfragmenta.smali:

.class public Ltv/abema/components/fragment/a;
.super Ltv/abema/components/fragment/u;
.source “AbroadFragment.java”

const v1, 0x7f0a0114
invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(I)V

可以看到,这是一个 Fragment 类编译成的 smali 文件,当 app 检测到当前设备是日本以外区域(检测方法未知,可能是检测手机sim卡运营商信息)时就在当前 activity 上加载这个全屏 fragment 以阻止使用,所以最简单的破解方法就是把这个“创建并显示 Fragment”部分代码去掉。

搜索 “Ltv/abema/components/fragment/a”,找到:
smalitvabemaajk.smali

.line 202
const-class v0, Ltv/abema/components/fragment/a;
invoke-virtual {p0, v0}, Ltv/abema/a/jk;->I(Ljava/lang/Class;)V

看起来就是这里了,将这几行用 “#” 注释掉。

4. 最后,用 apktool 重新打包修改后文件生成 apk,参数就是之前解包apk文件所在目录

java -jar apktool_2.2.4.jar b “AbemaTV 无料インターネットテレビ局_v3.5.1_apkpure.com”

生成的 apk 在 AbemaTV 无料インターネットテレビ局_v3.5.1_apkpure.com/dist 文件夹下。

生成的 apk 是未签名的,无法直接安装。可以手工用 java bin目录下 keytool 工具生成密钥,jarsigner 工具给 apk 签名。(具体过程网上资料很多);也可以用直接用 apk-signer 这个图形化工具来进行

最后在手机上安装生成的 AbemaTV_v3.5.1_SIGNED_UNALIGNED.apk 即可,实测能够正常进入主界面并观看视频,搞定。

修改 app 包后无法使用 Google Play IAP 内购功能。最完美的破解 root 检测方法仍然是安装 XPosed + rootcloak

类似方法解除 Hulu 日本Android app的 root检测:

由错误提示“OSの整合性チェックに失败しました。Root権限を取得している场合、起动できません。”跟踪找到某个Fragment:


const-string v2, “su”

invoke-virtual {v1, v2}, Ljava/lang/Runtime;->exec(Ljava/lang/String;)Ljava/lang/Process;
:try_end_0
.catch Ljava/io/IOException; {:try_start_0 .. :try_end_0} :catch_0
.catchall {:try_start_0 .. :try_end_0} :catchall_0

move-result-object v0

const v1, 0x7f0900e8

这里通过运行 su 检测是否有异常来判断机器是否已 root,所以最简单的移除方法就是把 “su” 随便改成个不存在对应命令的名字。

如果App是通过检测sim卡运营商限制区域的,那么应该可以通过改手机运营商代码来骗过(需要root),这样就不需要改apk了。日本主要移动ISP的运营商代码
docomo:4401020
softbank: 4402081
au: 4540492, 4405014

附上下载链接:

链接:https://pan.baidu.com/s/12RU3xFjaA-_rCr2kaiTFEA
提取码:o2yn

合并一行多列单元格

  • 合并1行多列可以使用\multicolumn{cols}{pos}{text}来实现
\documentclass[a4paper,12pt]{report}
\usepackage[UTF8,nopunct]{ctex}

\begin{document}

\begin{table}
	\centering
	\begin{tabular}{|c|c|c|c|}
		\hline
		\multicolumn{2}{|c|}{合并一行两列} & 三 & 四 \\
		\hline
		1 & 2 & 3 & 4 \\
		\hline
	\end{tabular}
\end{table}

\end{document}

合并多行一列单元格

  • 合并多行1列单元格可以用multirow包中的\multirow{rows}{width}{text}来实现
  • 注意这里的第2个参数是{width},与\multicolumn第2个参数不同。如果不确定{width}需要填什么,就将其替换为*,如代码中所示

这次ACM的题感觉思考得太慢了,脑子好久不动,思考能力也下降了

来总结一下做第一题的思路吧

先贴题目

Problem A: zbj的糖果

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 101  Solved: 12
[Submit][Status][Web Board]

Description

现在zbj跟n个小朋友在玩一个游戏。首先,这n个小朋友的编号分别为1,2,3…n,每个小朋友手里都有不同数量的糖果,每个小朋友手里的糖果数量刚好等于他们的编号。

现在他们按顺序围着一张桌子坐下,即 x 的两边分别坐的是x – 1 和 x + 1,n 和 1 相邻。

现在zbj可以从编号为1的小朋友开始,把他们手里的糖果拿走,当然为了游戏乐趣,对于每一轮游戏,zbj决定规定一个数字 k ,表示他每隔 k 个小朋友,就会拿走当前小朋友手里的糖果,当某次又要拿走编号为 1 的小朋友手里的糖果时,他就会停止这轮游戏。

比如有6个小朋友,规定k为4,即n=6,k=4,zbj拿糖果的顺序为:1→5→3→1 

现在zbj想知道,按照这样的游戏规则,最多能拿到手的糖果总数有几种不同的情况?

Input

输入只包含一个正整数n(2<=n<=10^9)表示有n个小朋友。

Output

zbj最后能拿到手里的糖果总数的数量集合,按升序输出,两个数字中间用空格隔开,末尾没有空格。

Sample Input

6

Sample Output

1 5 9 21

HINT

对于样例的解释。有以下6种情况

题目理解:找一下规律就知道,先将所有最小因子求出来,然后列出所有可能的取法

解题代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
int coun=0;
ll s[10000];
ll f(int i,int n){
    ll sum=0,t;
    t=n/i;
    sum=t+i*(t-1)*t/2;
    return sum;
}

void g(int pr[],int j,int n,ll s[],ll sum){
   for(int i=0;i<j;i++){
        sum*=pr[i];
        if(sum>=n) {break;}
        if(n%sum!=0) {sum/=pr[i];continue;}
        s[coun++]=f(sum,n);
        g(&pr[i],j-i,n,s,sum);
        sum/=pr[i];
   }
}

int main(){
    int pr[10000];
    int i,j=0,t,n;
    cin>>n;
    t=n;
    for(i=2;i<=t;i++){
        if(t%i==0) {
            while(t%i==0&&t) t/=i;
            pr[j++]=i;
        }
    }
  /*  for(i=0;i<j;i++){
        cout<<pr[i]<<" ";
    }*/
    g(pr,j,n,s,1);
    s[coun++]=f(1,n);
    s[coun++]=1;
    sort(s,s+coun);
    cout<<s[0];
    for(i=1;i<coun;i++){
        cout<<" "<<s[i];
    }
    cout<<endl;
    return 0;
}

有些细节的地方自己以后再来理解一下

测量int数组的正整数个数

一次想用strlen得到int数组内元素个数,发现不行,又查了半天也没找到有类似的对int能计算实际储存个数的函数,就把一些能间接达到效果的奇怪的方法写出来了

#include <bits/stdc++.h>

using namespace std;

int strlen(int a[],int len){
    int coun=0,t;
    t=len;
    while(t--){
        if(a[t]==-1) coun++;
        else break;
    }
    return len-coun;
}
int main(){
    int a[10],len;
    memset(a,-1,sizeof(a)); //数组初始化-1
    a[0]=1;
    a[1]=2;
    a[2]=3;
    a[3]=4;
    cout<<strlen(a,10)<<endl;   //10为数组最大空间
    return 0;
}

这个程序只有效于从0开始的地址连续的自然数

注意在初始化数组为-1后,sizeof(a)会有问题,不能再使用sizeof

关于如何搭建一个个人网站

1. 购买合适的域名

腾讯云,阿里云等等任何可购买域名的地方。(价格是一样的)建议选后缀为.com的, 基本60块钱一年(别的后缀一般更便宜,你可以搜一下.com和其他的一些区别)

2. 购买虚拟主机或者云服务器

如果要求不高的话,推荐一个很便宜的购买地址,标准18元一年,名字叫云上萝莉

3. 在购买域名的地方解析你的主机

在管理主机的地方一般会有绑定域名,可以看到需要解析的地址,复制后到腾讯云购买的地方,找到域名管理,然后点解析,选择适合的前缀和解析方式,添加上去即可

4. 在主机绑定域名

注意好你自己设的前缀一般是以 xxx.域名.com形式进行绑定

5. 去下载一个wordpress或者hexo或者typecho

个人推荐wordpress,适合新手并且比较方便,也很好看。hexo支持个性化内容,但需要自己手动搭建,要求一定的代码能力。typecho非常简洁,适合特别喜欢简洁的人。三种方式都支持自定义一些内容,更多的搭建方式请自行百度

6. 将下载好的文件zip上传到主机内进行安装

上传到主机后打开自己的域名网站可以进行安装,具体一些参数,请自己寻找或百度填入

感谢观看