0x0, "01" => 0x77073096, "02" => 0xEE0E612C, "03" => 0x990951BA, "04" => 0x076DC419, "05" => 0x706AF48F, "06" => 0xE963A535, "07" => 0x9E6495A3, "08" => 0x0EDB8832, "09" => 0x79DCB8A4, "0A" => 0xE0D5E91E, "0B" => 0x97D2D988, "0C" => 0x09B64C2B, "0D" => 0x7EB17CBD, "0E" => 0xE7B82D07, "0F" => 0x90BF1D91, "10" => 0x1DB71064, "11" => 0x6AB020F2, "12" => 0xF3B97148, "13" => 0x84BE41DE, "14" => 0x1ADAD47D, "15" => 0x6DDDE4EB, "16" => 0xF4D4B551, "17" => 0x83D385C7, "18" => 0x136C9856, "19" => 0x646BA8C0, "1A" => 0xFD62F97A, "1B" => 0x8A65C9EC, "1C" => 0x14015C4F, "1D" => 0x63066CD9, "1E" => 0xFA0F3D63, "1F" => 0x8D080DF5, "20" => 0x3B6E20C8, "21" => 0x4C69105E, "22" => 0xD56041E4, "23" => 0xA2677172, "24" => 0x3C03E4D1, "25" => 0x4B04D447, "26" => 0xD20D85FD, "27" => 0xA50AB56B, "28" => 0x35B5A8FA, "29" => 0x42B2986C, "2A" => 0xDBBBC9D6, "2B" => 0xACBCF940, "2C" => 0x32D86CE3, "2D" => 0x45DF5C75, "2E" => 0xDCD60DCF, "2F" => 0xABD13D59, "30" => 0x26D930AC, "31" => 0x51DE003A, "32" => 0xC8D75180, "33" => 0xBFD06116, "34" => 0x21B4F4B5, "35" => 0x56B3C423, "36" => 0xCFBA9599, "37" => 0xB8BDA50F, "38" => 0x2802B89E, "39" => 0x5F058808, "3A" => 0xC60CD9B2, "3B" => 0xB10BE924, "3C" => 0x2F6F7C87, "3D" => 0x58684C11, "3E" => 0xC1611DAB, "3F" => 0xB6662D3D, "40" => 0x76DC4190, "41" => 0x01DB7106, "42" => 0x98D220BC, "43" => 0xEFD5102A, "44" => 0x71B18589, "45" => 0x06B6B51F, "46" => 0x9FBFE4A5, "47" => 0xE8B8D433, "48" => 0x7807C9A2, "49" => 0x0F00F934, "4A" => 0x9609A88E, "4B" => 0xE10E9818, "4C" => 0x7F6A0DBB, "4D" => 0x086D3D2D, "4E" => 0x91646C97, "4F" => 0xE6635C01, "50" => 0x6B6B51F4, "51" => 0x1C6C6162, "52" => 0x856530D8, "53" => 0xF262004E, "54" => 0x6C0695ED, "55" => 0x1B01A57B, "56" => 0x8208F4C1, "57" => 0xF50FC457, "58" => 0x65B0D9C6, "59" => 0x12B7E950, "5A" => 0x8BBEB8EA, "5B" => 0xFCB9887C, "5C" => 0x62DD1DDF, "5D" => 0x15DA2D49, "5E" => 0x8CD37CF3, "5F" => 0xFBD44C65, "60" => 0x4DB26158, "61" => 0x3AB551CE, "62" => 0xA3BC0074, "63" => 0xD4BB30E2, "64" => 0x4ADFA541, "65" => 0x3DD895D7, "66" => 0xA4D1C46D, "67" => 0xD3D6F4FB, "68" => 0x4369E96A, "69" => 0x346ED9FC, "6A" => 0xAD678846, "6B" => 0xDA60B8D0, "6C" => 0x44042D73, "6D" => 0x33031DE5, "6E" => 0xAA0A4C5F, "6F" => 0xDD0D7CC9, "70" => 0x5005713C, "71" => 0x270241AA, "72" => 0xBE0B1010, "73" => 0xC90C2086, "74" => 0x5768B525, "75" => 0x206F85B3, "76" => 0xB966D409, "77" => 0xCE61E49F, "78" => 0x5EDEF90E, "79" => 0x29D9C998, "7A" => 0xB0D09822, "7B" => 0xC7D7A8B4, "7C" => 0x59B33D17, "7D" => 0x2EB40D81, "7E" => 0xB7BD5C3B, "7F" => 0xC0BA6CAD, "80" => 0xEDB88320, "81" => 0x9ABFB3B6, "82" => 0x03B6E20C, "83" => 0x74B1D29A, "84" => 0xEAD54739, "85" => 0x9DD277AF, "86" => 0x04DB2615, "87" => 0x73DC1683, "88" => 0xE3630B12, "89" => 0x94643B84, "8A" => 0x0D6D6A3E, "8B" => 0x7A6A5AA8, "8C" => 0xE40ECF0B, "8D" => 0x9309FF9D, "8E" => 0x0A00AE27, "8F" => 0x7D079EB1, "90" => 0xF00F9344, "91" => 0x8708A3D2, "92" => 0x1E01F268, "93" => 0x6906C2FE, "94" => 0xF762575D, "95" => 0x806567CB, "96" => 0x196C3671, "97" => 0x6E6B06E7, "98" => 0xFED41B76, "99" => 0x89D32BE0, "9A" => 0x10DA7A5A, "9B" => 0x67DD4ACC, "9C" => 0xF9B9DF6F, "9D" => 0x8EBEEFF9, "9E" => 0x17B7BE43, "9F" => 0x60B08ED5, "A0" => 0xD6D6A3E8, "A1" => 0xA1D1937E, "A2" => 0x38D8C2C4, "A3" => 0x4FDFF252, "A4" => 0xD1BB67F1, "A5" => 0xA6BC5767, "A6" => 0x3FB506DD, "A7" => 0x48B2364B, "A8" => 0xD80D2BDA, "A9" => 0xAF0A1B4C, "AA" => 0x36034AF6, "AB" => 0x41047A60, "AC" => 0xDF60EFC3, "AD" => 0xA867DF55, "AE" => 0x316E8EEF, "AF" => 0x4669BE79, "B0" => 0xCB61B38C, "B1" => 0xBC66831A, "B2" => 0x256FD2A0, "B3" => 0x5268E236, "B4" => 0xCC0C7795, "B5" => 0xBB0B4703, "B6" => 0x220216B9, "B7" => 0x5505262F, "B8" => 0xC5BA3BBE, "B9" => 0xB2BD0B28, "BA" => 0x2BB45A92, "BB" => 0x5CB36A04, "BC" => 0xC2D7FFA7, "BD" => 0xB5D0CF31, "BE" => 0x2CD99E8B, "BF" => 0x5BDEAE1D, "C0" => 0x9B64C2B0, "C1" => 0xEC63F226, "C2" => 0x756AA39C, "C3" => 0x026D930A, "C4" => 0x9C0906A9, "C5" => 0xEB0E363F, "C6" => 0x72076785, "C7" => 0x05005713, "C8" => 0x95BF4A82, "C9" => 0xE2B87A14, "CA" => 0x7BB12BAE, "CB" => 0x0CB61B38, "CC" => 0x92D28E9B, "CD" => 0xE5D5BE0D, "CE" => 0x7CDCEFB7, "CF" => 0x0BDBDF21, "D0" => 0x86D3D2D4, "D1" => 0xF1D4E242, "D2" => 0x68DDB3F8, "D3" => 0x1FDA836E, "D4" => 0x81BE16CD, "D5" => 0xF6B9265B, "D6" => 0x6FB077E1, "D7" => 0x18B74777, "D8" => 0x88085AE6, "D9" => 0xFF0F6A70, "DA" => 0x66063BCA, "DB" => 0x11010B5C, "DC" => 0x8F659EFF, "DD" => 0xF862AE69, "DE" => 0x616BFFD3, "DF" => 0x166CCF45, "E0" => 0xA00AE278, "E1" => 0xD70DD2EE, "E2" => 0x4E048354, "E3" => 0x3903B3C2, "E4" => 0xA7672661, "E5" => 0xD06016F7, "E6" => 0x4969474D, "E7" => 0x3E6E77DB, "E8" => 0xAED16A4A, "E9" => 0xD9D65ADC, "EA" => 0x40DF0B66, "EB" => 0x37D83BF0, "EC" => 0xA9BCAE53, "ED" => 0xDEBB9EC5, "EE" => 0x47B2CF7F, "EF" => 0x30B5FFE9, "F0" => 0xBDBDF21C, "F1" => 0xCABAC28A, "F2" => 0x53B39330, "F3" => 0x24B4A3A6, "F4" => 0xBAD03605, "F5" => 0xCDD70693, "F6" => 0x54DE5729, "F7" => 0x23D967BF, "F8" => 0xB3667A2E, "F9" => 0xC4614AB8, "FA" => 0x5D681B02, "FB" => 0x2A6F2B94, "FC" => 0xB40BBE37, "FD" => 0xC30C8EA1, "FE" => 0x5A05DF1B, "FF" => 0x2D02EF8D ]; require_once './src/D2Functions.php'; $filename = "D:\Diablo II\MODS\ironman-dev\save\Sorc.d2s"; $fp = fopen($filename, "rb+"); $filesize = filesize($filename); $pucData = file_get_contents($filename); ddump(unpack('C*', $pucData)); // pucData - pointer to the byte stream of the .d2s file // iSize - number of bytes in the stream ( filesize ) function checksum($fp, $pucData, $iSize, $xorTableHex) { // delete old checksum at offset 0x0C - byte 12 fseek($fp, 12); // (I) unsigned integer (machine dependent size and byte order) fwrite($fp, pack('I', 0)); // produces 4 bytes $uVar = 0xFFFFFFFF; for($i=0;$i<$iSize;$i++) { // $hex = strtoupper(bin2hex($pucData[$i])); // getting correct bytes here, matches file in hex editor // dump((strtoupper(dechex($xorTableHex[$hex])))); // uVar1 = uVar1 >> 8 ^ DWORD_ARRAY_6fd2a248[(uint)*param_1 ^ uVar1 & 0xff]; // $xorTableHex = $xorTableHex = [ // "00" => 0x0, // "01" => 0x77073096, // "02" => 0xEE0E612C] etc. // uVar1 >> 8 ^ *(uint *)(&DAT_6fd2a248 + ((uint)*param_1 ^ uVar1 & 0xff) * 4); $dec = hexdec(dechex(unpack('C', $pucData[$i])[1])); $uVar = (($uVar << 1)|( $uVar >> 31)) + $dec; // $uVar = $uVar >> 8 ^ ($xorTableHex[$hex] ^ ($uVar & 0xFF) * 4); // yeah, it was producing wrong val cuz I there is no * 4 } dump(swapEndianness(dechex($uVar))); //fseek($fp, 12); //fwrite($fp, pack('I', $uiCS)); } //fseek($fp, 347); //fwrite($fp, pack('C', 0xFD)); //fseek($fp, 348); //fwrite($fp, pack('C', 0x9F)); checksum($fp, $pucData, $filesize, $xorTableHex); fclose($fp);