【逆向怎么玩】 动态调试一款牛逼C++ IDE实录
声明
- 本篇只从逆向兴趣出发,研究其程序运行原理。
- CLion程序版权为jetBrains所有.
- 注册码授权为jetBrains及其付费用户所有.
- 不会释出任何完整的源代码.
- 涉及能直接推算出注册码的地方打码.
- 网上查了下,已有注册机,所以想要key的同学不要找我.
CLion是什么?
CLion是著名的jetBrains公司出的一款C/C++智能IDE。
什么,你不知道jetBrains?
我只提两点:
- Visual Studio ReSharper (for C#)
- IntelliJ IDEA (for java)
你还是不知道?好吧,我确定你是emacs/vim党.
CLion如下:
背景
在上篇:CLion注册码算法逆向分析实录
我们通过结合jdb、jd-gui等工具,静态分析被混淆的clion.jar
中的class信息,顺利拿到了CLion的注册码算法.
但是,如果能在动态调试中分析代码路径,拿注册码算法或者改改功能啥的不是更酸爽么?
本篇将从动态调试的角度展开逆向之旅,作为对上篇的一个补充。
本篇用到的关键技术和工具:
- java -verbose
- HotSpot™ Serviceability Agent
- jetBrains intellij IDEA 14.3
- jetBrains CLion 1.0.4
- jd-gui 1.2
- jinfo
- dump运行时的class信息
- 带混淆调试
- ClassPath和vm options修复
动态调试的困难
对于CLion这种产品级程序,我们面临以下困难:
- 无源码
- 字节码混淆
- 运行时生成class和hotswap
获取入口函数所在的类名
办法总比困难多,让我们开始准备动态调试吧!
通过上一篇博文的分析,我们已经熟悉了CLion程序启动的一些代码路径,首先要找到程序的入口函数main
,并重建它。怎么找呢?
- 方法1:通过启动脚本来找
可以通过查看$CLION_HOME/bin
下的clion.sh
来看启动参数:
133 MAIN_CLASS_NAME="$CL_MAIN_CLASS_NAME"
134 if [ -z "$MAIN_CLASS_NAME" ]; then
#注意这里
135 MAIN_CLASS_NAME="com.intellij.idea.Main"
136 fi
...
176 LD_LIBRARY_PATH="$IDE_BIN_HOME:$LD_LIBRARY_PATH" "$JDK/bin/java" \
177 $AGENT \
178 "-Xbootclasspath/a:$IDE_HOME/lib/boot.jar" \
179 -classpath "$CLASSPATH" \
180 $VM_OPTIONS "-Djb.vmOptionsFile=$VM_OPTIONS_FILES_USED" \
181 "-XX:ErrorFile=$HOME/java_error_in_CL_%p.log" \
182 -Djb.restart.code=88 -Didea.paths.selector=clion10 \
183 $IDE_PROPERTIES_PROPERTY \
184 $IDE_JVM_ARGS \
185 $REQUIRED_JVM_ARGS \
#以及这里
186 $MAIN_CLASS_NAME \
187 "$@"
188 EC=$?
- 方法2:通过jinfo来获取
也可以让CLion先跑起来,通过jinfo
来获取,首先通过jps
和ps -ef | grep clion
来确认CLion的pid
:
[haoran@localhost Tools]$ jps
27120 Jps
4001 Main
26953 Main
16911 Launcher
接着输入jinfo pid
,这里是jinfo 26953
:
[haoran@localhost Tools]$ jinfo 26953
Attaching to process ID 26953, please wait...
Error attaching to process: sun.jvm.hotspot.runtime.VMVersionMismatchException: Supported versions are 25.45-b02. Target VM is 25.40-b25
sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.runtime.VMVersionMismatchException: Supported versions are 25.45-b02. Target VM is 25.40-b25
at sun.jvm.hotspot.HotSpotAgent.setupVM(HotSpotAgent.java:435)
at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:305)
at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:140)
at sun.jvm.hotspot.tools.Tool.start(Tool.java:185)
at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
at sun.jvm.hotspot.tools.JInfo.main(JInfo.java:138)
发现因为jre/jvm
的版本不匹配,出现了异常,怎么解决呢?
从clion.sh
入手,看看它如何指定jvm
:
可以发现,$IDE_HOME
意即CLion安装的路径比$JAVA_HOME
搜索的顺序更靠前,我们调整这个顺序即可避免jre/jvm
版本不匹配的问题。
调整后,再次利用jinfo pid
来查看,得到如下信息:
之所以列举jre/jvm版本不匹配的异常问题,以及通过jinfo来获取程序入口函数所在类的方式,是为后续我们通过SA来dump运行时的class及修复java文件扫清障碍、奠定基础。
新建入口类##
我们已经得到main
函数所在的类名为com.intellij.idea.Main
,但是通过分析,发现其不在clion.jar
中,那么它在哪里?
我们通过在CLion启动参数中加入-verbose,并将结果重定向到文件中,来分析这个类所在的jar。
如下所示:
接下来,通过jd-gui
来反编译bootstrap.jar/com/intellij/idea/Main.class
,并将其java代码导入到我们新建的同名java文件中:
修复入口类##
这样的java代码是无法通过编译的,而且因为很多缺失的类都是很重要的依赖,所以无法通过简单的屏蔽来让代码跑起来。
那我们开始修复这些缺失的类,怎么修复呢?
我们可以使用
HotSpot™ Serviceability Agent (SA)
提供的能力,获取运行时的class。当然,获取运行时的class不只这一种方式。
说干就干,classFilter:
编译好这个classFilter
,按下面的步骤来运行:
- 运行CLion.
- 找到CLion的pid.
- 启动如下命令:
java -cp $JAVA_HOME/lib/sa-jdi.jar:. \
-Dsun.jvm.hotspot.tools.jcore.filter=$filterName \
-Dsun.jvm.hotspot.tools.jcore.outputDir=$dumpedClassOutputDir \
sun.jvm.hotspot.tools.jcore.ClassDump $clion_pid
# $filterName :我们自定义的classFilter
# $dumpedClassOutputDir : 存放dump出的class文件的目录
# $clion_pid :CLion进程pid.
看下我们dump出的classes:
到这一步,已经成功了一大半,接下来,按照你喜欢的方式将这些classes加入classPath
吧!
修复ClassPath
还在等什么,赶紧点run
吧:
嗯,果不其然,很多类还是缺失,对于运行中生成的类,按上面的方法来找,对于已经在jar
中的类,赶紧找找classPath
还有什么吧。
还记得上面的jinfo
吧,祭出:
将这些加入ClassPath
中。
修复资源、运行时参数、及JVM的options##
程序已经越来越接近跑起来的状态,还有一些细碎,奔跑吧骚年!
Q. 此刻有没有一种,买来风扇,涂上硅胶,扣定开关的感觉?
A. 要的就是这种能够DIY的工程师感觉嘛~^^
你会发现,后续的运行中,还会出现许多异常,没有关系,通过分析,就知道还有一些东西没有修复,包括:
- 资源/Resources
- 运行时参数
- vm options
其中CLion的vm options
我们依然通过jinfo
方式获取:
-Xss2m -Xms256m -Xmx768m -XX:MaxPermSize=250m
-XX:ReservedCodeCacheSize=96m -XX:+UseConcMarkSweepGC
...
-XX:ErrorFile=/home/haoran/java_error_in_CL_%p.log
-Djb.restart.code=88 -Didea.paths.selector=clion10
-Didea.platform.prefix=CLion
-Didea.no.jre.check=true
让程序动起来!##
做完了上面细碎的功夫,来看看我们的成果:
- 华丽丽的Stack Frames!
- 华丽丽的Locals!
- 华丽丽的注册码算法!
结语##
什么?没有动态调试过程?
有意研究注册码算法的同学,请参考上篇博文:CLion注册码算法逆向分析实录.但是不要做坏事哦 :]
我觉得上面的几个华丽丽的东西已经足够你
- step in/over/out (单步 步入/步过/跳出)
- evaluate expressions (表达式计算)
- stack frame in/out (栈帧切换)
- break point (断点啊亲)
有了这些还追不出注册码算法么?
骚年,那你该反思了 :]
撰文不易,若觉得本文对你有帮助或者博你一笑的,留个言、点个推荐吧 :]
【逆向怎么玩】 动态调试一款牛逼C++ IDE实录的更多相关文章
- 逆向分析-IDA动态调试WanaCrypt0r的wcry.exe程序
0x00 前言 2017年5月12日全球爆发大规模蠕虫勒索软件WanaCrypt0r感染事件,各大厂商对该软件做了深入分析,但针对初学者的分析教程还比较少,复现过程需要解决的问题有很多,而且没有文章具 ...
- Animate.css 一款牛逼的css3动画库
Animate.css是一款很牛逼的,跨浏览器的css3动画库,使用方法也很简单只要引入一个animate.min.css就可以了, 简单使用 1 首先引入 animate的 css 文件样式 cdn ...
- 【逆向知识】动态调试技巧-C++代码逆向
1.C++类代码的特点 寄存器ECX传参时一般用作this指针(对象地址)或是计数器. 有ecx传参的call,是成员函数,构造函数,析构函数 能访问成员变量的函数都会有ecx传参 静态函数.全局函数 ...
- 安卓APP动态调试-IDA实用攻略
0x00 前言 随着智能手机的普及,移动APP已经贯穿到人们生活的各个领域.越来越多的人甚至已经对这些APP应用产生了依赖,包括手机QQ.游戏.导航地图.微博.微信.手机支付等等,尤其2015年春节期 ...
- 安卓APP动态调试(IDA实用攻略)
转自:http://drops.wooyun.org/mobile/5942 0x00 前言 随着智能手机的普及,移动APP已经贯穿到人们生活的各个领域.越来越多的人甚至已经对这些APP应用产生了依赖 ...
- 推荐 2 款超牛逼、炫酷、实用的Docker管理工具!
Docker技术的火热程度,想必每个互联网IT技术人员都能时时感受的到,的确,近些年,国内对于Docker容器技术的应用需求越来越强烈!! 人均年薪80万以上,docker到底是什么?为什么这么火? ...
- Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)
Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码) 来源 https://blog.csdn.net/jiangwei0910410003/article/details/51 ...
- 【Android 逆向】动态调试AliCrackme_1
1 试玩 apk # 安装APK到真机 adb install AliCrackme_1.apk 打开apk,投石问路,输入123试一下 2 将apk 拖入androidKiller,得到反编译的sm ...
- apk逆向 - smali动态调试
author: Dlive date: 2016/10/6 0x00 前言 之前有人问过smali的动态调试方法,其实网上已经有很多文章讲这些内容,但是为了方便大家学习,我还是写一下让大家少走点坑 ...
随机推荐
- 为 Virtual Box 中的 CentOS 6.6 配置本地DVD光盘做yum软件源
因为virtual box 中的centos配置host-only共享win7上网,配置失败,所以只能使用Centos的 DVD 光盘来配置yum软件源.不然就没得完了. 1. 首先要在virtual ...
- 17110 Divisible(basic)
17110 Divisible 时间限制:1000MS 内存限制:65535K 题型: 编程题 语言: 无限制 Description Given n + m integers, I1,I2,. ...
- js动态切换图片
<script language =javascript > $(function () { initAds(); }); function initAds() { var curInde ...
- R语言与数据分析
K最近邻(k-Nearest Neighbor,KNN)分类算法 R语言实现包:R语言中有kknn package实现了weighted k-nearest neighbor. 决策树: R语言实现决 ...
- libc.so.6被删后导致系统无法使用的原因及解决方法
记一次升级glibc库发生的错误 今天给glibc库升级,发生了一件让我吓出一声汗的事情,我把动态库中的libc.so.6给删了,瞬间所有的非系统命令都无法使用,使用就报错 当时就吓尿了,生产环境被我 ...
- Same Tree
Given two binary trees, write a function to check if they are equal or not. Two binary trees are con ...
- HBase 专题技术收录
HBase系列: 博客地址:http://www.cnblogs.com/panfeng412/tag/HBase/ 技术专题文章: HBase中MVCC的实现机制及应用情况 HBase在单Colum ...
- 【java基础】 如何导入外部jar包
转:from http://www.zhihu.com/question/20311561 有两种常用的方法. 1. 以外部包(External Archives)的形式导入. 在默认位于 Eclip ...
- Android service ( 二) 远程服务
通常每个应用程序都在它自己的进程内运行,但有时需要在进程间传递对象,你可以通过应用程序UI的方式写个运行在一个不同的进程中的service.在android平台中,一个进程通常不能访问其他进程中的内存 ...
- WP老杨解迷:如何营造让人花钱的游戏
游戏是最好做也是最不好做的项目,游戏的好坏现在都是直接从数据来说话,Windows Phone的游戏应用同样不可能逃出这个行业准则,要说在市场里做的好,那就直接拿数据来说,几乎没人会去在乎游戏到底传达 ...