Java逆向记录(一),原生AspectJ使用

前几天想试一下一个IDEA插件,发现是用ZKM混淆过的。于是顺带学了一波技术。

思路:字符串还原

ZKM的逆向会混淆所有的字符串,然后将原本的”…..”字符串替换为a(int,int)类型的一个加密函数,

也就是

1
2
3
4
5
6
7
8
9
10
11
String s="abc";
//会混淆成

String s=a(int,int);

//加密函数

private static final String a(int a,int b){
//do decrypt..
return "...";
}

切面生成

所以先用Aspectj进行方法拦截,这地方涉及到了原生的Aspectj使用,网上资料比较少,大部分都是springAOP里面的

先是下载Aspectj必要的三个包

  • aspectjtools-1.9.4.jar 编译工具,用来编译切面到具体的class或者jar,
  • aspectjweaver-1.9.4.jar 注解支持,运行时代理, 编译时支持 @PointCut 等。
  • aspectjrt-1.9.4.jar 运行时支持,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
@Aspectj
public class MybatisAspect {
/**
* 写入文件
*/
private static BufferedWriter writer;
/**
* set的作用算是字符串去重,多次相同调用会产生相同字符串,
*/
public static Set<String> set;
static {
//初始化writer,set
}
/**
* 切点,
*/
@Pointcut("execution(* xxxx.xxxx..a(..))")
public static void cut() {
}
/**
* 文件写入
*/
private static void write(String s) throws IOException {
//...
}

/**
* 环绕通知,进行调用拦截 ,
* 简化版,原版利用了Thread.currentThread.getStackTrace()
* 用来对方法调用者的显示即: (方法调用者)->(目标方法(参数)) -->返回值
*/
@Around("cut()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
final String methodName = pjp.getSignature().getName();
Object[] args = pjp.getArgs();
final Object proceed = pjp.proceed();
Object s =proceed;
if(proceed instanceof byte[]){
s = new String((byte[])proceed);
}
final String className = pjp.getSignature().getDeclaringType().getName();
final String template = "%s.%s(%s) : -->[ %s ]";//当前方法类名.当前方法名,
final String format = String.format(template, className,methodName, Arrays.toString(args), s);
write(format);
return proceed;
}
}

写完之后将上述三个文件放置至同一包下

然后执行命令,目录下生成 将生成 out.jar

1
java  -cp aspectjweaver-1.9.4.jar;aspectjtools-1.9.4.jar org.aspectj.tools.ajc.Main  MybatisAspect.java -outjar out.jar -source 1.8  -target 1.8  -outxml

进行代理

aspectjrt-1.9.4.jar , out.jar 复制到 ${IDEA安装目录}/lib 下面,然后在idea64.vmoptions中加上aspectjweaver-1.9.4.jar 路径的代理路径

1
-javaagent:C:\Users\me\Desktop\aj\aspectjweaver-1.9.4.jar

最后查看输出的字符串。