本文参考:http://www.vuln.cn/7118

本文参考:《Reverse Engineering for Beginners》Dennis Yurichev著

本文需要用到IDA

简单的补丁

看一个例子

public class nag {public static void nag_screen() {System.out.println("This program is not registered");};public static void main(String[] args) {System.out.println("Greetings from the mega-software");nag_screen();}
}

我们怎样去掉打印"This program is not registered"这个字符串?

编译后用IDA载入class文件

作者的IDA view视图同步显示了hex的值,可能装了插件或者改了设置,这里的IDA view视图与hex需要切换视图

ALT+T,搜索文本This program is not registered,定位到相关指令附近

我们首先尝试将getstatic指令改成返回指令

点击getstatic,然后点击hex视图

可以看到B2 00 02对应这条指令

右键修改B2 为B1,然后右键应用更改

再切回IDA view视图

最后菜单点击Edit-->Patch Program-->Apply patches to input file,将更改应用到文件

在弹出的对话框点确定即可修改class文件

但是这么修改运行的时候会报错,可能是有一些栈和帧的校验

C:\Users\admin\Desktop>java nag
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.VerifyError: Expecting a stack map frame
Exception Details:Location:nag.nag_screen()V @1: nopReason:Error exists in the bytecodeBytecode:0x0000000: b100 0212 03b6 0004 b1at java.lang.Class.getDeclaredMethods0(Native Method)at java.lang.Class.privateGetDeclaredMethods(Unknown Source)at java.lang.Class.privateGetMethodRecursive(Unknown Source)at java.lang.Class.getMethod0(Unknown Source)at java.lang.Class.getMethod(Unknown Source)at sun.launcher.LauncherHelper.validateMainClass(Unknown Source)at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

原作者在JDK1.7下不工作,我在1.8下也是,报的是栈帧映射异常

既然此路不通,那么就选另一条路,去掉nag()方法的调用

找到main方法

中间的

.line 8

invokestatic nag.nag_screen()V

这一句就是调用nag()方法,查看对应的hex视图

其中的B8 00 06就是调用这个方法

改成00 00 00(填充3个NOP指令)

对应的IDA view视图

变成了3个nop指令

最后菜单点击Edit-->Patch Program-->Apply patches to input file,将更改应用到文件

修改完看运行效果

修改成功

再看第二个例子

这是一个简单的crackme的例子

public class password {public static void main(String[] args) {System.out.println("Please enter the password");String input = System.console().readLine();if (input.equals("secret"))System.out.println("password is correct");elseSystem.out.println("password is not correct");}
}

反编译后的class用IDA打开

搜索字符串"secret"定位到判断代码附近

其中ifeq指令当栈顶int型数值等于0时跳转 ,栈顶存的是String.equals()方法的返回值

首先我们考虑改跳转的位置,改到line 6后面的getstatic指令那里,那么这个指令对应偏移块是多少呢

点击getstatic,状态栏会显示

这个偏移块是24

目标就是将ifeq met002_35修改成ifeq met002_24

ifeq指令所在偏移块是21,35-21=14对应16进制是E,找出hex视图对应的E

可以看到99 00 0E,所以我们要修改其中的E

那么改成多少呢,24-21=3对应16进制的3,所以将E改成3

再看看IDA view视图符不符合预期

最后菜单点击Edit-->Patch Program-->Apply patches to input file,将更改应用到文件

原作者的修改在JDK1.7下不工作,我这里的JDK1.8也报错了

C:\Users\admin\Desktop>java password
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.VerifyError: Expecting a stackmap frame at branch target 24
Exception Details:Location:password.main([Ljava/lang/String;)V @21: ifeqReason:Expected stackmap frame at this location.Bytecode:0x0000000: b200 0212 03b6 0004 b800 05b6 0006 4c2b0x0000010: 1207 b600 0899 0003 b200 0212 09b6 00040x0000020: a700 0bb2 0002 120a b600 04b1Stackmap Table:append_frame(@35,Object[#20])same_frame(@43)at java.lang.Class.getDeclaredMethods0(Native Method)at java.lang.Class.privateGetDeclaredMethods(Unknown Source)at java.lang.Class.privateGetMethodRecursive(Unknown Source)at java.lang.Class.getMethod0(Unknown Source)at java.lang.Class.getMethod(Unknown Source)at sun.launcher.LauncherHelper.validateMainClass(Unknown Source)at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

这里必须要提的是,这种改法再JDK1.6上是可以运行的

我们也尝试将if eq 这个占用3个字节的指令用0(NOP指令)填充,结果也是校验失败,不能工作

貌似再JDK1.7上比1.6多了更多的帧栈校验

接下来我们尝试替换整个equals方法,并用iconst_1将常数1压入栈顶,这样后面ifeq判断的时候值始终为flase,就不往偏移块35跳转了

iconst_1的指令是0x04

即将图中的2B 12 07 B6 00 08改成04 00 00 00 00 00

改完后看下IDA view视图

改完之后工作正常

转载于:https://blog.51cto.com/7317859/2106049

Java逆向基础之简单的补丁相关推荐

  1. Java逆向基础之AspectJ的获取成员变量的值

    注意:由于JVM优化的原因,方法里面的局部变量是不能通过AspectJ拦截并获取其中的值的,但是成员变量可以 在逆向中,我们经常要跟踪某些类的成员变量的值,这里以获取ZKM9中的qs类的成员变量g为例 ...

  2. java逆向基础,Java逆向基础之函数

    本文提到的函数(function)和方法(method)为同一个意思 例子1,方法名的定义public class HalfRandom { public static double f() { re ...

  3. Java逆向基础之AspectJ的Eclipse插件AJDT

    AJDT即Eclipse AspectJ Development Tools.是一个Eclipse插件,可以编写AspectJ项目 安装 help-->Install New Software ...

  4. java4android代码_Android逆向-java代码基础(4)

    [TOC] 0x00 前言 微博:HAI_AI_ZHUZHU I春秋:HAI_ 看这篇可以先看看之前的文章,进行一个了解. Android逆向-java代码基础(1) Android逆向-java代码 ...

  5. 简单的入门Android开发和Java语言基础[图]

    简单的入门Android开发和Java语言基础[图] 前言: 去年年底到今年年初,我做过简单的智能家居,也实现过一些简单的直连和远程的智能家居.于是就将最简单的通信发布出来:智能家居简单实现-使用ES ...

  6. java小游戏:蜡笔小新!!!基于JAVA面向对象实现的跑酷类游戏(小新跑酷)(简单小游戏,仅仅使用Java面向对象基础实现(附上源码))

    一起来看一下蜡笔小新,很好看的,解压!!!!!!!!!!!!!!! 由于Java面向对象基础的游戏,有一定的局限,但是我觉得这款的可玩性已经很高了,话不多说一起来看游戏: 游戏界面,点击空格跳跃来躲避 ...

  7. java中文分词的简单实现

    java中文分词的简单实现 中文分词 算法 算法思路 算法实现 代码及注释 评价 结语 中文分词 通俗来讲,中文分词是指将一句中文句子中的所有中文词汇相互分隔开来.它是文本挖掘的基础,有着十分广阔的应 ...

  8. java se 基础

    写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java语言代码把思路体现出来. 学习新技 ...

  9. [0xFA-2021][Buuctf]Java逆向1

    Java逆向 本周的题目非常之简单,所以不会像之前的解析那么详细. 直接给出解题步骤. .class文件 .class文件是.java文件编译后的产物,它类似于C语言中的.c文件编译而成的.s文件. ...

最新文章

  1. 企业大数据运用实战案例分享
  2. [转] 视频直播前端方案
  3. 中缀表达式转化为后缀表达式
  4. Office 2010 系统要求
  5. 抽象代数的抽象方法本质
  6. python横向合并merge_【Python代替Excel】7:merge、concat、append
  7. UPC2018组队训练赛第六场
  8. openssl不是内部或外部命令_OpenSSL新架构蓝图
  9. 工业控制系统专业术语(不断完善中)
  10. 【讨论帖】你认为怎么注释是比较合理妥当的方式
  11. python体测成绩数据分析统计服_体测成绩数据分析
  12. 重磅!原清华副校长任职南科大校长:他考研三次,读博七年,想做科研人偶像...
  13. c语言局域网聊天项目,局域网聊天的程序(C++版)
  14. 微信小程序获取openid(用户唯一身份识别)
  15. 详解APP兼容测试点
  16. 无人驾驶虚拟仿真(四)--通过ROS系统控制小车行走
  17. pyspark系列--统计基础
  18. java计算机毕业设计网络游戏后台管理系统(附源码、数据库)
  19. 英文网站更新自动采集工具
  20. 软件工程-软件的本质特征

热门文章

  1. 基于SSM开发实现中药制剂网站系统
  2. quartusII中功能仿真和时序仿真的分析
  3. eruda/vconsole 手机端调试利器
  4. DropDownList动态添加新项并位于第一项 ASP.NET控件应用
  5. python学习笔记之socket(第七天)
  6. Atitit.java c#这类编程语言的设计失败点attilax总结
  7. iOS开发工具篇:cocoaPods 添加第三方库链接报错
  8. 在.NET 3.5 平台上使用LINQ to SQL创建三层/多层Web应用系统(Part5) 转
  9. Apache POI和EasyExcel 第五集:Apache POI的Excel读取不同类型的数据
  10. anaconda安装scrapy失败的解决方法(2020.7.7)