最近在SNS上的网页app游戏上消磨时间 偶然遇到一个java写的外挂程序 萌生了破解的想法
之前没有任何破解经验 不懂的基本全靠百度谷歌.....
内容很简单 请路过的高手指点
查看运行脚本的批处理文件寻找main class
看到
java -Xmx512m -cp %CLASSPATH% com.llv.xiaonei.rongame.llllIIIIlIIIllll %1 %2 %3 %4 %5 %6 %7 %8 %9
发现入口的class为 com.llv.xiaonei.rongame.llllIIIIlIIIllll 为了方便这里我们标记文件A
从文件名判断肯定是使用混淆器编译的...反编译和阅读难度又增加不少
查看lib目录下 有5个.jar文件
光看文件名不知道干什么用的 可能多数是些java必须的头文件
修改日期也证实了这个想法,除了rongame.jar 的修改日期是12月。其他都是6月份 直接忽略
用winrar 解压rongame.jar
发现com目录 对应 com.llv.xiaonei.rongame.llllIIIIlIIIllll 应该没错
我们到com\llv\xiaonei\rongae\去找上面那个class文件
看着很眼花。。。找不到就用搜索吧。。。
图1:
直接DJ反编译 看到混淆后的大量IlIlIl....头晕
修改后编译回去的可能性基本为0 java我一点也不懂
再编译的希望破灭 试试修改java机器码爆破吧。。。
参考帖子:http://bbs.pediy.com/showthread.php?t=104343
用jclasslib打开查看class文件 选择Methods\main调用
根据字符串判断验证判定机器码的所在 来到如下位置
图片2:
看到提示验证失败的字符串前面有个ifne 108 的跳转
这里应该和汇编的jne是一样的 如果比较结果不相等会跳转
点击跟过去发现的的确是验证通过的提示~
试试能不能通过把ifne修改为ifeq达到爆破效果
用Ultraedit打开该class文件搜索 9a
查找下一个一直来到第21处 上面写了文件路径的地方
图3:
改成99保存看看效果
回到jclasslib刷新 看到原来的ifne变成了ifeq ~
ok 用jdk把class重新打包成jar看看效果
懒的设置path 直接把jar复制到lib\rongame\下执行
jar.exe -cfv rongame.jar ./
压缩后重新运行脚本批处理测试
图4:
ok...通过验证 随便输入个操作号码测试功能~
......额 没反应 不管输入什么操作号都一样...
看来不是单纯的判断验证
既然修改判定字符码的方法行不通 那么改回来先吧
ok从头再来
重新用jclasslib查看文件A 发现在验证判定的跳转前面 引用了一个静态类
我们标记为文件B的_$2
图5:
跟过去找找线索.......一样用jclasslib打开
在_$2的code里看到了验证过程相关的string
在下面地址140的地方看到了判定验证的常量字符~~
图6:
因为之前我已经抓过包 知道在想web服务器请求验证失败的时候
服务器会返回字符串 “不通过” 根据程序猜测验证通过的话应该会返回“通过”
这里的验证调用另一个文件的_$6 获取得到的字符串
然后将常量字符串<通>或者<不>常量字符压入栈
然后用方法startswith 比较字符串的头部来判断验证通过或者失败
那么我们通过修改字符串<通> 将其变为<不>
'通'的UTF-8 码是E9809A
'不'的是E4B88D
一样使用Ultraedit 打开文件B搜索E9809A 只有一处
修改之 刷新jclasslib看到原来<通>的字符串变为<不>
重新封装jar测试...........ok 验证通过
但是又碰到一个问题 在通过验证后输入操作号
开始登陆游戏
提示登录成功后立刻跳出......
看来验证的地方不止一处啊.~~
回到文件A 寻找跳出的地方!!!
大概浏览了一下 发现每个操作号的acction都有这么一句~~
图片7:
第二处验证很可能在这个调用之中
追踪这个文件C_init调用~
果然...发现代码最下面还有个<通>
二话不说 继续改.....
图片8:
重新编译后测试 一切顺利 哈哈 爆破完成~
图就不贴出来了
大家感兴趣的自己试试吧
2.93.rar
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)