成品效果
开发工具
- NP管理器/MT管理器
开发原理
逆向ChatAir成品APP:
教程开始
安装好可以自己去看看这个app的状态
提取安装包->查看->点开一个dex->Dex编辑器+±>全选
修改默认API服务地址
点击常量->过滤->输入api.openai.com
->不要任何勾选->确定->点击在当前结果中替换->换成你自己的One-API、New-API服务(如果没有ssl,就搜https://api.openai.com
替换http://xx.com
)
别忘记点击应用修改
去除全局AI参数中的GPT4模型Google模型
常量->过滤->输入GPT-3.5
确认
过滤结果我们点击第一个搜索
我们修改UserConfig,点击搜索结果
给大家看一下这个initAiModeList方法
private void initAiModelList() {
LinkedHashMap<Integer, AiModelBean> linkedHashMap = this.aiModelList;
if (linkedHashMap != null) {
linkedHashMap.clear();
} else {
this.aiModelList = new LinkedHashMap<>();
}
this.aiModelList.put(1, new AiModelBean("GPT-3.5", "gpt-3.5-turbo", true));
this.aiModelList.put(2, new AiModelBean("GPT-3.5-0613", "gpt-3.5-turbo-0613", false));
this.aiModelList.put(3, new AiModelBean("GPT-3.5-16k", "gpt-3.5-turbo-16k", true));
this.aiModelList.put(4, new AiModelBean("GPT-3.5-16k-0613", "gpt-3.5-turbo-16k-0613", false));
this.aiModelList.put(12, new AiModelBean("GPT-3.5-0125", "gpt-3.5-turbo-0125", true));
this.aiModelList.put(5, new AiModelBean("GPT-4", "gpt-4", true));
this.aiModelList.put(6, new AiModelBean("GPT-4-0613", "gpt-4-0613", false));
this.aiModelList.put(7, new AiModelBean("GPT-4-32k", "gpt-4-32k", true));
this.aiModelList.put(8, new AiModelBean("GPT-4-32k-0613", "gpt-4-32k-0613", false));
this.aiModelList.put(9, new AiModelBean("GPT-4-1106-preview", "gpt-4-1106-preview", false));
this.aiModelList.put(11, new AiModelBean("GPT-4-0125-preview", "gpt-4-0125-preview", true));
this.aiModelList.put(10, new AiModelBean("GPT-4-vision-preview", "gpt-4-vision-preview", "GPT-4-vision-preview (Picture model)", true));
initGoogle();
this.aiModelList.put(0, new AiModelBean(LocaleController.getString("CustomModel", R.string.CustomModel), "custom Model", true));
}
明显看到 使用put
方法向aiModelList
中添加多个AiModelBean
实例。
而且参数存在一个布尔值,如果是flase则不显示(可以去参考app内部的AI全局参数)。
我们把这部分的GPT4已经我们不想公开的GPT3.5模型删掉(只是不put而已)或者给一个false。
我这边给大家提供删掉后的代码
.method private initAiModelList()V
.registers 9
.line 495
iget-object v0, p0, Lorg/telegram/messenger/UserConfig;->aiModelList:Ljava/util/LinkedHashMap;
if-eqz v0, :cond_8
.line 496
invoke-virtual {v0}, Ljava/util/LinkedHashMap;->clear()V
goto :goto_f
.line 498
:cond_8
new-instance v0, Ljava/util/LinkedHashMap;
invoke-direct {v0}, Ljava/util/LinkedHashMap;-><init>()V
iput-object v0, p0, Lorg/telegram/messenger/UserConfig;->aiModelList:Ljava/util/LinkedHashMap;
.line 500
:goto_f
iget-object v0, p0, Lorg/telegram/messenger/UserConfig;->aiModelList:Ljava/util/LinkedHashMap;
const/4 v1, 0x1
invoke-static {v1}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
move-result-object v2
new-instance v3, Lorg/telegram/tgnet/AiModelBean;
const-string v4, "GPT-3.5"
const-string v5, "gpt-3.5-turbo"
invoke-direct {v3, v4, v5, v1}, Lorg/telegram/tgnet/AiModelBean;-><init>(Ljava/lang/String;Ljava/lang/String;Z)V
invoke-virtual {v0, v2, v3}, Ljava/util/LinkedHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
.line 501
iget-object v0, p0, Lorg/telegram/messenger/UserConfig;->aiModelList:Ljava/util/LinkedHashMap;
const/4 v2, 0x2
invoke-static {v2}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
move-result-object v2
new-instance v3, Lorg/telegram/tgnet/AiModelBean;
const-string v4, "GPT-3.5-0613"
const-string v5, "gpt-3.5-turbo-0613"
const/4 v6, 0x0
invoke-direct {v3, v4, v5, v6}, Lorg/telegram/tgnet/AiModelBean;-><init>(Ljava/lang/String;Ljava/lang/String;Z)V
invoke-virtual {v0, v2, v3}, Ljava/util/LinkedHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
.line 502
iget-object v0, p0, Lorg/telegram/messenger/UserConfig;->aiModelList:Ljava/util/LinkedHashMap;
const/4 v2, 0x3
invoke-static {v2}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
move-result-object v2
new-instance v3, Lorg/telegram/tgnet/AiModelBean;
const-string v4, "GPT-3.5-16k"
const-string v5, "gpt-3.5-turbo-16k"
invoke-direct {v3, v4, v5, v1}, Lorg/telegram/tgnet/AiModelBean;-><init>(Ljava/lang/String;Ljava/lang/String;Z)V
invoke-virtual {v0, v2, v3}, Ljava/util/LinkedHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
.line 503
iget-object v0, p0, Lorg/telegram/messenger/UserConfig;->aiModelList:Ljava/util/LinkedHashMap;
const/4 v2, 0x4
invoke-static {v2}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
move-result-object v2
new-instance v3, Lorg/telegram/tgnet/AiModelBean;
const-string v4, "GPT-3.5-16k-0613"
const-string v5, "gpt-3.5-turbo-16k-0613"
invoke-direct {v3, v4, v5, v6}, Lorg/telegram/tgnet/AiModelBean;-><init>(Ljava/lang/String;Ljava/lang/String;Z)V
invoke-virtual {v0, v2, v3}, Ljava/util/LinkedHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
.line 504
iget-object v0, p0, Lorg/telegram/messenger/UserConfig;->aiModelList:Ljava/util/LinkedHashMap;
const/16 v2, 0xc
invoke-static {v2}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
move-result-object v2
new-instance v3, Lorg/telegram/tgnet/AiModelBean;
const-string v4, "GPT-3.5-0125"
const-string v5, "gpt-3.5-turbo-0125"
invoke-direct {v3, v4, v5, v1}, Lorg/telegram/tgnet/AiModelBean;-><init>(Ljava/lang/String;Ljava/lang/String;Z)V
invoke-virtual {v0, v2, v3}, Ljava/util/LinkedHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
.line 505
iget-object v0, p0, Lorg/telegram/messenger/UserConfig;->aiModelList:Ljava/util/LinkedHashMap;
invoke-static {v6}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
move-result-object v2
new-instance v3, Lorg/telegram/tgnet/AiModelBean;
sget v4, Lorg/telegram/messenger/R$string;->CustomModel:I
const-string v5, "CustomModel"
invoke-static {v5, v4}, Lorg/telegram/messenger/LocaleController;->getString(Ljava/lang/String;I)Ljava/lang/String;
move-result-object v4
const-string v5, "custom Model"
invoke-direct {v3, v4, v5, v1}, Lorg/telegram/tgnet/AiModelBean;-><init>(Ljava/lang/String;Ljava/lang/String;Z)V
invoke-virtual {v0, v2, v3}, Ljava/util/LinkedHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
return-void
.end method
注意:一定要替换干净,还有.不要忘记!
注意:一定要替换干净,还有.不要忘记!
注意:一定要替换干净,还有.不要忘记!
修改app名称
点击resources.arsc点击Arsc编辑器++
常量->过滤->ChatAir
这次要勾选完全匹配
别看搜索的结果多,没用,他这是对于多种语言的。我们直接全部替换就好了,反正我们面多的都是中国人!
回到常量->在当前替换->换成你自己想要的APP名称
替换的内容别忘记改,而且我们这里勾选了完全匹配,记得区分大小写
Cha,替换完记得应用!
替换应用图标
点击图标,提取
随后会给你一个压缩包,里面有一个res文件夹,这里面的文件就是我们要替换的。
在我们apk的res目录下,把压缩包res文件夹中的全部png文件,搜索替换成你自己的图标即可。
也就是按照左侧的名字,修改apk里面的图片
换成你自己的图片哦!这里就不演示了!
DEX注入,添加自定义弹窗(点睛之笔啊!!)
把我们的OnlineDialog.dex
添加到app中,然后重命名classes5.dex。
安装我们的app,打开Activity记录
记录这条activity
org.telegram.ui.LaunchActivity
进入dex编辑器,类名搜索
定位到
onCreate
方法(为什么是onCreate: onCreate()
方法是Activity生命周期中的第一个方法,当一个Activity被创建时,它会被调用)然后把我们的配置代码粘贴到里面
const-string v0, "https://sharechain.qq.com/9bd7fa41bb14bd6db850f526d05d65ac"
invoke-static {p0, v0}, Lmutil/OnlineDialog;->show(Landroid/app/Activity;Ljava/lang/String;)V
大家自己开发的时候,自己访问我的在线弹窗连接复制里面的内容替换成你的。我这里使用的qq收藏的链接!
然后保存退出,在线弹窗也配置好了!
最后成果
弹窗配置下载:
https://xcyp.lanzoub.com/i51ce1v1p4ra
解压密码:linux.do-pastking
反馈邮箱替换就自己去搜吧!很简单!!!
总结
大家自行尝试哈!成功的可以在评论区附上你的截图!
如果这篇帖子对你有帮助,记得三连哦!嘻嘻
往期回顾
https://linux.do/t/topic/56465
https://linux.do/t/topic/53704