Philymaster's Security Archive (Bully: Scholarship Edition)

Philymaster Oct 19, 2014

  1. Ph

    Philymaster X360 Dev XPG Developer
    0/47

    Joined:
    Feb 25, 2011
    Messages:
    105
    Likes Received:
    574
    Trophy Points:
    35
    Gender:
    Male
    Console:
    Xbox
    SECURITY ARCHIVE

    Here I release informations and code snippets about games I've reversed.
    The released code is free to use. All I want is proper credit.

    Requests
    If you can not find your wanted game, you can write me a private message or just reply here to request it.
    I will do my best then to reverse the security as fast as I can.​

    Alien: Isolation

    Security:
    -> Custom SHA1
    . . . Offset: 8
    . . . Calc. Start: 32
    . . . Calc. Length: See Code

    Additional:
    A SHA1 hash is calculated and moved to a buffer with the size of 24.
    The three Int64 values of the buffer are combined using XOR.


    byte[] data = File.ReadAllBytes(o.FileName);

    int calcLen;
    using (var r = new Reader(data, Endian.BIG)) {
    r.Position = 24;
    calcLen = r.ReadInt32() + r.ReadInt32() - 32;

    byte[] hash = new byte[24];
    using (var sha = new SHA1Managed()) {
    sha.TransformFinalBlock(data, 32, calcLen);
    Buffer.BlockCopy(sha.Hash, 0, hash, 0, 20);
    }

    long checksum = 0;
    fixed (byte* x = hash) {
    long* hashP = (long*) x;

    for (int i = 0; i < 3; ++i, ++hashP) {
    checksum ^= *hashP;
    }
    }
    }

    Anomaly: Warzone Earth

    Security:
    -> Custom CRC-32
    . . . Offset: 12
    . . . Calc. Start: 16
    . . . Calc. Length: Stored in TitleSpecific before CRC

    Additional:
    Polynomial: 0x04C11DB7
    Initial Value: 0
    Reflection: None
    XOR Out: 0

    Also note that each TitleSpecifc has it's own checksum.

    Battleblock Theater

    Security:
    -> SHA1
    . . . Offset: Filesize - 20
    . . . Calc. Start: 0
    . . . Calc. Length: Filesize - 20
    -> Blowfish Encryption

    Additional:
    At the start of the save a Int64 salt is stored, which is used to generate the key for the Blowfish en/decryption.
    The other salt for the generation is the XUID of the gamer profile, at least if it's an online profile. Otherwise the Profile ID is used.

    After the encrypted data it follows a SHA1 hash, which computes both the salt and the encrypted data.

    Code (BLOWFISH):


    public class Blowfish {
    private int[ ] P = (int[ ]) (object) new uint[ ] { 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x3707344, 0xA4093822, 0x299F31D0, 0x82EFA98, 0xEC4E6C89, 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C, 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917, 0x9216D5D9, 0x8979FB1B };
    private int[,] S = (int[,]) (object) new uint[,] {
    { 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7, 0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99, 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16, 0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E, 0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE, 0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013, 0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF, 0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E, 0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60, 0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440, 0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE, 0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A, 0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E, 0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677, 0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193, 0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032, 0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88, 0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239, 0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E, 0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0, 0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3, 0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98, 0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88, 0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE, 0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6, 0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D, 0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B, 0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7, 0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA, 0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463, 0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F, 0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09, 0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3, 0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB, 0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279, 0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8, 0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB, 0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82, 0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB, 0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573, 0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0, 0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B, 0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790, 0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8, 0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4, 0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0, 0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7, 0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C, 0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD, 0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1, 0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299, 0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9, 0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477, 0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF, 0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49, 0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF, 0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA, 0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5, 0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41, 0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915, 0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400, 0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915, 0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664, 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A },
    { 0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623, 0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266, 0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1, 0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E, 0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6, 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1, 0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E, 0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1, 0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737, 0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8, 0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF, 0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD, 0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701, 0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7, 0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41, 0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331, 0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF, 0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF, 0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E, 0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87, 0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C, 0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2, 0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16, 0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD, 0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B, 0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509, 0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E, 0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3, 0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F, 0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A, 0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4, 0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960, 0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66, 0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28, 0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802, 0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84, 0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510, 0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF, 0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14, 0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E, 0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50, 0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7, 0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8, 0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281, 0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99, 0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696, 0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128, 0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73, 0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0, 0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0, 0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105, 0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250, 0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3, 0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285, 0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00, 0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061, 0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB, 0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E, 0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735, 0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC, 0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9, 0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340, 0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20, 0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7 },
    { 0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934, 0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068, 0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF, 0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840, 0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45, 0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504, 0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A, 0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB, 0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE, 0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6, 0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42, 0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B, 0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2, 0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB, 0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527, 0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B, 0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33, 0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C, 0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3, 0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC, 0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17, 0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564, 0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B, 0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115, 0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922, 0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728, 0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0, 0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E, 0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37, 0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D, 0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804, 0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B, 0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3, 0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB, 0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D, 0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C, 0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350, 0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9, 0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A, 0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE, 0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D, 0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC, 0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F, 0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61, 0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2, 0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9, 0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2, 0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C, 0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E, 0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633, 0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10, 0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169, 0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52, 0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027, 0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5, 0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62, 0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634, 0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76, 0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24, 0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC, 0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4, 0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C, 0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837, 0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0 },
    { 0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B, 0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE, 0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B, 0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4, 0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8, 0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6, 0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304, 0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22, 0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4, 0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6, 0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9, 0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59, 0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593, 0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51, 0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28, 0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C, 0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B, 0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28, 0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C, 0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD, 0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A, 0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319, 0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB, 0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F, 0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991, 0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32, 0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680, 0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166, 0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE, 0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB, 0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5, 0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47, 0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370, 0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D, 0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84, 0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048, 0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8, 0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD, 0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9, 0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7, 0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38, 0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F, 0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C, 0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525, 0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1, 0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442, 0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964, 0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E, 0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8, 0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D, 0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F, 0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299, 0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02, 0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC, 0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614, 0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A, 0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6, 0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B, 0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0, 0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060, 0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E, 0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9, 0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F, 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6 }
    };

    public Blowfish(byte[] KEY) {
    for (int i = 0, next = 0, r11 = 0; i < 18; ++i, next = 0) {
    for (int j = 0; j < 4; ++j, r11 %= KEY.Length)
    next = (next << 8) | KEY[r11++];

    P ^= next;
    }

    int xL = 0, xR = 0;
    for (int i = 0; i < 18;) {
    this.EncryptBlock(ref xL, ref xR);
    P[i++] = xL;
    P[i++] = xR;
    }

    for (int i = 0; i < 4; ++i) {
    for (int j = 0; j < 256;) {
    this.EncryptBlock(ref xL, ref xR);
    S[i, j++] = xL;
    S[i, j++] = xR;
    }
    }
    }

    public unsafe byte[] Encrypt(byte[] uData) {
    byte[] eData = new byte[uData.Length];
    int xL, xR;

    fixed (byte* u = uData, e = eData) {
    int* eP = (int*)e,
    uP = (int*)u;

    for (int i = 0; i < (uData.Length >> 3); ++i) {
    xL = (*uP++).Swap();
    xR = (*uP++).Swap();
    this.EncryptBlock(ref xL, ref xR);
    *eP++ = xL = xL.Swap();
    *eP++ = xR = xR.Swap();
    }
    }

    return eData;
    }

    public unsafe byte[] Decrypt(byte[] eData) {
    byte[] uData = new byte[eData.Length];

    fixed (byte* e = eData, u = uData) {
    int* eP = (int*)e,
    uP = (int*)u;

    int xL, xR;
    for (int i = 0; i < (eData.Length >> 3); ++i) {
    xL = (*eP++).Swap();
    xR = (*eP++).Swap();
    this.DecryptBlock(ref xL, ref xR);
    *uP++ = xL = xL.Swap();
    *uP++ = xR = xR.Swap();
    }
    }

    return uData;
    }

    private void EncryptBlock(ref int xL, ref int xR) {
    int r11 = 0;
    for (int i = 0; i < 16; ++i) {
    r11 = this.P ^ xL;

    xL = (((this.S[0, (byte) (r11 >> 24)] + this.S[1, (byte) (r11 >> 16)]) ^ this.S[2, (byte) (r11 >> 8)]) + this.S[3, (byte) r11]) ^ xR;
    xR = r11;
    }

    xR = this.P[16] ^ xL;
    xL = this.P[17] ^ r11;
    }

    private void DecryptBlock(ref int xL, ref int xR) {
    int r11 = 0;
    for (int i = 0; i < 16; ++i) {
    r11 = this.P[17 - i] ^ xL;

    xL = (((this.S[0, (byte) (r11 >> 24)] + this.S[1, (byte) (r11 >> 16)]) ^ this.S[2, (byte) (r11 >> 8)]) + this.S[3, (byte) r11]) ^ xR;
    xR = r11;
    }

    xR = this.P[1] ^ xL;
    xL = this.P[0] ^ r11;
    }
    }
    Code (KEY GENERATION):


    public byte[] CreateUserKey(ulong uXUID, ulong uSALT, int size = 16) {
    byte[] uKEY = new byte[size];

    int n = 0, next, r9, r8 = 1;
    for (int i = 0; i < 128; ++i) {
    next = uKEY[n] << 1;

    if ((i & 1) == r8) {
    r9 = (int)(uXUID & 1);
    uXUID >>= 1;
    } else {
    r9 = (int)(uSALT & 1);
    uSALT >>= 1;
    }

    next += r9;
    uKEY[n++] = (byte)next;

    if (n >= size) {
    r8 = ~r8 + 2;
    n = 0;
    }
    }

    return uKEY;
    }
    The next code snippets demonstrates the en/decryption.

    Code (DECRYPTION):


    var uKEY = CreateUserKey(0xE00009A452DEAD39, 0x8F774B617BA45E2E);
    var decData = new Blowfish(uKEY).Decrypt( . . . );
    Code (ENCRYPTION):


    var uKEY = CreateUserKey(0xE00009A452DEAD39, 0x8F774B617BA45E2E);
    var encData = new Blowfish(uKEY).Encrypt( . . . );


    Battlefield: Bad Company

    Security:
    -> 3x EA Checksum
    . . . Offset: 16, 20, 24
    . . . Calc. Start: 28, 48, 0
    . . . Calc. Length: 20, 0xFA000, 24
    -> 2x Custom MD5
    . . . Offset: 28, 48
    . . . Calc. Start: 44, 64
    . . . Calc. Length: 4, 0xF9FF0

    Additional:
    Check out the example code for the right order of the checksum calculations.


    private int[] table = (int[]) (object) new uint[] { 0x0, 0x4C11DB7, 0x9823B6E, 0xD4326D9, 0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005, 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61, 0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD, 0x4C11DB70, 0x48D0C6C7, 0x4593E01E, 0x4152FDA9, 0x5F15ADAC, 0x5BD4B01B, 0x569796C2, 0x52568B75, 0x6A1936C8, 0x6ED82B7F, 0x639B0DA6, 0x675A1011, 0x791D4014, 0x7DDC5DA3, 0x709F7B7A, 0x745E66CD, 0x9823B6E0, 0x9CE2AB57, 0x91A18D8E, 0x95609039, 0x8B27C03C, 0x8FE6DD8B, 0x82A5FB52, 0x8664E6E5, 0xBE2B5B58, 0xBAEA46EF, 0xB7A96036, 0xB3687D81, 0xAD2F2D84, 0xA9EE3033, 0xA4AD16EA, 0xA06C0B5D, 0xD4326D90, 0xD0F37027, 0xDDB056FE, 0xD9714B49, 0xC7361B4C, 0xC3F706FB, 0xCEB42022, 0xCA753D95, 0xF23A8028, 0xF6FB9D9F, 0xFBB8BB46, 0xFF79A6F1, 0xE13EF6F4, 0xE5FFEB43, 0xE8BCCD9A, 0xEC7DD02D, 0x34867077, 0x30476DC0, 0x3D044B19, 0x39C556AE, 0x278206AB, 0x23431B1C, 0x2E003DC5, 0x2AC12072, 0x128E9DCF, 0x164F8078, 0x1B0CA6A1, 0x1FCDBB16, 0x18AEB13, 0x54BF6A4, 0x808D07D, 0xCC9CDCA, 0x7897AB07, 0x7C56B6B0, 0x71159069, 0x75D48DDE, 0x6B93DDDB, 0x6F52C06C, 0x6211E6B5, 0x66D0FB02, 0x5E9F46BF, 0x5A5E5B08, 0x571D7DD1, 0x53DC6066, 0x4D9B3063, 0x495A2DD4, 0x44190B0D, 0x40D816BA, 0xACA5C697, 0xA864DB20, 0xA527FDF9, 0xA1E6E04E, 0xBFA1B04B, 0xBB60ADFC, 0xB6238B25, 0xB2E29692, 0x8AAD2B2F, 0x8E6C3698, 0x832F1041, 0x87EE0DF6, 0x99A95DF3, 0x9D684044, 0x902B669D, 0x94EA7B2A, 0xE0B41DE7, 0xE4750050, 0xE9362689, 0xEDF73B3E, 0xF3B06B3B, 0xF771768C, 0xFA325055, 0xFEF34DE2, 0xC6BCF05F, 0xC27DEDE8, 0xCF3ECB31, 0xCBFFD686, 0xD5B88683, 0xD1799B34, 0xDC3ABDED, 0xD8FBA05A, 0x690CE0EE, 0x6DCDFD59, 0x608EDB80, 0x644FC637, 0x7A089632, 0x7EC98B85, 0x738AAD5C, 0x774BB0EB, 0x4F040D56, 0x4BC510E1, 0x46863638, 0x42472B8F, 0x5C007B8A, 0x58C1663D, 0x558240E4, 0x51435D53, 0x251D3B9E, 0x21DC2629, 0x2C9F00F0, 0x285E1D47, 0x36194D42, 0x32D850F5, 0x3F9B762C, 0x3B5A6B9B, 0x315D626, 0x7D4CB91, 0xA97ED48, 0xE56F0FF, 0x1011A0FA, 0x14D0BD4D, 0x19939B94, 0x1D528623, 0xF12F560E, 0xF5EE4BB9, 0xF8AD6D60, 0xFC6C70D7, 0xE22B20D2, 0xE6EA3D65, 0xEBA91BBC, 0xEF68060B, 0xD727BBB6, 0xD3E6A601, 0xDEA580D8, 0xDA649D6F, 0xC423CD6A, 0xC0E2D0DD, 0xCDA1F604, 0xC960EBB3, 0xBD3E8D7E, 0xB9FF90C9, 0xB4BCB610, 0xB07DABA7, 0xAE3AFBA2, 0xAAFBE615, 0xA7B8C0CC, 0xA379DD7B, 0x9B3660C6, 0x9FF77D71, 0x92B45BA8, 0x9675461F, 0x8832161A, 0x8CF30BAD, 0x81B02D74, 0x857130C3, 0x5D8A9099, 0x594B8D2E, 0x5408ABF7, 0x50C9B640, 0x4E8EE645, 0x4A4FFBF2, 0x470CDD2B, 0x43CDC09C, 0x7B827D21, 0x7F436096, 0x7200464F, 0x76C15BF8, 0x68860BFD, 0x6C47164A, 0x61043093, 0x65C52D24, 0x119B4BE9, 0x155A565E, 0x18197087, 0x1CD86D30, 0x29F3D35, 0x65E2082, 0xB1D065B, 0xFDC1BEC, 0x3793A651, 0x3352BBE6, 0x3E119D3F, 0x3AD08088, 0x2497D08D, 0x2056CD3A, 0x2D15EBE3, 0x29D4F654, 0xC5A92679, 0xC1683BCE, 0xCC2B1D17, 0xC8EA00A0, 0xD6AD50A5, 0xD26C4D12, 0xDF2F6BCB, 0xDBEE767C, 0xE3A1CBC1, 0xE760D676, 0xEA23F0AF, 0xEEE2ED18, 0xF0A5BD1D, 0xF464A0AA, 0xF9278673, 0xFDE69BC4, 0x89B8FD09, 0x8D79E0BE, 0x803AC667, 0x84FBDBD0, 0x9ABC8BD5, 0x9E7D9662, 0x933EB0BB, 0x97FFAD0C, 0xAFB010B1, 0xAB710D06, 0xA6322BDF, 0xA2F33668, 0xBCB4666D, 0xB8757BDA, 0xB5365D03, 0xB1F740B4 };

    private byte[] CalculateCustomMD5(byte[] data, int offset, int size) {
    using (var x = new MD5CryptoServiceProvider()) {
    x.TransformFinalBlock(data, offset, size);
    byte[] res = x.Hash;
    byte t;

    t = res[0];
    res[0] = res[3];
    res[3] = t;

    t = res[1];
    res[1] = res[2];
    res[2] = t;

    t = res[4];
    res[4] = res[5];
    res[5] = t;

    t = res[6];
    res[6] = res[7];
    res[7] = t;

    return res;
    }
    }

    private int CalculateEA(byte[] data, int offset, int size) {
    if (size < 4)
    return 0;

    int sum = ~((data[offset++] << 24) | (data[offset++] << 16) | (data[offset++] << 8) | data[offset++]);

    size -= 4;
    while (size-- > 0)
    sum = (data[offset++] | (sum << 8)) ^ table[(byte) (sum >> 24)];

    return ~sum;
    }
    Here an example how to calculate and write the checksums:


    var newData = File.ReadAllBytes(o.FileName);

    using (var w = new Writer(newData, Endian.BIG)) {
    w.Position = 28;
    w.WriteBytes(CalculateCustomMD5(newData, 44, 4));

    w.Position = 48;
    w.WriteBytes(CalculateCustomMD5(newData, 64, 0xF9FF0));

    w.Position = 16;
    w.WriteInt32(CalculateEA(newData, 28, 20));
    w.WriteInt32(CalculateEA(newData, 48, 0xFA000));
    w.WriteInt32(CalculateEA(newData, 0, 24));
    }

    File.WriteAllBytes(o.FileName + ".FIXED", newData);

    Battlefield: Bad Company 2

    Security:
    -> 3x EA Checksum
    . . . Offset: 16, 20, 24
    . . . Calc. Start: 28, 36, 0
    . . . Calc. Length: 8, 0xFA000, 24
    -> 2x CRC32
    . . . Offset: 28, 36
    . . . Calc. Start: 32, 40
    . . . Calc. Length: 4, 0xF9FFC

    Additional:
    Check out the example code for the right order of the checksum calculations.


    private int[] customTable = (int[]) (object) new uint[] { 0x0, 0x77073096, 0xEE0E612C, 0x990951BA, 0x76DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, 0xEDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x9B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x1DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x6B6B51F, 0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0xF00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x86D3D2D, 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x3B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x4DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84, 0xD6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0xA00AE27, 0x7D079EB1, 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x26D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x5005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0xCB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0xBDBDF21, 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D };
    private int[] table = (int[]) (object) new uint[] { 0x0, 0x4C11DB7, 0x9823B6E, 0xD4326D9, 0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005, 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61, 0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD, 0x4C11DB70, 0x48D0C6C7, 0x4593E01E, 0x4152FDA9, 0x5F15ADAC, 0x5BD4B01B, 0x569796C2, 0x52568B75, 0x6A1936C8, 0x6ED82B7F, 0x639B0DA6, 0x675A1011, 0x791D4014, 0x7DDC5DA3, 0x709F7B7A, 0x745E66CD, 0x9823B6E0, 0x9CE2AB57, 0x91A18D8E, 0x95609039, 0x8B27C03C, 0x8FE6DD8B, 0x82A5FB52, 0x8664E6E5, 0xBE2B5B58, 0xBAEA46EF, 0xB7A96036, 0xB3687D81, 0xAD2F2D84, 0xA9EE3033, 0xA4AD16EA, 0xA06C0B5D, 0xD4326D90, 0xD0F37027, 0xDDB056FE, 0xD9714B49, 0xC7361B4C, 0xC3F706FB, 0xCEB42022, 0xCA753D95, 0xF23A8028, 0xF6FB9D9F, 0xFBB8BB46, 0xFF79A6F1, 0xE13EF6F4, 0xE5FFEB43, 0xE8BCCD9A, 0xEC7DD02D, 0x34867077, 0x30476DC0, 0x3D044B19, 0x39C556AE, 0x278206AB, 0x23431B1C, 0x2E003DC5, 0x2AC12072, 0x128E9DCF, 0x164F8078, 0x1B0CA6A1, 0x1FCDBB16, 0x18AEB13, 0x54BF6A4, 0x808D07D, 0xCC9CDCA, 0x7897AB07, 0x7C56B6B0, 0x71159069, 0x75D48DDE, 0x6B93DDDB, 0x6F52C06C, 0x6211E6B5, 0x66D0FB02, 0x5E9F46BF, 0x5A5E5B08, 0x571D7DD1, 0x53DC6066, 0x4D9B3063, 0x495A2DD4, 0x44190B0D, 0x40D816BA, 0xACA5C697, 0xA864DB20, 0xA527FDF9, 0xA1E6E04E, 0xBFA1B04B, 0xBB60ADFC, 0xB6238B25, 0xB2E29692, 0x8AAD2B2F, 0x8E6C3698, 0x832F1041, 0x87EE0DF6, 0x99A95DF3, 0x9D684044, 0x902B669D, 0x94EA7B2A, 0xE0B41DE7, 0xE4750050, 0xE9362689, 0xEDF73B3E, 0xF3B06B3B, 0xF771768C, 0xFA325055, 0xFEF34DE2, 0xC6BCF05F, 0xC27DEDE8, 0xCF3ECB31, 0xCBFFD686, 0xD5B88683, 0xD1799B34, 0xDC3ABDED, 0xD8FBA05A, 0x690CE0EE, 0x6DCDFD59, 0x608EDB80, 0x644FC637, 0x7A089632, 0x7EC98B85, 0x738AAD5C, 0x774BB0EB, 0x4F040D56, 0x4BC510E1, 0x46863638, 0x42472B8F, 0x5C007B8A, 0x58C1663D, 0x558240E4, 0x51435D53, 0x251D3B9E, 0x21DC2629, 0x2C9F00F0, 0x285E1D47, 0x36194D42, 0x32D850F5, 0x3F9B762C, 0x3B5A6B9B, 0x315D626, 0x7D4CB91, 0xA97ED48, 0xE56F0FF, 0x1011A0FA, 0x14D0BD4D, 0x19939B94, 0x1D528623, 0xF12F560E, 0xF5EE4BB9, 0xF8AD6D60, 0xFC6C70D7, 0xE22B20D2, 0xE6EA3D65, 0xEBA91BBC, 0xEF68060B, 0xD727BBB6, 0xD3E6A601, 0xDEA580D8, 0xDA649D6F, 0xC423CD6A, 0xC0E2D0DD, 0xCDA1F604, 0xC960EBB3, 0xBD3E8D7E, 0xB9FF90C9, 0xB4BCB610, 0xB07DABA7, 0xAE3AFBA2, 0xAAFBE615, 0xA7B8C0CC, 0xA379DD7B, 0x9B3660C6, 0x9FF77D71, 0x92B45BA8, 0x9675461F, 0x8832161A, 0x8CF30BAD, 0x81B02D74, 0x857130C3, 0x5D8A9099, 0x594B8D2E, 0x5408ABF7, 0x50C9B640, 0x4E8EE645, 0x4A4FFBF2, 0x470CDD2B, 0x43CDC09C, 0x7B827D21, 0x7F436096, 0x7200464F, 0x76C15BF8, 0x68860BFD, 0x6C47164A, 0x61043093, 0x65C52D24, 0x119B4BE9, 0x155A565E, 0x18197087, 0x1CD86D30, 0x29F3D35, 0x65E2082, 0xB1D065B, 0xFDC1BEC, 0x3793A651, 0x3352BBE6, 0x3E119D3F, 0x3AD08088, 0x2497D08D, 0x2056CD3A, 0x2D15EBE3, 0x29D4F654, 0xC5A92679, 0xC1683BCE, 0xCC2B1D17, 0xC8EA00A0, 0xD6AD50A5, 0xD26C4D12, 0xDF2F6BCB, 0xDBEE767C, 0xE3A1CBC1, 0xE760D676, 0xEA23F0AF, 0xEEE2ED18, 0xF0A5BD1D, 0xF464A0AA, 0xF9278673, 0xFDE69BC4, 0x89B8FD09, 0x8D79E0BE, 0x803AC667, 0x84FBDBD0, 0x9ABC8BD5, 0x9E7D9662, 0x933EB0BB, 0x97FFAD0C, 0xAFB010B1, 0xAB710D06, 0xA6322BDF, 0xA2F33668, 0xBCB4666D, 0xB8757BDA, 0xB5365D03, 0xB1F740B4 };

    private int CalculateCustom(byte[] data, int offset, int size, int sum) {
    if (data == null)
    return 0;

    sum = ~sum;
    while (size-- > 0)
    sum = customTable[(byte) (data[offset++] ^ sum)] ^ ((sum >> 8) & 0xFFFFFF);

    return ~sum;
    }

    private int CalculateEA(byte[] data, int offset, int size) {
    if (size < 4)
    return 0;

    int sum = ~((data[offset++] << 24) | (data[offset++] << 16) | (data[offset++] << 8) | data[offset++]);

    size -= 4;
    while (size-- > 0)
    sum = (data[offset++] | (sum << 8)) ^ table[(byte) (sum >> 24)];

    return ~sum;
    }
    Here an example how to calculate and write the checksums:


    var newData = File.ReadAllBytes(o.FileName);

    using (var w = new Writer(newData, Endian.BIG)) {
    w.Position = 28;
    w.WriteInt32(CalculateCustom(newData, 32, 4, 0x12345678));

    w.Position = 36;
    w.WriteInt32(CalculateCustom(newData, 40, 0xF9FFC, 0x12345678));

    w.Position = 16;
    w.WriteInt32(CalculateEA(newData, 28, 8));
    w.WriteInt32(CalculateEA(newData, 36, 0xFA000));
    w.WriteInt32(CalculateEA(newData, 0, 24));
    }

    File.WriteAllBytes(o.FileName + ".FIXED", newData);

    Bully: Scholarship Edition

    Security:
    -> Custom Checksum
    . . . Offset: 0
    . . . Calc. Start: 4
    . . . Calc. Length: FileSize - 4


    private int CalculateHash2(byte[] data, int offset, int size) {
    int t, sum = 0;

    for (offset += size; size > 0; --size) {
    sum = data[--offset] + (sum << 4);
    t = sum & 0xF000000;

    if (t != 0)
    sum ^= (t ^ (t >> 24));
    }

    return sum;
    }

    Dead Rising

    Security:
    -> Custom Checksum(s)
    . . . Offset: Stored after every 16 Byte chunk. (offset 16, 36, 56, ..., EOF - 4)
    . . . Calc. Start: First Byte of chunk.
    . . . Calc. Length: 16

    Additional:
    You can calculate the checksum count with: Filesize / 20.

    Like mentioned the game saves after every 16 Byte chunk of save data an Int32 value, which consist of two Int16 values.
    The first is just the sum of all bytes, whilst the second the sum of all even bytes minus the sum of all uneven bytes is.

    Here the formula:

    First: x[0] + x[1] + ...
    Second: x[0] - x[1] + x[2] - x[3] + x[4] - x[5] + x[6] - x[7] + x[8] - ...


    public unsafe void FixHashes(byte[] data, int offset, int size) {
    fixed (byte* x = data) {
    byte* e = x + offset + size;

    ushort sumL, sumH;
    for (byte* s = e - size; s < e; s += 4) {

    sumL = sumH = 0;
    for (int n = 0; n < 16; ++n, ++s) {
    sumL += *s;
    sumH += (ushort) ((n % 2) == 0 ? *s : -*s);
    }

    *(ushort*) s = sumL.Swap();
    *(ushort*) (s + 2) = sumH.Swap();
    }
    }
    }

    Digimon: ASR

    Security:
    -> Checksum32 (Signed)
    . . . Offset: 20
    . . . Calc. Start: 0
    . . . Calc. Length: 0x185E

    Additional:
    Before the new checksum is calculated, the old one is overwritten with 0.


    private int CalculateChecksum32(byte[] data, int offset, int size) {
    int sum = 0;

    while (size-- > 0)
    sum += (int) (sbyte) data[offset++];

    return sum;
    }

    DuckTales: Remastered

    Security:
    -> Custom Checksum
    . . . Offset: 0
    . . . Calc. Start: 16
    . . . Calc. Length: 0x400

    Additional:
    The code is not optimized yet, but will do this later. For now this code works. [:)]


    private ulong CalculateChecksum(byte[] data, int offset, int size) {
    uint r1, r2, r3, r4, r5, r6, r7, r8;

    r4 = (uint) size + 0xDEADC3C1;
    r6 = r4 + 0x162E;
    r5 = r4;

    if (size > 12) {
    for (int i = size / 12; i > 0; --i) {
    r7 = (uint) (data[offset++] + (data[offset++] << 8) + (data[offset++] << 16) + (data[offset++] << 24));
    r4 += (uint) (data[offset++] + (data[offset++] << 8) + (data[offset++] << 16) + (data[offset++] << 24));
    r6 += (uint) (data[offset++] + (data[offset++] << 8) + (data[offset++] << 16) + (data[offset++] << 24));

    r5 = (r5 + r7 - r6) ^ ((r6 << 4) | (r6 >> 28));
    r2 = r4 - r5;
    r4 += r6;
    r6 = r2 ^ ((r5 << 6) | (r5 >> 26));
    r5 += r4;
    r3 = r4 - r6;
    r4 = r6 + r5;
    r6 = r3 ^ ((r6 << 8) | (r6 >> 24));
    r3 = r4 + r6;
    r6 = (r5 - r6) ^ ((r6 << 16) | (r6 >> 16));
    r5 = r3 + r6;
    r6 = (r4 - r6) ^ ((r6 >> 13) | (r6 << 19));
    r4 = r5 + r6;
    r6 = (r3 - r6) ^ ((r6 << 4) | (r6 >> 28));
    }

    for (int i = 0; i < 4; ++i)
    r5 += (uint) data[offset++] << (i * 8);

    uint x0, x1;
    r3 = (r6 ^ r4) - ((r4 << 14) | (r4 >> 18));
    r1 = (r5 ^ r3) - ((r3 << 11) | (r3 >> 21));
    r4 = (r4 ^ r1) - ((r1 >> 7) | (r1 << 25));
    r6 = (r3 ^ r4) - ((r4 >> 16) | (r4 << 16));
    r8 = (r1 ^ r6) - ((r6 << 4) | (r6 >> 28));
    r5 = (r4 ^ r8) - ((r8 << 14) | (r8 >> 18));
    x1 = (r6 ^ r5) - ((r5 >> 8) | (r5 << 24));
    x0 = r5;

    return ((ulong) x1 << 32) | x0;
    }
    return 0;
    }

    Gears of War: Judgment

    Security:
    -> AES256
    -> LZO1X
    -> SHA1

    Additional:
    First the save is encrypted with AES256 using the key "@srAnD0m@s!7ge7z7@k37ha7m0Dd3rz ". After the decryption the first 20 bytes are the SHA1 hash, the next int32 the size of the decompressed data and all the following bytes are the compressed data.

    The hash computes both the int32 (decompressed size) and the compressed data, but take care of the 0 bytes at the end. The compression ends with 0x11 0x00 0x00. All bytes behind that are NOT calculated and are just padding for AES. Also important is, that the XUID of the gamer profile is used as a salt for calculating the hash.

    Halo: Spartan Assault

    Security:
    -> Custom Checksum
    . . . Offset: 24
    . . . Calc. Start: 0
    . . . Calc. Length: Entire File

    Additional:
    Before the new checksum is calculated, the old checksum is overwritten with 48 41 4C 4F 00 00 00 00.


    private ulong[] table = { 0x0, 0x42F0E1EBA9EA3693, 0x85E1C3D753D46D26, 0xC711223CFA3E5BB5, 0x493366450E42ECDF, 0xBC387AEA7A8DA4C, 0xCCD2A5925D9681F9, 0x8E224479F47CB76A, 0x9266CC8A1C85D9BE, 0xD0962D61B56FEF2D, 0x17870F5D4F51B498, 0x5577EEB6E6BB820B, 0xDB55AACF12C73561, 0x99A54B24BB2D03F2, 0x5EB4691841135847, 0x1C4488F3E8F96ED4, 0x663D78FF90E185EF, 0x24CD9914390BB37C, 0xE3DCBB28C335E8C9, 0xA12C5AC36ADFDE5A, 0x2F0E1EBA9EA36930, 0x6DFEFF5137495FA3, 0xAAEFDD6DCD770416, 0xE81F3C86649D3285, 0xF45BB4758C645C51, 0xB6AB559E258E6AC2, 0x71BA77A2DFB03177, 0x334A9649765A07E4, 0xBD68D2308226B08E, 0xFF9833DB2BCC861D, 0x388911E7D1F2DDA8, 0x7A79F00C7818EB3B, 0xCC7AF1FF21C30BDE, 0x8E8A101488293D4D, 0x499B3228721766F8, 0xB6BD3C3DBFD506B, 0x854997BA2F81E701, 0xC7B97651866BD192, 0xA8546D7C558A27, 0x4258B586D5BFBCB4, 0x5E1C3D753D46D260, 0x1CECDC9E94ACE4F3, 0xDBFDFEA26E92BF46, 0x990D1F49C77889D5, 0x172F5B3033043EBF, 0x55DFBADB9AEE082C, 0x92CE98E760D05399, 0xD03E790CC93A650A, 0xAA478900B1228E31, 0xE8B768EB18C8B8A2, 0x2FA64AD7E2F6E317, 0x6D56AB3C4B1CD584, 0xE374EF45BF6062EE, 0xA1840EAE168A547D, 0x66952C92ECB40FC8, 0x2465CD79455E395B, 0x3821458AADA7578F, 0x7AD1A461044D611C, 0xBDC0865DFE733AA9, 0xFF3067B657990C3A, 0x711223CFA3E5BB50, 0x33E2C2240A0F8DC3, 0xF4F3E018F031D676, 0xB60301F359DBE0E5, 0xDA050215EA6C212F, 0x98F5E3FE438617BC, 0x5FE4C1C2B9B84C09, 0x1D14202910527A9A, 0x93366450E42ECDF0, 0xD1C685BB4DC4FB63, 0x16D7A787B7FAA0D6, 0x5427466C1E109645, 0x4863CE9FF6E9F891, 0xA932F745F03CE02, 0xCD820D48A53D95B7, 0x8F72ECA30CD7A324, 0x150A8DAF8AB144E, 0x43A04931514122DD, 0x84B16B0DAB7F7968, 0xC6418AE602954FFB, 0xBC387AEA7A8DA4C0, 0xFEC89B01D3679253, 0x39D9B93D2959C9E6, 0x7B2958D680B3FF75, 0xF50B1CAF74CF481F, 0xB7FBFD44DD257E8C, 0x70EADF78271B2539, 0x321A3E938EF113AA, 0x2E5EB66066087D7E, 0x6CAE578BCFE24BED, 0xABBF75B735DC1058, 0xE94F945C9C3626CB, 0x676DD025684A91A1, 0x259D31CEC1A0A732, 0xE28C13F23B9EFC87, 0xA07CF2199274CA14, 0x167FF3EACBAF2AF1, 0x548F120162451C62, 0x939E303D987B47D7, 0xD16ED1D631917144, 0x5F4C95AFC5EDC62E, 0x1DBC74446C07F0BD, 0xDAAD56789639AB08, 0x985DB7933FD39D9B, 0x84193F60D72AF34F, 0xC6E9DE8B7EC0C5DC, 0x1F8FCB784FE9E69, 0x43081D5C2D14A8FA, 0xCD2A5925D9681F90, 0x8FDAB8CE70822903, 0x48CB9AF28ABC72B6, 0xA3B7B1923564425, 0x70428B155B4EAF1E, 0x32B26AFEF2A4998D, 0xF5A348C2089AC238, 0xB753A929A170F4AB, 0x3971ED50550C43C1, 0x7B810CBBFCE67552, 0xBC902E8706D82EE7, 0xFE60CF6CAF321874, 0xE224479F47CB76A0, 0xA0D4A674EE214033, 0x67C58448141F1B86, 0x253565A3BDF52D15, 0xAB1721DA49899A7F, 0xE9E7C031E063ACEC, 0x2EF6E20D1A5DF759, 0x6C0603E6B3B7C1CA, 0xF6FAE5C07D3274CD, 0xB40A042BD4D8425E, 0x731B26172EE619EB, 0x31EBC7FC870C2F78, 0xBFC9838573709812, 0xFD39626EDA9AAE81, 0x3A28405220A4F534, 0x78D8A1B9894EC3A7, 0x649C294A61B7AD73, 0x266CC8A1C85D9BE0, 0xE17DEA9D3263C055, 0xA38D0B769B89F6C6, 0x2DAF4F0F6FF541AC, 0x6F5FAEE4C61F773F, 0xA84E8CD83C212C8A, 0xEABE6D3395CB1A19, 0x90C79D3FEDD3F122, 0xD2377CD44439C7B1, 0x15265EE8BE079C04, 0x57D6BF0317EDAA97, 0xD9F4FB7AE3911DFD, 0x9B041A914A7B2B6E, 0x5C1538ADB04570DB, 0x1EE5D94619AF4648, 0x2A151B5F156289C, 0x4051B05E58BC1E0F, 0x87409262A28245BA, 0xC5B073890B687329, 0x4B9237F0FF14C443, 0x962D61B56FEF2D0, 0xCE73F427ACC0A965, 0x8C8315CC052A9FF6, 0x3A80143F5CF17F13, 0x7870F5D4F51B4980, 0xBF61D7E80F251235, 0xFD913603A6CF24A6, 0x73B3727A52B393CC, 0x31439391FB59A55F, 0xF652B1AD0167FEEA, 0xB4A25046A88DC879, 0xA8E6D8B54074A6AD, 0xEA16395EE99E903E, 0x2D071B6213A0CB8B, 0x6FF7FA89BA4AFD18, 0xE1D5BEF04E364A72, 0xA3255F1BE7DC7CE1, 0x64347D271DE22754, 0x26C49CCCB40811C7, 0x5CBD6CC0CC10FAFC, 0x1E4D8D2B65FACC6F, 0xD95CAF179FC497DA, 0x9BAC4EFC362EA149, 0x158E0A85C2521623, 0x577EEB6E6BB820B0, 0x906FC95291867B05, 0xD29F28B9386C4D96, 0xCEDBA04AD0952342, 0x8C2B41A1797F15D1, 0x4B3A639D83414E64, 0x9CA82762AAB78F7, 0x87E8C60FDED7CF9D, 0xC51827E4773DF90E, 0x20905D88D03A2BB, 0x40F9E43324E99428, 0x2CFFE7D5975E55E2, 0x6E0F063E3EB46371, 0xA91E2402C48A38C4, 0xEBEEC5E96D600E57, 0x65CC8190991CB93D, 0x273C607B30F68FAE, 0xE02D4247CAC8D41B, 0xA2DDA3AC6322E288, 0xBE992B5F8BDB8C5C, 0xFC69CAB42231BACF, 0x3B78E888D80FE17A, 0x7988096371E5D7E9, 0xF7AA4D1A85996083, 0xB55AACF12C735610, 0x724B8ECDD64D0DA5, 0x30BB6F267FA73B36, 0x4AC29F2A07BFD00D, 0x8327EC1AE55E69E, 0xCF235CFD546BBD2B, 0x8DD3BD16FD818BB8, 0x3F1F96F09FD3CD2, 0x41011884A0170A41, 0x86103AB85A2951F4, 0xC4E0DB53F3C36767, 0xD8A453A01B3A09B3, 0x9A54B24BB2D03F20, 0x5D45907748EE6495, 0x1FB5719CE1045206, 0x919735E51578E56C, 0xD367D40EBC92D3FF, 0x1476F63246AC884A, 0x568617D9EF46BED9, 0xE085162AB69D5E3C, 0xA275F7C11F7768AF, 0x6564D5FDE549331A, 0x279434164CA30589, 0xA9B6706FB8DFB2E3, 0xEB46918411358470, 0x2C57B3B8EB0BDFC5, 0x6EA7525342E1E956, 0x72E3DAA0AA188782, 0x30133B4B03F2B111, 0xF7021977F9CCEAA4, 0xB5F2F89C5026DC37, 0x3BD0BCE5A45A6B5D, 0x79205D0E0DB05DCE, 0xBE317F32F78E067B, 0xFCC19ED95E6430E8, 0x86B86ED5267CDBD3, 0xC4488F3E8F96ED40, 0x359AD0275A8B6F5, 0x41A94CE9DC428066, 0xCF8B0890283E370C, 0x8D7BE97B81D4019F, 0x4A6ACB477BEA5A2A, 0x89A2AACD2006CB9, 0x14DEA25F3AF9026D, 0x562E43B4931334FE, 0x913F6188692D6F4B, 0xD3CF8063C0C759D8, 0x5DEDC41A34BBEEB2, 0x1F1D25F19D51D821, 0xD80C07CD676F8394, 0x9AFCE626CE85B507 };

    private ulong CalculateChecksum(byte[] data, int size) {
    ulong checksum = 0xFFFFFFFFFFFFFFFF, x0, x1;

    byte current;
    for (int i = 0; i < size; ++i) {
    current = data;
    x0 = checksum >> 56;
    x1 = checksum << 8;
    checksum = table[current ^ x0] ^ x1;
    }

    return ~checksum;
    }


    Juiced 2

    Security:
    -> Custom Checksum
    . . . Offset: FileSize - 4
    . . . Calc. Start: 0
    . . . Calc. Length: 0x9A640 * 4

    Additional:
    -


    private int CalcJuiced(byte[] data) {
    using (var xIO = new MasterIO(data, Endian.Big)) {
    int sum = 0;
    for (int i = 0; i < 0x9A640; ++i)
    sum += xIO.Reader.ReadInt32();

    return sum;
    }
    }

    LEGO Games (Old)

    Security:
    -> Custom Checksum
    . . . Offset: FileSize - 4
    . . . Calc. Start: 0
    . . . Calc. Length: FileSize - 4

    Additional:
    Found it at Start Wars 2 and Indiania Jones.


    private int CalculateChecksum(byte[] data) {
    using (var xIO = new MasterIO(data, Endian.Big)) {
    int count = (data.Length / 4) - 1;

    int sum = 0x5C0999;
    for (int i = 0; i < count; ++i)
    sum += xIO.Reader.ReadInt32();

    return sum;
    }
    }

    LEGO Games (Newer)

    Security:
    -> Custom Checksum
    . . . Offset: 12
    . . . Calc. Start: 16
    . . . Calc. Length: Filesize - 16

    Additional:
    This checksum works for all newer LEGO games.
    Hobbit use the same one, but save it at 16 and the Calc. Start is 20.


    private int CalculateChecksum(byte[] data, int offset, int size) {
    int sum = -1;

    for (int i = 0; i < size; ++i) {
    sum *= 0x1000193;
    sum ^= data[offset++];
    }

    return ~sum;
    }

    Magic 2015

    Security:
    -> Custom Encryption

    Additional:
    Encryption is used for both save and profile data.


    private byte[] Decrypt(byte[] data) {
    for (int i = data.Length - 1; i > 0; --i)
    data ^= data[i - 1];

    data[0] ^= data[data.Length - 1];
    return data;
    }

    private byte[] Encrypt(byte[] data) {
    data[0] ^= data[data.Length - 1];

    for (int i = 1; i < data.Length; ++i)
    data ^= data[i - 1];

    return data;
    }


    Ninety Nine Nights 2

    Security:
    -> Custom XOR Encryption
    -> Custom Checksum (2x)

    Additional:
    -


    private void Encrypt(byte[] data, int offset, int size) {
    int next = 0;
    for (int i = offset; i < (offset + size); ++i) {
    next = ((data ^ next) + (i - offset)) ^ 0xBB;
    data = (byte) next;
    }
    }

    private void Decrypt(byte[] data, int offset, int size) {
    int last = 0, next;
    for (int i = offset; i < (offset + size); ++i) {
    next = ((data ^ 0xBB) - (i - offset)) ^ last;
    last = data;
    data = (byte) next;
    }
    }

    private int CalculateChecksum(byte[] data, int offset, int size) {
    int sum = 0;
    for (int i = offset; i < (offset + size); ++i)
    sum += data ^ (i - offset);

    return sum;
    }
    Read:

    byte[] data = File.ReadAllBytes(o.FileName);
    Decrypt(data, 0x34, 0x3560);
    Write:

    byte[] data = File.ReadAllBytes(o.FileName);
    using (var xIO = new MasterIO(data, Endian.Big)) {
    xIO.Position = 20;
    xIO.Writer.WriteInt32(CalculateChecksum(data, 0x34, 0x3560));
    xIO.Writer.WriteInt32(0);

    xIO.Position -= 4;
    xIO.Writer.WriteInt32(CalculateChecksum(data, 0, 0x34));
    Encrypt(data, 0x34, 0x3560);
    }


    Resident Evil HD Remaster

    Security:
    -> Blowfish Encryption
    -> SHA1
    . . . Offset: 12
    . . . Calc. Start: 64
    . . . Calc. Length: Int32 at 32

    Additional:
    The encryption key is "SBmdYgEamc=#sA0)Mhs9#>/4iiXbMPxW".
    Note that you can use the Blowfish class of Battleblock Theater above.
     
  2. AD

    ADDZ Guest

    Brilliant, great share, pinned :D
     
  3. Ph

    Philymaster X360 Dev XPG Developer
    35/47

    Joined:
    Feb 25, 2011
    Messages:
    105
    Likes Received:
    574
    Trophy Points:
    35
    Gender:
    Male
    Console:
    Xbox
    Haha pinned 10 seconds after creation :D Thank you
     
  4. AD

    ADDZ Guest

    Your work is always appreciated ;)
     
  5. gold972

    gold972 团队XPG影响 Effect XPG Developer TeamXPG
    205/282

    Joined:
    Dec 6, 2010
    Messages:
    6,833
    Likes Received:
    14,939
    Trophy Points:
    205
    Gender:
    Male
    Location:
    France Kernal XDK
    Console:
    Xbox
    excelent work phil i will look for make new editor now<;)
     
  6. Ph

    Philymaster X360 Dev XPG Developer
    35/47

    Joined:
    Feb 25, 2011
    Messages:
    105
    Likes Received:
    574
    Trophy Points:
    35
    Gender:
    Male
    Console:
    Xbox
    Thanks :)
    If you have any questions about the security of a game, just ask me.

    Also I've just reversed Alien: Isolation, will add it later today to the archive. ;)
     
  7. gold972

    gold972 团队XPG影响 Effect XPG Developer TeamXPG
    205/282

    Joined:
    Dec 6, 2010
    Messages:
    6,833
    Likes Received:
    14,939
    Trophy Points:
    205
    Gender:
    Male
    Location:
    France Kernal XDK
    Console:
    Xbox
    sure phil i will ask you ;) & awesome found for alien isolation ;)
     
  8. Ph

    Philymaster X360 Dev XPG Developer
    35/47

    Joined:
    Feb 25, 2011
    Messages:
    105
    Likes Received:
    574
    Trophy Points:
    35
    Gender:
    Male
    Console:
    Xbox
    Added Battlefield Bad Company 2.
    To test my functions I modded unlimited ammo, both checksums and ammo works great. :D
     
  9. losparo

    losparo Moderator Staff Member XPG Moderator TeamXPG
    380/564

    Joined:
    Dec 16, 2012
    Messages:
    2,060
    Likes Received:
    7,236
    Trophy Points:
    380
    Gender:
    Male
    Console:
    Playstation 4
    Nice job philymaster, I never spent time in this field but it really interests me. Will use these to test my knowledge ;)
     
  10. Ph

    Philymaster X360 Dev XPG Developer
    35/47

    Joined:
    Feb 25, 2011
    Messages:
    105
    Likes Received:
    574
    Trophy Points:
    35
    Gender:
    Male
    Console:
    Xbox
    So again a update. This time the victim is Duck Tales: Remastered :D
    The code is not optimized and very ugly, but it does its job.
     
  11. StarkillerAkatsuki

    StarkillerAkatsuki Official Self-Deprecating Noob
    0/47

    Joined:
    Aug 16, 2013
    Messages:
    181
    Likes Received:
    118
    Trophy Points:
    0
    Gender:
    Male
    Console:
    Xbox
    Holy ****, nice stuff man.

    This is way beyond my level.
     
  12. Ph

    Philymaster X360 Dev XPG Developer
    35/47

    Joined:
    Feb 25, 2011
    Messages:
    105
    Likes Received:
    574
    Trophy Points:
    35
    Gender:
    Male
    Console:
    Xbox
    Added the encryption for Magic 2015 to the archive :)
     
  13. Ph

    Philymaster X360 Dev XPG Developer
    35/47

    Joined:
    Feb 25, 2011
    Messages:
    105
    Likes Received:
    574
    Trophy Points:
    35
    Gender:
    Male
    Console:
    Xbox
    Just added Battlefield: Bad Company to the archive and improved, updated some other games.
     
  14. XPGPulse

    XPGPulse Newbie
    0/47

    Joined:
    Nov 23, 2014
    Messages:
    18
    Likes Received:
    4
    Trophy Points:
    0
    Gender:
    Male
    Console:
    Playstation 3
    Nice work
     
  15. Ph

    Philymaster X360 Dev XPG Developer
    35/47

    Joined:
    Feb 25, 2011
    Messages:
    105
    Likes Received:
    574
    Trophy Points:
    35
    Gender:
    Male
    Console:
    Xbox
    Added Digimon: ASR and Resident Evil HD Remaster to the archive
     
  16. Ph

    Philymaster X360 Dev XPG Developer
    35/47

    Joined:
    Feb 25, 2011
    Messages:
    105
    Likes Received:
    574
    Trophy Points:
    35
    Gender:
    Male
    Console:
    Xbox
    Just finished Gears of War: Judgment security for PlayerStorage and Profile, so we are able to make a free editor now ;)
     
  17. Ph

    Philymaster X360 Dev XPG Developer
    35/47

    Joined:
    Feb 25, 2011
    Messages:
    105
    Likes Received:
    574
    Trophy Points:
    35
    Gender:
    Male
    Console:
    Xbox
    Added the Bully: Scholarship Edition.
    Reversed that some time ago and I forgot to release it here. xD

    Since it's one of my favourite games, I would like to see someone make an editor for it.
    Otherwise I will make one if I have enough time to do so later. :)
     
  18. Ph

    Philymaster X360 Dev XPG Developer
    35/47

    Joined:
    Feb 25, 2011
    Messages:
    105
    Likes Received:
    574
    Trophy Points:
    35
    Gender:
    Male
    Console:
    Xbox
    Added security for (older) Lego games, Juiced 2 and Ninety Nine Nights 2 :)
     

Share This Page

Close