Advertisement
CWFVisions

xosc.cpp

Aug 13th, 2016
340
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.57 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include "Xosc.h"
  3. #include "Utilities.h"
  4. #include "ServComm.h"
  5. #include "RelegationLiveConfig.h"
  6. #include "KeyVault.h"
  7. #include "HvPeekPoke.h"
  8.  
  9. //For ID: 9, V: 2
  10.  
  11. extern DWORD dwHvKeysStatusFlags;
  12. extern WORD wBldrFlags;
  13. extern BYTE seshKey[];
  14.  
  15. extern BOOL crl;
  16. extern BOOL fcrt;
  17. extern BOOL type1KV;
  18.  
  19. extern BYTE kvDigest[];
  20. extern BYTE cpuKeyDigest[];
  21.  
  22. extern HANDLE hXam;
  23. extern BOOL RunningFromUSB;
  24. //extern BOOL isSending;
  25. //extern BOOL dontSend;
  26. //extern BOOL isAuthed;
  27. //extern BOOL fReboot;
  28.  
  29. typedef BOOL(*pfnXamLoaderIsTitleTerminatePending)();
  30.  
  31.  
  32. DWORD HexStringToByteArray(PBYTE Array, PCHAR hexstring, DWORD len)
  33. {
  34. PCHAR pos = hexstring;
  35. PCHAR endptr;
  36. size_t count = 0;
  37.  
  38. if ((hexstring[0] == '\0') || (strlen(hexstring) % 2))
  39. {
  40. return -1;
  41. }
  42.  
  43. PBYTE Data = (PBYTE)malloc(len + 1);
  44. ZeroMemory(Data, len + 1);
  45.  
  46. for (count = 0; count < len; count++)
  47. {
  48. CHAR buf[5] = { '0', 'x', pos[0], pos[1], 0 };
  49. Data[count] = strtol(buf, &endptr, 0);
  50. pos += 2;
  51.  
  52. if (endptr[0] != '\0')
  53. {
  54. free(Data); return -1;
  55. }
  56. }
  57. memcpy(Array, Data, len);
  58. free(Data);
  59.  
  60. return 0;
  61. }
  62.  
  63. BYTE * CreateXOSCBufferOffline(DWORD dwTaskParam1, BYTE* pbDaeTableName, DWORD cbDaeTableName, XOSC* pBuffer, DWORD cbBuffer) //no touch this(addr changes per dash)
  64. {
  65. BYTE* KeyVault = (BYTE*)malloc(0x4000);
  66. QWORD kvAddress = HvPeekQWORD(0x0000000200016240);
  67. HvPeekBytes(kvAddress, KeyVault, 0x4000);
  68.  
  69. unsigned int HV_KEYS_STATUS_FLAGS = 0x23289d3;
  70. unsigned short BLDR_FLAGS = 0xd83e, BLDR_FLAGS_KV1 = (~0x20);
  71. QWORD HvProtectedFlags = *(QWORD*)0x8E038678;
  72. HV_KEYS_STATUS_FLAGS = (crl == 1) ? (HV_KEYS_STATUS_FLAGS | 0x10000) : HV_KEYS_STATUS_FLAGS;
  73. HV_KEYS_STATUS_FLAGS = (fcrt == 1) ? (HV_KEYS_STATUS_FLAGS | 0x1000000) : HV_KEYS_STATUS_FLAGS;
  74. BLDR_FLAGS = (type1KV == 1) ? ((WORD)(BLDR_FLAGS & BLDR_FLAGS_KV1)) : BLDR_FLAGS;
  75.  
  76. int XOSC_FLAG_BASE = 0x2bf;
  77. int HV_PROTECTED_FLAGS_NONE = 0;
  78. int HV_PROTECTED_FLAGS_NO_EJECT_REBOOT = 1;
  79. int HV_PROTECTED_FLAGS_AUTH_EX_CAP = 4;
  80. QWORD HV_PROTECTED_FLAGS = HV_PROTECTED_FLAGS_AUTH_EX_CAP | (((HvProtectedFlags & HV_PROTECTED_FLAGS_NO_EJECT_REBOOT) == HV_PROTECTED_FLAGS_NO_EJECT_REBOOT) ? HV_PROTECTED_FLAGS_NO_EJECT_REBOOT : HV_PROTECTED_FLAGS_NONE);
  81.  
  82. BYTE drive_phase_level,
  83. drive_data[0x24],
  84. console_id[5],
  85. console_serial[12];
  86.  
  87. WORD xam_region, xam_odd;
  88.  
  89. drive_phase_level = *(BYTE*)(KeyVault + 0xc89);
  90.  
  91. memcpy(drive_data, KeyVault + 0xC8A, 0x24);
  92. xam_region = *(WORD*)(KeyVault + 0xC8);
  93. xam_odd = *(WORD*)(KeyVault + 0x1C);
  94. memcpy(drive_data, KeyVault + 0xc8a, 0x24);
  95. memcpy(console_id, KeyVault + 0x9CA, 5);
  96. memcpy(console_serial, KeyVault + 0xB0, 12);
  97.  
  98. BYTE * XoscBuff = (BYTE*)malloc(0x2E0);
  99. memset(XoscBuff, 0, 0x2e0);
  100. *(DWORD*)(XoscBuff + 0x04) = 0x90002;
  101. *(QWORD*)(XoscBuff + 0x08) = XOSC_FLAG_BASE;
  102. *(DWORD*)(XoscBuff + 0x20) = 0xC8003003;
  103. memset(XoscBuff + 0x24, 0xAA,0x10);
  104.  
  105. *(QWORD*)(XoscBuff + 0x70) = 0x527A5A4BD8F505BB;
  106. *(QWORD*)(XoscBuff + 0x78) = 0x94305A1779729F3B;
  107. *(BYTE*)(XoscBuff + 0x83) = drive_phase_level;
  108. memset(XoscBuff + 0x8C, 0xAA,0x64);
  109. memcpy(XoscBuff + 0xF0, drive_data, 36);
  110. memcpy(XoscBuff + 0x114, drive_data, 36);
  111. memcpy(XoscBuff + 0x138, console_serial, 12);
  112. *(WORD*)(XoscBuff + 0x144) = 0xAA;
  113. *(WORD*)(XoscBuff + 0x146) = BLDR_FLAGS;
  114. *(WORD*)(XoscBuff + 0x148) = xam_region;
  115. *(WORD*)(XoscBuff + 0x14A) = xam_odd;
  116. *(WORD*)(XoscBuff + 0x154) = 7;
  117. *(DWORD*)(XoscBuff + 0x158) = HV_KEYS_STATUS_FLAGS;
  118. memset(XoscBuff + 0x15C, 0xAA, 0x4);
  119. memset(XoscBuff + 0x16C, 0xAA, 0x4);
  120. *(DWORD*)(XoscBuff + 0x170) = 0xD0008;
  121. *(WORD*)(XoscBuff + 0x176) = 8;
  122. *(QWORD*)(XoscBuff + 0x198) = HV_PROTECTED_FLAGS;
  123. memcpy((XoscBuff + 0x1A0), console_id, 0x5);
  124. *(DWORD*)(XoscBuff + 0x1D0) = 0x40000207;
  125. memset(XoscBuff + 0x21C, 0xAA, 0xA4);
  126. *(WORD*)(XoscBuff + 0x2B8) = 0x20;
  127. *(WORD*)(XoscBuff + 0x2C6) = 0x6;
  128. memset(XoscBuff + 0x2C8, 0xAA, 0x10);
  129. *(DWORD*)(XoscBuff + 0x2D8) = 0x5F534750;
  130. memset(XoscBuff + 0x2DC, 0xAA, 4);
  131.  
  132. //add execution id
  133. XEX_EXECUTION_ID* exeId;
  134. DWORD ExeResult = XamGetExecutionId(&exeId);
  135. BYTE * exeID = (BYTE*)malloc(0x18);
  136. *(DWORD*)exeID = exeId->MediaID;//0-4
  137. *(DWORD*)(exeID + 4) = exeId->Version;
  138. *(DWORD*)(exeID + 8) = exeId->BaseVersion;
  139. *(DWORD*)(exeID + 12) = exeId->TitleID;
  140. *(BYTE*)(exeID + 16) = exeId->Platform;//12-13
  141. *(BYTE*)(exeID + 17) = exeId->ExecutableType;//13-14
  142. *(BYTE*)(exeID + 18) = exeId->Platform;//14-15
  143. *(BYTE*)(exeID + 19) = exeId->ExecutableType;//19-20
  144. *(DWORD*)(exeID + 20) = exeId->SaveGameID;
  145. //if your gonna spoof execution data do it here
  146. if (ExeResult == 0){//ExeResult
  147. memcpy(XoscBuff+0x38, exeID, 0x18);
  148. memset(XoscBuff+0x84, 0, 0x8);
  149. }
  150. else
  151. {
  152. memset(XoscBuff + 0x38, 0xAA, 0x18);//err this one
  153. memset(XoscBuff + 0x84, 0xAA, 8);//
  154. XOSC_FLAG_BASE &= -5;
  155. *(QWORD*)(XoscBuff + 8) = XOSC_FLAG_BASE;
  156. }
  157. *(DWORD*)(XoscBuff + 0x18) = ExeResult;//ExeResult;
  158.  
  159. //your 'kvHash' and 'cpukey' may be a different name
  160. memcpy(XoscBuff + 0x60, kvDigest, 0x10);
  161. XeCryptSha(cpuKeyDigest, 0x10, NULL, NULL, NULL, NULL, (XoscBuff + 0x50), 0x10);
  162. XNotifyUI(L"Ridicule Live - Success, Fully Stealthed + Online");
  163. return XoscBuff;
  164. }
  165.  
  166. DWORD CreateXOSCBuffer(DWORD dwTaskParam1, BYTE* pbDaeTableName, DWORD cbDaeTableName, XOSC* pBuffer, DWORD cbBuffer) {
  167. // Lets set our non-server sided XOSC Buffer
  168. CreateXOSCBufferOffline(dwTaskParam1, pbDaeTableName, cbDaeTableName, pBuffer, cbBuffer);
  169.  
  170. // Clear the buffer
  171. ZeroMemory(pBuffer, cbBuffer);
  172.  
  173. // Fill in request
  174. SERVER_XOSC_REQUEST request;
  175. memcpy(request.Session, seshKey, 16);
  176. request.Crl = crl;
  177. request.Fcrt = fcrt;
  178. request.Type1Kv = type1KV;
  179. XEX_EXECUTION_ID* pExecutionId;
  180. if ((request.ExecutionIdResult = XamGetExecutionId(&pExecutionId)) == S_OK) {
  181. memcpy(&request.ExecutionId, pExecutionId, sizeof(XEX_EXECUTION_ID));
  182. }
  183. request.HvProtectedFlags = *((QWORD*)0x8E038678);
  184.  
  185. for (int i = 0; i<10; i++){
  186. if (SendCommand(XSTL_SERVER_COMMAND_ID_GET_XOSC, (BYTE*)&request, sizeof(SERVER_XOSC_REQUEST), pBuffer, sizeof(XOSC)) == ERROR_SUCCESS)
  187. break;
  188. if (i == 2){
  189. XNotifyUI(L"XOSC Callback Error - Restarting console...");
  190. Sleep(3000);
  191. HalReturnToFirmware(HalFatalErrorRebootRoutine);
  192. return E_FAIL;
  193. }
  194. Sleep(300);
  195. }
  196.  
  197. if (pBuffer->dwFooterMagic != XOSC_FOOTER_MAGIC) {
  198. XNotifyUI(L"Unexpected XOSC Error - Restarting console...");
  199. Sleep(8000);
  200. HalReturnToFirmware(HalFatalErrorRebootRoutine);
  201. return E_FAIL;
  202. }
  203.  
  204. memcpy(pBuffer->bCpuKeyHash, cpuKeyDigest, 16);
  205. memcpy(pBuffer->bKvHash, kvDigest, 16);
  206. pfnXamLoaderIsTitleTerminatePending XamLoaderIsTitleTerminatePending = (pfnXamLoaderIsTitleTerminatePending)GetProcAddress((HMODULE)hXam, (LPCSTR)444);
  207. if (XamLoaderIsTitleTerminatePending()) {
  208. pBuffer->qwOperations |= XOSC_FLAGS_TITLE_TERMINATED;
  209. }
  210. if (XamTaskShouldExit()) {
  211. pBuffer->qwOperations |= XOSC_FLAGS_TASK_SHOULD_EXIT;
  212. }
  213.  
  214. return ERROR_SUCCESS;
  215. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement