抛砖引玉,说说我干的勾当,干过类似坏事情的各位也说说

去年玩弹弹堂,问题技术不行,所以想写个弹弹堂外挂.
弹弹堂是一款类似疯狂坦克的游戏,通过调节发射炮弹的角度和力度,把炮弹打到敌人的位置,把敌人打死或者击落,游戏很简单,随机的参数也只有风力一个,查询了下网上的一些资料,发现大家很多是使用一些很简单的截图,测量距离,计算,而参数的获得一般是采用图像识别的方法,使用这些办法,比较的原始,基本没有被服务器发现危险,缺点是:极其粗糙,落点计算有很大误差.

本人菜鸟一个,超级的,不懂flash编程,对上面所说的粗糙办法也做不到,看到别人用java之类的写程序只是佩服加羡慕.思索之余,想用类似编写游戏外挂的办法,注入到flash里面,直接调用flash里面的函数,但是,找了很久没有找到这方面的资料.最后,灵机一动,采用了以下方法,成功写出了一个简单又有效的外挂

首先,flash游戏,其实和普通的客户端游戏没有区别,从代码的角度上来说,其实更容易被人给破解,因为flash反汇编的时候,他的代码阅读性更强.

所以,我先把弹弹堂的loader程序下载下来,然后反编译,目的是找到主flash的下载地址和加载参数
然后把主flash下载,反编译,然后把他再次编译.

做的其实就是这个事情,但是,如何把这个flash编译成功就很累人了,虽然代码非常接近本来的面目,但是依旧有很多的错误,一一解决后,还牵扯到一个连接路径的问题,因为flash在官方网站运行,里面的图片,音乐,其他资源flash等等都是相对路径加载的,所以,还得在此基础上把他改成绝对路径.

全部ok后,自己架设一个简单的web服务器,把flash放上去,然后把加载参数写到调用flash的网页上,登陆,哈哈,成功进入游戏,现在虽然登陆的是自己的网站,但连的却是官方的游戏服务器.

可能有人会说,没看到外挂啊,只是,整个客户端代码都在手上,想加什么功能就加什么功能了
我给自己的弹弹堂flash加上了计算弹道的功能,红色的弹道清晰,准确,发射炮弹的时候,完全是循着轨迹过去的,做不到百发百中,不过是指哪打哪了

这里,我没有任何的贴图,代码之类,只写了思路,不是我保密,因为写这个帖子也是刚刚看了其他人的帖子,所以写的,时间过去快1年了,又因为重装系统,游戏更新,现在的代码都失效了,贴出来也没用,当初也录像过,只是也找不到了,写在这里,只是想说下,flash游戏,只要想搞外挂,比其他游戏更可怕,完全的内置式,想怎么搞就怎么搞
【原创】swf逆向可以这么玩  http://bbs.pediy.com/showthread.php?t=132379

  • 标 题:答复
  • 作 者:egol
  • 时 间:2011-08-15 22:34:34

前段时间有人看了我的这个帖子,然后想和我一样对弹弹堂下手,和他聊了几次后也勾起了我的兴趣,又重新找资料准备下手,因为我是超级菜鸟啊,讲究拿来主义,没办法,图书馆借几本as3的教程,开始下手了.

虽然是flash,和这个论坛的主调可能不是很配,但思路和方式是一致的,本来想到flash论坛讨论的,但那里都是开发者,我过去发帖子估计被人打出来的可能性比较大,另外,正向逆向的... 思路方向也对不上号,不说了,直接又上理论.

申明,以下思路为原创,至少是自己想出来的,前人估计应该是有的.......

flash我们接触最多的就是swf文件,这个是一个结构化的文件,最开始当然是文件头部分,里面有放了swf的一些总体的信息,是否压缩,文件大小,场景尺寸等等,剩下的部分分为好多个段.. 有多少段得看swf里面放了多少东西了.每个段,称为TAG,TAG有很多种,除了各种资源外,还有很重要ABC段,就是代码段啦.我们的目的就是对代码段下手了.

其他的替换资源的是小意思了,现在多的是工具做这种勾当了.

但是对ABC下手的,大家都是遮遮掩掩的,这个主要是因为flash的性质所决定的.

flash是一种解释执行的语言结构,他的脚本代码编译的时候被编译成ByteCode,字节码,反编译后代码的可读性很高,这也是为什么优秀的flash总是被模仿山寨的原因,因为代码借鉴实在是太容易了.为了防止这个事情的发生,所以就有了市场,就有了各种各样的加密软件对flash加密.

但,这些,其实都是无效的,只能防新手,防君子,和普通的应用程序反调试不同的是.. bytecode永远是bytecode,他里面的所有调用都是序号形式,也就是说,执行的时候都是序号方式调用,至于脚本中原先的元素名称则被写到了一个统一的地方,这个..其实是没有用处的,执行的时候不会被调用,所有的flash加密,反调试手段都是针对这个东西的,把他搞乱,什么意思,就是把你反编译后的代码搞的很难看,比如变量名字改成非法的,乱码的,改成统一的,但这些都是浮云... 我的做法很简单,因为是序号方式调用,那么.. 我吧所有的这些名字都该成对应的序号的名字.. 序号1就叫序号1,类推,至少比乱码好看

然后.. 每个类,都是一个abc,我们把abc 单独导出,然后修改后,再倒入.. 一个类的代码就被替换了
然后... 想怎么搞就怎么搞了
因为是序号调用.. 所以,只要你把类所调用的其他类的那些方法属性的序号,自己公共的方法属性的序号搞的和原先的那个ABC一直,那么这个ABC就随你任意搞了.

写的非常乱,因为思路本来就乱,想到哪里写哪里是我的风格,明天再回头补充

  • 标 题:答复
  • 作 者:egol
  • 时 间:2011-08-15 22:45:09

哦,对了,还有很多的软件是用来加密代码的,也就是和加壳是一个道理,但是,这个其实是最垃圾的办法,因为这种加密方式有个很明显的特征,他把原swf加密后保存,用的时候再还原,但是,最终,还是没用,因为,如果要把这个swf加载,那么,基本上,这个swf的数据的开头,必须是FWS,或者是CWS,只要在内存中找这个特征字,然后对比文件的大小,就直接可以DUMP出来了,DOSWF这个据说很牛,但不说其他混淆代码的功能,至少这个加密,手动,加思路加动手测试,10分钟内就搞定它了,这个还是第一次干.. 估计下次,只要2分钟.

加密软件4法宝
1,加密
2,修改String信息
3,代码混淆
4,代码替换

代码混淆就是在里面增加大量无用代码,然后加上跳转,看上去像是花指令,实际上却什么都不是,只是通过大量的跳转指令来使代码的顺序错乱,并且使反编译软件工作的时候出错..如此而已.现在反编译器都有代码了,所以,除了稍微增加点时间外,没什么大的用处了

代码替换..这个是比较厉害的,其实就是用ASM来替换PCODE,但是... 我估计碰到混这论坛的. 死的比其他方式的都快(最后这个,没碰到,只是猜测,呵呵)