Tutorial on unlocking SOME sitelock
If you don't know how to hack, just want to get it unlocked, you can try.
Tutorial on unlocking SOME sitelock Posted on: 04/04/2012 3:49am
Quote Post
As far as I know, there are some kinds of sitelock, you may want to unlock it.
If you don't understand what I'm writing here, don't ask me, I'm NOT responsible for answering the question.

Tools:
Firefox plugin - HTTP Live Header
SWF Memory Dumper
SWF Decrypt
UnSWFEncryptUnp
Notepad
A professional Hex Editor such as Hex Editor Neo
SoThink SWF Decompiler
SoThink SWF Editor
Optional but useful: Apache Httpd Server

Here are some kinds of sitelocks, if it is obfuscated, you may find something similar, and you should know how to deobfuscate it using UnSWFEncryptUnp and SWF Decrypt. You need to hex edit the swf instead of using cheat engine.

AS2:
The Simplest one
Hashed Level Names

AS3:
The Simplest one
Binary in SWF



AS2: The Simplest One Posted on: 04/04/2012 3:58am
Quote Post

There is such a function in NitromeGame:


? ? ? function getNitrome() {
? ? ? ? ? ? ? var _loc5 = false;
? ? ? ? ? ? ? for (var _loc3 = 0; _loc3 < nitrome_url.length; ++_loc3) {
? ? ? ? ? ? ? ? ? ? ? var _loc4 = nitrome_url[_loc3];
? ? ? ? ? ? ? ? ? ? ? if (_root._url.substr(0, _loc4.length) == _loc4) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _loc5 = true;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? }
? ? ? ? ? ? ? return (_loc5);
? ? ? }

Change var _loc5 = false to var _loc5 = true

In AoB
? ? ? //4f
? ? ? _setMember
? ? ? //96 04 00 04 02 08 09
? ? ? _push register2 "getNitrome"
? ? ? //8e 08 00 00 00 00 06 69 00 9a 00
? ? ? _defineFunction2 '' [0 params]() //regCount[0x06], flag[0x69], end offset is: #77
? ? ? //96 02 00 05 00 -> 96 02 00 05 01
? ? ? _push false
? ? ? //87 01 00 05
? ? ? _storeRegister 5

? ? ? //17
? ? ? _pop
? ? ? //96 09 00 06 00 00 00 00 00 00 00 00
? ? ? _push 0
? ? ? //87 01 00 03
? ? ? _storeRegister 3
? ? ? //17
? ? ? _pop

Then, play through the whole game on genuine site, unlock all levels, use Live HTTP Header, on the second page, select request (and don't be noob to cancel capture).
Click on each level, and let it generate a request to the level file, so you know the path, download the levels.



AS2: Hashed Level Names Posted on: 04/04/2012 4:23am
Quote Post

You have to apply AS2: The Simplest One first


Find these 2 functions in SaveFunction

? ? ? function getDataFile() {
? ? ? ? ? ? ? var _loc3 = String(_root.gcs + _root.gcid);
? ? ? ? ? ? ? var _loc4 = md5.hash(_loc3);
? ? ? ? ? ? ? return (_loc4);
? ? ? }
? ? ? function getLevelPrefix(num) {
? ? ? ? ? ? ? var _loc4 = String(_root.lpfx + num);
? ? ? ? ? ? ? var _loc3 = md5.hash(_loc4);
? ? ? ? ? ? ? return (_loc3);
? ? ? }

Now play through the original game and use Live HTTP Header to capture each level's name, and the name of a file that will load on each level.

? ? ? function getDataFile() {
? ? ? ? ? ? ? var _loc3 = String(_root.gcs + _root.gcid);
? ? ? ? ? ? ? var _loc4 = md5.hash(_loc3);
? ? ? ? ? ? ? return (_loc4);
? ? ? }
->
? ? ? function getDataFile() {
? ? ? ? ? ? ? return (%The name of file that will load on each level%);
? ? ? }
And
? ? ? function getLevelPrefix(num) {
? ? ? ? ? ? ? var _loc4 = String(_root.lpfx + num);
? ? ? ? ? ? ? var _loc3 = md5.hash(_loc4);
? ? ? ? ? ? ? return (_loc3);
? ? ? }
->
? ? ? function getLevelPrefix(num) {
? ? ? ? ? ? return (String(num));
? ? ? }

That is, in AoB
? ? ? //4f
? ? ? _setMember
? ? ? //96 04 00 04 02 08 1e
? ? ? _push register2 "getDataFile"
? ? ? //8e 08 00 00 00 00 05 69 00 37 00
? ? ? _defineFunction2 '' [0 params]() //regCount[0x05], flag[0x69], end offset is: #405
? ? ? //96 04 00 04 02 08 1f
? ? ? _push register2 "gcs"
? ? ? //4e
? ? ? _getMember
? ? ? //96 04 00 04 02 08 11
? ? ? _push register2 "gcid"
? ? ? //4e
? ? ? _getMember
? ? ? //47
? ? ? _add2
? ? ? //4b
? ? ? _toString
? ? ? //87 01 00 03
? ? ? _storeRegister 3
? ? ? //17
? ? ? _pop
? ? ? //96 0b 00 04 03 07 01 00 00 00 04 01 08 06
? ? ? _push register3 1 register1 "md5"
? ? ? //4e
? ? ? _getMember
? ? ? //96 02 00 08 20
? ? ? _push "hash"
? ? ? //52
? ? ? _callMethod
? ? ? //87 01 00 04
? ? ? _storeRegister 4
? ? ? //17
? ? ? _pop
? ? ? //96 02 00 04 04
? ? ? _push register4

? ? ? //3e
? ? ? _return
->
? ? ? // 96 22 00 00 (Here is the name you found in HEX, don't put an A if you see A in the name) 00
? ? ? _push "That Lengthy Name"
? ? ? // 01 ...(A lot of)... 01
? ? ? _Nop, you should replace all BOLDED content afterwards with 01 until the 3e, which is NOT bolded

? ? ? //4f
? ? ? _setMember
? ? ? //96 04 00 04 02 08 21
? ? ? _push register2 "getLevelPrefix"
? ? ? //8e 0d 00 00 01 00 06 69 00 05 6e 75 6d 00 34 00
? ? ? _defineFunction2 '' [1 params](<reg5>num) //regCount[0x06], flag[0x69], end offset is: #423
? ? ? //96 04 00 04 02 08 22
? ? ? _push register2 "lpfx"
? ? ? //4e
? ? ? _getMember
? ? ? //96 02 00 04 05
? ? ? _push register5
? ? ? //47
? ? ? _add2
? ? ? //4b
? ? ? _toString
? ? ? //87 01 00 04
? ? ? _storeRegister 4
? ? ? //17
? ? ? _pop
? ? ? //96 0b 00 04 04 07 01 00 00 00 04 01 08 06
? ? ? _push register4 1 register1 "md5"
? ? ? //4e
? ? ? _getMember
? ? ? //96 02 00 08 20
? ? ? _push "hash"
? ? ? //52
? ? ? _callMethod
? ? ? //87 01 00 03
? ? ? _storeRegister 3
? ? ? //17
? ? ? _pop
? ? ? //96 02 00 04 03
? ? ? _push register3

? ? ? //3e
? ? ? _return
->
? ? ? // 96 02 00 04 05
? ? ? _push register5
? ? ? //4b
? ? ? _toString
? ? ? // 01 ...(A lot of)... 01
? ? ? _Nop, you should replace all BOLDED content afterwards with 01 until the 3e, which is NOT bolded

Now, Download the swf that always load on each level and all levels files, rename each level to 1, 2, 3...., place them in correct relative folder structure as it is in it server and you are done.



AS3: The Simplest One Posted on: 04/04/2012 7:58am
Quote Post
In NitromeGame package, find this function

? ? ? ? ? ? ? public static function isAtURL(... args) : Boolean {
? ? ? ? ? ? ? ? ? ? ? var _loc_6:Boolean = true;
? ? ? ? ? ? ? ? ? ? ? ;
? ? ? ? ? ? ? ? ? ? ? var _loc_5:* = _loc_5;
? ? ? ? ? ? ? ? ? ? ? args++;
? ? ? ? ? ? ? ? ? ? ? args--;
? ? ? ? ? ? ? ? ? ? ? var _loc_7:* = null is false;
? ? ? ? ? ? ? ? ? ? ? var _loc_3:Array = null;
? ? ? ? ? ? ? ? ? ? ? var _loc_4:int = 0;
? ? ? ? ? ? ? ? ? ? ? var _loc_5:String = null;
? ? ? ? ? ? ? ? ? ? ? if (!_loc_7){
? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? args.push(NITROME_URL);
? ? ? ? ? ? ? ? ? ? ? args = 0;
? ? ? ? ? ? ? ? ? ? ? while (args < args.length){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _loc_3++;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? args++;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _loc_3--;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _loc_3 = args[args];
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (!_loc_7){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _loc_4 = 0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (_loc_6 || args){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? while (_loc_4 < _loc_3.length){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _loc_5 = _loc_3[_loc_4];
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _loc_3 = null;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _loc_3--;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _loc_5--;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return true;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (_loc_6){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _loc_4++;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? args++;
? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? return false; -> return true;
? ? ? ? ? ? ? }

That is, in AoB, the last part of the function is
//66 05
_as3_getproperty length
//15 b8 ff ff
_as3_iflt offset: -72
//c2 02
_as3_inclocal_i <2>
//d2
_as3_getlocal <2>
//d1
_as3_getlocal <1>
//66 05
_as3_getproperty length
//15 7a ff ff
_as3_iflt offset: -134
//27 -> 26
_as3_pushfalse -> _as3_pushtrue

//48
_as3_returnvalue
? ? ? ? ? ? ? }



AS3: Binary in SWF Posted on: 04/04/2012 9:01am
Quote Post
Open game swf with SWF Editor,
Search for binarydata, you will be brought to DefineBinaryData tag,
Right click and save as "original"

Edit with hex editor
you will see
XX XX XX XX (Old Binary Data) 00 00
Delete the first 4 bytes and the last 2 bytes of 00
Save it.

Using SWF Memory Dump, open the game, look for an approx. 200KB file, dump and uncompress it.
Do AS3: The Simplest One on this smaller swf.
Compress it, open it with hex editor.
Copy the first 12 byte of original and insert it at the begining.
You will see XX XX ?? ?? ?? ?? XX XX YY YY YY YY (here is your new binary data, it looks like 43 57 53 ........ )
Count the length of your binary data starting from YY YY YY YY and write it to ?? ?? ?? ?? in little endian

In the game swf, replace the whole original hex code with the whole new hex code.
Scroll to the begining of game swf, there is XX 57 53 XX ?? ?? ?? ?? ....
Count the number of byte of the whole swf and write it in ?? ?? ?? ?? in little endian.
Save it and it is done.