[转载] 4. JebAPI 之 jeb.api.ui
本文转载自: https://www.zybuluo.com/oro-oro/note/145250
JebInstance可以通过getUI()方法来获得jeb.api.ui.JebUI。
JebUI 下面有很多View,如AssemblyView, JavaView等等。
JebUI可以通过getView(View.Type viewtype)方法获得对应的View。
具体类型在jeb.api.ui.View.Type中:
| 类型 | 说明 |
|---|---|
| ASSEMBLY | 反汇编界面 |
| CLASS_HIERARCHY | 类层级界面(左) |
| CONSOLE | 控制台(下) |
| JAVA | Java代码界面 |
| MANIFEST | 清单界面 |
| NOTES | 全局评论界面 |
在第3章解密的基础上,让JavaView界面自动刷新,显示解密字符串:
import jeb.api.IScript;
import jeb.api.JebInstance;
import jeb.api.ast.*;
import jeb.api.dex.Dex;
import jeb.api.dex.DexMethod;
import jeb.api.ui.JavaView;
import jeb.api.ui.JebUI;
import jeb.api.ui.View;
import java.util.ArrayList;
import java.util.List;
public class TestASTDecode implements IScript {
public static final byte[] bytes = new byte[]{'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!'};
@Override
public void run(JebInstance jebInstance) {
JebUI ui = jebInstance.getUI();
JavaView javaView = (JavaView) ui.getView(View.Type.JAVA);
Dex dex = jebInstance.getDex();
List<String> classSignatures = dex.getClassSignatures(true);
Constant.Builder cstBuilder = new Constant.Builder(jebInstance);
// 获得decode方法的sig
int methodCount = dex.getMethodCount();
String decodeMtdSig;
for (int i = 0; i < methodCount; i++) {
DexMethod dexMethod = dex.getMethod(i);
int index = dexMethod.getIndex();
decodeMtdSig = dex.getMethod(i).getSignature(true);
if (decodeMtdSig.contains("Lcom/test/helloworld/MainActivity;->decode")) {
// 找出所有使用了该方法的地方
List<Integer> methodReferences = dex.getMethodReferences(index);
for (Integer refIdx : methodReferences) {
DexMethod refDexMethod = dex.getMethod(refIdx);
// 找到AST中对应的Method
Method decompiledMethodTree = jebInstance.getDecompiledMethodTree(refDexMethod.getSignature(true));
// 拿到语句块,遍历所有语句
Block block = decompiledMethodTree.getBody();
int size = block.size();
for (int j = 0; j < size; j++) {
Statement statement = block.get(j);
jebInstance.print(statement.toString());
if (statement instanceof Call) {
Call call = (Call) statement;
Method method = call.getMethod();
jebInstance.print("Call : " + method.getSignature());
List<IElement> subElements = call.getSubElements();
for (IElement element : subElements) {
jebInstance.print("Sub Element : " + element.toString());
if (element instanceof Call) {
Call c = (Call) element;
Method m = c.getMethod();
if (m.getSignature().equals(decodeMtdSig)) {
jebInstance.print(">>> " + decodeMtdSig);
List<IExpression> arguments = c.getArguments();
ArrayList<Integer> arrayList = new ArrayList<Integer>();
for (IExpression expression : arguments) {
if (expression instanceof Constant) {
arrayList.add(((Constant) expression).getInt());
}
}
String str = decode(arrayList.get(0), arrayList.get(1));
jebInstance.print("解密后的字符串 : " + str);
// 将当前语句Call的子元素,替换为解密后的字符串
call.replaceSubElement(element, cstBuilder.buildString(str));
}
}
}
}
}
}
}
}
javaView.refresh();
}
String decode(int a, int b) {
byte[] ab = new byte[]{bytes[a], bytes[b]};
return new String(ab);
}
}
[转载] 4. JebAPI 之 jeb.api.ui的更多相关文章
- [转载] 3. JebAPI 之 jeb.api.ast
本文转载自: https://www.zybuluo.com/oro-oro/note/143651 0. 序 Jeb 本身是支持变量重命名的,所以,混淆了的变量名.类名可以修改. 实际上,它还可以做 ...
- [转载] 1. JebAPI 之 jeb.api
本文转载自: https://www.zybuluo.com/oro-oro/note/142707 JEB API 官方地址:https://www.pnfsoftware.com/apidoc/ ...
- [转载] 2. JebAPI 之 jeb.api.dex
本文转载自: https://www.zybuluo.com/oro-oro/note/142842 1. jeb.api.dex.Dex 这个类代表正在被JEB处理的DEX文件. 要想更好的了解这个 ...
- [转载] ZooKeeper的Java客户端API
转载自 http://www.cnblogs.com/ggjucheng/p/3370359.html http://zookeeper.apache.org/doc/trunk/javaExampl ...
- [转载]Java 8 日期&时间 API
Java 8 日期和时间 声明 本文转自http://www.journaldev.com/2800/java-8-date-localdate-localdatetime-instant,以mark ...
- 转载:21个免费的UI界面设计工具、资源及网站
我们刚刚介绍了移动设计初探:触屏网页设计.本文将介绍一些UI界面与设计使用的元素.软件和网站.内容很丰富,适合用户体验设计师.界面设计师.产品设计师.JS前段开发.手机产品设计以及iPad和平板电脑产 ...
- (转载) ASP.NET(C#) Web Api 通过文件流下载文件到本地实例
下载文件到本地是很多项目开发中需要实现的一个很简单的功能.说简单,是从具体的代码实现上来说的,.NET的文件下载方式有很多种,本示例给大家介绍的是ASP.NET Web Api方式返回HttpResp ...
- (转载)基于Unity~UGUI的简单UI框架(附UIFramework源码)
此博客跟随siki老师的课程笔记生成,感谢siki老师的辛勤付出! 此框架功能较简单,适用于学习,可以很好的锻炼我们的设计思想 框架源码地址: UIFramework litjson.dll下载地址: ...
- (转载)Unity UGUI鼠标点击UI不受影响方法IsPointerOverGameObject
这几天在做捕鱼达人游戏时发现,当鼠标点击UI时,炮台的子弹也会发射子弹,这样会影响用户体验. 然后网上百度了一波,发现在UGUI系统上,EventSystem提供了一些方法.那就是EventSyste ...
随机推荐
- LeetCode() Repeated DNA Sequences 看的非常的过瘾!
All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...
- C#先执行一段sql等后台操作后再提示是否后续操作confrim
应用场景:例如选择一个单据号打击打印后先去数据库检索是否有打打印过,如果有则提示,已打印,是否再打 如果没有则不提示,直接进行打印. 实现原理:多做一个隐藏按钮去实现打印功能,页面上的打印按钮则进行数 ...
- WCF实现客户端自动更新-GenerateFileList
GenerateFileList using System; using System.Collections.Generic; using System.Diagnostics; using Sys ...
- flash cs6导入某些mp3不能的解决办法
安装最新的quicktime 另外还有一个很恶心的办法,可以不用装quicktime. 1.用adobe audio打开一个没问题的mp3, 2.再打开有问题的MP3,全选,复制: 3.切换到没问题的 ...
- [solr] - IKAnalyzer 分词加入
1.下载IK Analyzer中文分词器:http://ik-analyzer.googlecode.com/files/IK%20Analyzer%202012FF_hf1.zip 2.解压出zip ...
- asp.net 网站访问变慢
资料一 单个网站解决方法: 把应用程序池回收时间缩短到300-600分钟,其间回收过程中,需要占用一点CPU资源,没办法,为了稳定性,再把回收时间设为凌晨5点. 多网站解决方法: 视服务器网站的多 ...
- Java 开发必会的 Linux 命令
作为一个Java开发人员,有些常用的Linux命令必须掌握.即时平时开发过程中不使用Linux(Unix)或者mac系统,也需要熟练掌握Linux命令.因为很多服务器上都是Linux系统.所以,要和服 ...
- CoreData 添加新字段
给CoreData添加新属性,就是给数据库加新字段,那么必须要进行数据库版本升级及CoreData数据迁移: 具体操作是 1.选择DemoCoreData.xcdatamodeld 文件,Editor ...
- web.xml 的加载过程
初始化过程: 在启动Web项目时,容器(比如Tomcat)会读web.xml配置文件中的两个节点<listener>和<contex-param>. 接着容器会创建一个Serv ...
- WANem2.3
http://downloads.sourceforge.net/wanem http://openmaniak.com/wanem_network.php 只能以iso方式运行,安装到硬盘后无法保存 ...