Java逆向之利用lua动态替换java中的代码

来源:互联网 发布:effective java 下载 编辑:程序博客网 时间:2024/06/05 10:05

转载时请注明转载地址:http://blog.csdn.net/qq_26914291/article/details/78310087

实现步骤

1.调用方法
2.替换方法
3.返回数据

所需工具

1.luaj.文章尾部有下载地址
2.Eclipse

具体实现

1.新建一个Hello.java类

import org.luaj.vm2.Globals;import org.luaj.vm2.LuaValue;import org.luaj.vm2.lib.jse.JsePlatform;public class Hello {    public static String beCall(String str){//被替换方法        str= replaceMethod(str);//调用替换方法        return str;    }    public static String replaceMethod(String str) {        Globals globals = JsePlatform.standardGlobals();        globals.loadfile("C:/luaCallJava.lua").call();//加载电脑C盘中lua文件        LuaValue aver=globals.get(LuaValue.valueOf("replaceMethod"));//调用lua中的替换方法        String result=aver.call(LuaValue.valueOf(str)).tojstring();//获取处理后的数据        return result;    }}

2.新建luaCallJava.lua文件,并把这文件放到上面hello.java类所指定的路径中(路径可以自己定义)。

function replaceMethod(str)  str=str.."我是返回数据"--在原字符后追加一串字符   return strend

3.调用beCall方法

  System.out.println(Hello.beCall("the result data:"));//这里以控制台方式显示获取信息

4.测试结果

the result data:我是返回数据

技术进阶

如果被调用函数中包含其他函数,应该如何替换呢?那就需要用到luaJ库中的luajava.bindClass函数了,
举个例子:
1.新建个BeCallClass.java类:

public class BeCallClass {    public String strcopy(String stra,String strb) {//这是个内部函数,需要实例化该类才能调用        return stra+strb;//该函数实现一个拼接字符串的功能    }    public static String strDelete(String stra,String strb) {//这是个静态函数,直接就可以调用        return stra.replaceAll(strb, "");//该函数实现一个删除原字符串中的strb的字符    }}

2.修改beCall函数(先测试静态函数):

public static String beCall(String str){        str=BeCallClass.strDelete(str,"ert");//调用BeCallClass中的静态函数,删除原字符串中的ert字符        return str;    }

3.替换beCall函数

    public static String beCall(String str){        str=replaceMethod(str);//替换为我们的函数        return str;    }

4.在lua实现该替换函数

function replaceMethod(str)  local BeCallClass=luajava.bindClass("BeCallClass")//绑定BeCallClass类   str= BeCallClass:strDelete(str,"er")//调用BeCallClass类中的静态函数strDelete,不再删除ert而是删除er。   return strend

6.调用beCall函数

System.out.println(beCall("qwert asdf"));

5.输出结果

qwt asdf

6.测试调用内部函数
只要将luajava.bindClass(“BeCallClass”)替换成luajava.newInstance(“BeCallClass”)即可,然后调用该类中的内部函数strCopy
下面是修改后的lua文件:

function replaceMethod(str)  local BeCallClass=luajava.newInstance("BeCallClass")   str= BeCallClass:strCopy(str,"add")//拼接两个字符   return strend

7.输出结果

qwert asdfadd

项目源码

下载地址:luajavaSimple

依赖库

1.luaj-3.0.1

参考文章

1.Java中内嵌Lua脚本
2.菜鸟教程

原创粉丝点击