声明
CLion程序版权为jetBrains所有、注册码授权为jetBrains及其付费用户所有,本篇只从兴趣出发,研究其程序运行原理及注册码生成算法。
- 不会释出任何完整的源代码.
- 网上查了下,已有注册机,所以想要key的同学不要找我:p
背景
在上篇:CLion注册码算法逆向分析实录
我们通过结合jdb、jd-gui等工具,静态分析被混淆过的CLion的clion.jar
中的class信息,顺利拿到了CLion的注册码算法.
但是,如果能在动态调试中分析代码路径,拿注册码并推算法不是更愉快么?
本篇将从动态调试的角度展开逆向之旅,作为对上篇的一个补充。
本篇用到的关键技术和工具:
- java -verbose
- HotSpot™ Serviceability Agent
- jetBrains intellij IDEA 14.3
- jetBrains CLion 1.0.4
- jd-gui 1.2
- jinfo
动态调试的困难
因为没有源代码,而CLion的class经过混淆,且有很多运行时生成的class,所以无法直接通过简单地使用类似jd-gui
之类的工具来得到java文件。
如果仅仅是名称和控制流混淆,其实还是比较简单的情况,不是太变态的情况下,jd-gui
可以拿到java代码,如果混淆的很厉害,一般也有字节码可以看,所以需要我们对字节码或混淆代码的阅读感觉比较熟练即可。
如果是上面的相对简单的情况,我们可以有耐心地重建或者修补反编译而来的java代码,以达到调试的目的。
CLion的情况不同,它还有一些运行时生成的类,再加上混淆,使得我们很难仅仅通过反编译来完成动态调试的准备。
获取入口函数所在的类名
办法总比困难多,让我们开始准备动态调试吧!
通过上一篇博文的分析,我们已经熟悉了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 -cla