返回列表 回复 发帖

去doswf,swfEncrypt水印的方法

本帖最后由 askforone 于 2010-1-23 20:38 编辑

doswf破解版本很老且无用,最新的功能较强大且无破解版。试着用它加密过不下几百个,然后试图破解,只有2个完全成功。有些标签经过加密后,会让ASV和闪客精灵卡死。不过加过密的swf,很多都被部分损坏。
     目前摸清楚了点原理,还在继续研究中。
     doSwf基本上是用byteArray把原swf分解加工成ABC文件,然后用混淆过的builtin和类进行重组。而这种方法,是在swf10才有的。可以直接用abc文件的opcode和avm2debug代码,是伴随着alchemy出现的。所以针对swfencrypt6.04和doswf4来说,除了swf默认的文件格式,还得知道alchemy项目编译后的swf,有什么规律。这个因为本人不擅C语言,一点研究都没,暂时只做些推测。
    很怀疑是不是doswf是直接addChild整个原swf,替换掉了stage。之所以这样认为,是因为一个有NN个addChild的swf,经过加密后,只剩下两个addChild,和一个removeChild。试图把这里的addChild和removeChild替换发现。原swf居然和doswf的水印居然是一个object。但是在as里写trace得知,原始的路径确实是在stage下面没错。
     之间的代码大概是这样的
    setTimeout(fun,5000)   //给个缓冲时间,因为doswf加密后的东西,往往隔个1-2秒才出现。
    function fun(){
      trace(this.stage.numChildren())
    }
    我们可以发现,经过加密后,stage上的children变多了一个,即是水印。而通过修改上面说的两个addChild和一个removeChild的部分,如果取消removeChild部分,stage的显示列表下实际上是多了两个物件。第一个物件不详,并且修改之,会使得flash打不开。猜测很可能是原始的stage。最想不通的是为什么水印会和原始的swf里的物件在同一个层级中。这里还需要很多研究,而且doswf每次加密时都会生成随机的替换字符用来混淆,甚至用来作为byteArray解析的密匙。
    另外,addChild部分做解密后大概是这样的:   //替换stage没看到过相关的资料,也不一定确实可行,所以下面的伪码,实际效果可以实现,但是反推的代码很可能是错误的。
    setTimeout(fun,time) //一定时间缓冲。可能怕水印加太早被其他物件覆盖。
    addEventListener(Event.ADDED_TO_STAGE,fun1(e))   
   function fun(){
       加水印到原swf的stage中
       移除原来的stage
   }
   function fun1(e){
      把整个stage加进场景
}
   而因为类名都进行过混淆,且doswf一加密至少多出9KB,暂时还没找到。所以只能用以下拙劣的方法去水印了
   addEventListener(Event.ENTER_FRAME,doswf)
    function doswf(e){
         var m=this.stage.getChildAt((this.stage.numChildren-1))
         if(m.x==0&&m.y==0&&m.width==129&&m.height==30){
                  this.stage.removeChild(m)
                    removeEventListener(Event.ENTER_FRAME,doswf)
           }
    }
    理论上,可以通过它的opcode来反推水印。无奈在不同的AVM模拟器中,得到的opcode不尽相同,且目前AVM模拟器对比官方的flashplayer10落后很多。如果不知道原理,反编译doswf加密的swf10,几乎是不可能的。
    而非替换整个文件结构的加密,去水印则很容易。
     swf.uncompress()   //一切加解密都是在解压缩后操作的
    for(var i=l2;i<l1;i--){     //通过判断byte中的数据,去掉目录里的水印的相关数据。
        swfByte.readBytes(h,i,length)
        if(h.toString()==" "){
            重组swf
       }  
   }
    此数据位置因为是在 目录 中,所以在文件尾处倒着查起的某个范围中。对于不同的加密软件,参数都不一样。对于swfEncrypt之前的版本来说,基本上没加密且都在文件尾。。



另。
正因为doswf加水印是用addedtostage触发的,所以用onEnterFrame或setInterval都会有个小的时间差。等研究多一些时,应该写个方法,把去水印函数加在添水印的函数里才算完美。
下面是通过搜索MainTimeline字符串来去掉swfEncrypt5的部分代码,flash10打开。

function B_crack(e){
var nb=new ByteArray()
var b=new ByteArray()
BytesLoaded.position=0
BytesLoaded.readBytes(nb,0,3)
if(nb.toString()=="FWS"){
  BytesLoaded.position=0
  BytesLoaded.readBytes(b)
}else if(nb.toString()=="CWS"){
  b=BytesCompress(BytesLoaded,false)
}else{
  output.text="格式不正确,无法进行crack操作"
  return;
}
var h=new ByteArray()
var h_p=b.length-0x1200
if(h_p<=0){
  output.text="长度过短,无法操作   "+b.length
  return
}
b.position=h_p
for(var i=h_p;i>0x110;i--){
  var  bb=new ByteArray()
  b.readBytes(bb,0,12)
  if(bb.toString()=="MainTimeline"){
   h_p=b.position
   b.position=0
   b.readBytes(h,0,h_p)
   break;
  }else{
   
   b.position-=13
  }
}
if(h.length>0){
  h.position=h_p
  h.writeByte(0)
  h.writeInt(1073741824)
  output.text="转换成功"
}else{
  output.text="转换失败"
}
}

去swfEncrypt水印_.swf (16.56 KB)

swf10

doswf只去掉水印是没有意义的,还有暗桩呢!
楼主真是天才。我是彻底佩服楼主。很欣赏你的钻研精神。
不可多得的能人。
Blog: riaoo.com
抓Q精品小游戏:http://zhuaQ.com/
要去掉水印的话是不用写什么代码的,只需要把他多余的Tag去掉,再保存为新的swf就可以。至于doswf贱到随机弹出他的网址的解决方法那就是自己想想啦。
swf文件格式是开源的,大家不用觉得doswf,swfEncrypt的加密有什么了不起的。
混淆也是不过是把abc的字符池中的字符改名而已。你要改到天花龙凤也可以,以后我会出个KIS_DoSwf同大家分享一下。
以帮助消磨无聊为已任
楼主,楼上,以及3楼 真乃神人也!佩服
厉害

官方QQ空间

经典QQ网名

先佩服下,但只是去水印的话,好像直接用flash橡皮擦就可以哦,swfencrypt6.04和doswf4都可以这样,但原来用doswf加了个游戏,游戏就不能游戏了,所以个人对doswf感觉不爽,主要还是用swfencrypt。
我这个文章是前几个月搞的,看到将军还在那弄些改跳转的小玩意,就把它整理出来了。现在已经没在研究了,可能有点落伍。看了几个ABC结构的swf都没有scene,看来替换stage并不是作者想出来的,是所有doabc结构都一样。abc结构还分c/c++,java/js和python三种,学习资料甚少。不过如果有和doswf中生成abc文件一样的平台,那就好破解了。

    4楼是作者。几乎把现在所有的swf加密方法都用上了,他才是神人。

3# chen4490

    暗桩上指隔段时间有个www.laaan.com的数据传输请求么。之前被卡巴拦截了都没发现。看了下也不是明码。过段时间再搞掉它。

    6楼的观点太落伍了。特别是混淆的看法。大学加密课程的硕士经常以混淆为论文题材呢。。。混淆的代码根本是无解,只能运行不易修改且不能还原,现在只是算法落后和没有混淆软件把元件给混淆掉。

    楼上说的flash橡皮插也是落伍的软件。稍微有一点加密导致解析错误就不能找到素材。对于byteArray加密的东西完全没用。
doswf的难点,基本上就是:
1.abc结构现在很少见,不了解就难破解
2.用byteArray加过一次密
3.在此基础上做了简单的混淆字符
4.并且用了混淆tag头和跳转让swf解析工具全部挂掉

反之,最捷径的还原方法是
1.解掉跳转和tag混淆,让asv和闪客精灵能够不挂掉。最难的是这里,其实还是混淆。
2.混淆字符基本可以不理会
3.看部分代码,写出bytevarray的逆运算
4.用同样的生成abc平台还原abc。得到原始代码

其实最难的还是混淆,就第一步!
感觉是看天书,楼主开帖教教!!想FLASH8应该起到引导中国FLASH前进的作用啊。我们菜鸟引项期待大侠们传道授业啊
高手。。。。。。。厉害
本帖最后由 wl359576097 于 2010-1-26 20:08 编辑

我还很菜,注册没多久不能发帖,想问问楼主,做好影片剪辑或者图形元件后,把他拖动到场景时,这个元件都会有一个蓝色的边框就像这样,我只是划了一条线,对象绘制我也关掉了,但我拖上去的时候就形成了这样的蓝色边框,放好后图中的边框会消失,但是软件识别这个物体为蓝色边框那么大,我是想做个障碍的,防止人物上墙,但是软件默认MC为蓝色区域为那么大后离墙很远就站住了,能不能帮我解决一下啊
本帖最后由 askforone 于 2010-2-7 20:15 编辑

终于手动把doswf的这句
setInterval(navigateToURL(new URLRequest(http://www.laaan.com)))
给屏蔽了。另外在点那个水印里也有。
累死我了。批量搞估计是不行的。每次都会有点不一样,还没完全弄清楚是怎么把swf结构变成这样的。稍微改几字节也会让swf坏掉。看得到水印是个mc,水印的图象应该是string2byte做的,另有一部分代码完全不懂原理。

手动去水印倒简单了,比起用enterframe搞,不会闪现那么一下。这部分比较透明,不过还是得分析个把小时。

虽然不理解原理,不过在找乱弹的代码时候,已经找到原始代码了。即是可以破掉doswf加密了。。。破解的难度不一定高于屏蔽弹窗口。。
hi.baidu.com/inuko  
严重倒塌、、楼主确实是神人。。我惯用的防破解手段就是弹Alert,谁敢反编译,我弹死他。。
不过这一招确实不是特别实用,呵呵
QQ:827004080
在闪吧这段本人感觉askforone的破解攻防是相当强的。

未特别深入研究这个方面,
本人还停留在去吸血鬼水印的程度,呵呵
已转战天地会www.9ria.com
看了神人的东西感觉自己也快成神了。
doswf确实是add上去的,把通过转换16进制,去掉logo,去掉弹窗问题,请问swfEncrypt6.0是怎么加上去的!
都是一样的,文件结构不同,不好写成通式
hi.baidu.com/inuko  
20# askforone
想问下怎么去掉doswf的壳子,还有不破解swf汉化图片!请教!本人无恶意破解他人作品,工作需要,汉化游戏!
只说一下swfEncrypt水印去掉的方法,很简单,用闪客闪一下,看下水印的id,解压成FWS,查找tag,修改id,即可!
很实用的文章,SWFENCRYPT还是比较好修改,关键是DOSWF取出来的已经经过加密了
精彩!!神了!!
doswf试用版好像也不太好用吧,我在动画第一帧加上stop()后,加密出来的动画就不能播放了,不知道是什么原因。
返回列表