Java逆向基础之简单的补丁
本文参考: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逆向基础之简单的补丁相关推荐
- Java逆向基础之AspectJ的获取成员变量的值
注意:由于JVM优化的原因,方法里面的局部变量是不能通过AspectJ拦截并获取其中的值的,但是成员变量可以 在逆向中,我们经常要跟踪某些类的成员变量的值,这里以获取ZKM9中的qs类的成员变量g为例 ...
- java逆向基础,Java逆向基础之函数
本文提到的函数(function)和方法(method)为同一个意思 例子1,方法名的定义public class HalfRandom { public static double f() { re ...
- Java逆向基础之AspectJ的Eclipse插件AJDT
AJDT即Eclipse AspectJ Development Tools.是一个Eclipse插件,可以编写AspectJ项目 安装 help-->Install New Software ...
- java4android代码_Android逆向-java代码基础(4)
[TOC] 0x00 前言 微博:HAI_AI_ZHUZHU I春秋:HAI_ 看这篇可以先看看之前的文章,进行一个了解. Android逆向-java代码基础(1) Android逆向-java代码 ...
- 简单的入门Android开发和Java语言基础[图]
简单的入门Android开发和Java语言基础[图] 前言: 去年年底到今年年初,我做过简单的智能家居,也实现过一些简单的直连和远程的智能家居.于是就将最简单的通信发布出来:智能家居简单实现-使用ES ...
- java小游戏:蜡笔小新!!!基于JAVA面向对象实现的跑酷类游戏(小新跑酷)(简单小游戏,仅仅使用Java面向对象基础实现(附上源码))
一起来看一下蜡笔小新,很好看的,解压!!!!!!!!!!!!!!! 由于Java面向对象基础的游戏,有一定的局限,但是我觉得这款的可玩性已经很高了,话不多说一起来看游戏: 游戏界面,点击空格跳跃来躲避 ...
- java中文分词的简单实现
java中文分词的简单实现 中文分词 算法 算法思路 算法实现 代码及注释 评价 结语 中文分词 通俗来讲,中文分词是指将一句中文句子中的所有中文词汇相互分隔开来.它是文本挖掘的基础,有着十分广阔的应 ...
- java se 基础
写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java语言代码把思路体现出来. 学习新技 ...
- [0xFA-2021][Buuctf]Java逆向1
Java逆向 本周的题目非常之简单,所以不会像之前的解析那么详细. 直接给出解题步骤. .class文件 .class文件是.java文件编译后的产物,它类似于C语言中的.c文件编译而成的.s文件. ...
最新文章
- 企业大数据运用实战案例分享
- [转] 视频直播前端方案
- 中缀表达式转化为后缀表达式
- Office 2010 系统要求
- 抽象代数的抽象方法本质
- python横向合并merge_【Python代替Excel】7:merge、concat、append
- UPC2018组队训练赛第六场
- openssl不是内部或外部命令_OpenSSL新架构蓝图
- 工业控制系统专业术语(不断完善中)
- 【讨论帖】你认为怎么注释是比较合理妥当的方式
- python体测成绩数据分析统计服_体测成绩数据分析
- 重磅!原清华副校长任职南科大校长:他考研三次,读博七年,想做科研人偶像...
- c语言局域网聊天项目,局域网聊天的程序(C++版)
- 微信小程序获取openid(用户唯一身份识别)
- 详解APP兼容测试点
- 无人驾驶虚拟仿真(四)--通过ROS系统控制小车行走
- pyspark系列--统计基础
- java计算机毕业设计网络游戏后台管理系统(附源码、数据库)
- 英文网站更新自动采集工具
- 软件工程-软件的本质特征
热门文章
- 基于SSM开发实现中药制剂网站系统
- quartusII中功能仿真和时序仿真的分析
- eruda/vconsole 手机端调试利器
- DropDownList动态添加新项并位于第一项 ASP.NET控件应用
- python学习笔记之socket(第七天)
- Atitit.java c#这类编程语言的设计失败点attilax总结
- iOS开发工具篇:cocoaPods 添加第三方库链接报错
- 在.NET 3.5 平台上使用LINQ to SQL创建三层/多层Web应用系统(Part5) 转
- Apache POI和EasyExcel 第五集:Apache POI的Excel读取不同类型的数据
- anaconda安装scrapy失败的解决方法(2020.7.7)