Changed this thread to a general Habbo cracking/info thread!

Downloads:
Cracked 'new' SWFs:
RELEASE63-201203151102-360144060
Feel free to request more

Tools:
Old obfuscation remover


Information:
Obfusctating used by Sulake:
In old SWFs:
In the old SWFs, it is very easy to locate and remove the obfuscation. It is simply some AVM code which never get called, but it confuses the SWF decompiler to show the unused code which causes strange AS3 code to show in the SWF decompilers.
Here is an example from a decompiled class with the obscufation marked in red:
Code:

  trait method QName(PrivateNamespace("HabboMain", "HabboMain"), "dispose")
   method
    name "HabboMain/private:dispose"
    refid "HabboMain/dispose"
    returns QName(PackageNamespace(""), "void")
    body
     maxstack 3
     localcount 1
     initscopedepth 9
     maxscopedepth 10
     code
      getlocal0
      pushscope

      findpropstrict      QName(PackageNamespace(""), "removeEventListener")
      jump                L10

      setlocal1

      modulo
      pushfalse
      nextvalue
      getlocal2
      lshift
L10:
      getlex              QName(PackageNamespace("flash.events"), "Event")
      getproperty         QName(PackageNamespace(""), "ADDED_TO_STAGE")
      getlocal0
      getproperty         QName(ProtectedNamespace("HabboMain"), "_-0EB")
      callpropvoid        QName(PackageNamespace(""), "removeEventListener"), 2

      findpropstrict      QName(PackageNamespace(""), "removeEventListener")
      getlex              QName(PackageNamespace("flash.events"), "Event")
      getproperty         QName(PackageNamespace(""), "ENTER_FRAME")
      getlocal0
      getproperty         QName(PrivateNamespace("HabboMain", "HabboMain"), "_-20T")
      callpropvoid        QName(PackageNamespace(""), "removeEventListener"), 2

      getlocal0
      getproperty         QName(PrivateNamespace("HabboMain", "HabboMain"), "_-2GU")
      jump                L30

      nextname
      increment
      multiply_i
      pushtrue
      hasnext
      pushtrue
L30:
      iffalse             L55

      getlocal0
      getproperty         QName(PrivateNamespace("HabboMain", "HabboMain"), "_-2GU")
      getlex              QName(PackageNamespace("flash.events"), "Event")
      getproperty         QName(PackageNamespace(""), "COMPLETE")
      getlocal0
      getproperty         QName(PrivateNamespace("HabboMain", "HabboMain"), "_-0L1")
      callpropvoid        QName(PackageNamespace(""), "removeEventListener"), 2

      getlocal0
      getproperty         QName(PrivateNamespace("HabboMain", "HabboMain"), "_-2GU")
      getlex              QName(PackageNamespace("flash.events"), "ProgressEvent")
      getproperty         QName(PackageNamespace(""), "PROGRESS")
      getlocal0
      getproperty         QName(PrivateNamespace("HabboMain", "HabboMain"), "_-1Be")
      jump                L51

      multiply_i
      rshift
      lessthan
      pushtrue
      lessequals
      istypelate
L51:
      callpropvoid        QName(PackageNamespace(""), "removeEventListener"), 2

      getlocal0
      pushnull
      initproperty        QName(PrivateNamespace("HabboMain", "HabboMain"), "_-2GU")

L55:
      getlex              QName(PackageNamespace(""), "parent")
      iffalse             L60

      getlex              QName(PackageNamespace(""), "parent")
      getlocal0
      callpropvoid        QName(PackageNamespace(""), "removeChild"), 1

L60:
      returnvoid
     end ; code
    end ; body
   end ; method
  end ; trait

The "jump" keyword is the same as goto in C#, in other words it jumps over all code until it gets the label(L)specified. YOu can see that the grey code is not used at all, so all the red and grey code can safetly be removed.


In new SWFs: (RELEASE63-35336-34886-201108141653_b28e2fe29de7c1bcbead98a6d809730e+)
This obscufation isn't that much more complicated, but it requires a lot more work. I'm now 100% sure how this works, but I think I've found it! In all obscured methods, it's defined 2 bools. These are used with other methods to create "fake ifs". By fake ifs I mean ifs which always is true or false. Code explains better than words, obscuring in red:
Code:

  trait method QName(PackageNamespace(""), "_-23m")
   method
    refid "_-0J9:_-47R/_-23m"
    returns QName(PackageNamespace("_-0Vl"), "_-3Me")
    body
     maxstack 4
     localcount 3
     initscopedepth 5
     maxscopedepth 6
     code
      pushfalse
      pushtrue
      setlocal1

      setlocal2
      Local 1 is TRUE
      Local 2 is FALSE
      debugfile           "k"

      getlocal1
      dup
      iftrue              L11 Always true jump to L11

      pop
      getlocal1
      convert_b
L11:
      iffalse             L13 Never true, ignore

      debugline           26
L13:
      getlocal0
      pushscope

      getlocal2
      iftrue              L18 Local 2 = false, ignore..

      debugline           28
L18:
      getlex              QName(ProtectedNamespace("_-s7"), "_-2t0")
      getlex              QName(PackageNamespace("_-0Vl"), "_-3Me")
      astypelate
      returnvalue
     end ; code
    end ; body
   end ; method
  end ; trait

