internal void LoadDump(string filename) { // Load the file into a memory block var bytes = ReadFileIntoByteArray(filename); // Set up an XMODEM object var xmodem = new XMODEM(_comport, XMODEM.Variants.XModemChecksum); // First send the upload command SendCommandWithoutResult($"UPLOAD{_cmdExtension}"); _comport.ReadLine(); // For the "110:WAITING FOR XMODEM" text int numBytesSuccessfullySent = xmodem.Send(bytes); if (numBytesSuccessfullySent == bytes.Length && xmodem.TerminationReason == XMODEM.TerminationReasonEnum.EndOfFile) { var msg = $"[+] File upload ok{Environment.NewLine}"; Console.WriteLine(msg); txt_output.Text += msg; } else { var msg = $"[!] Failed to upload file{Environment.NewLine}"; MessageBox.Show(msg); txt_output.Text += msg; } }
internal void SaveDump(string filename) { // Set up an XMODEM object var xmodem = new XMODEM(_comport, XMODEM.Variants.XModemChecksum); // First get the current memory size of the slot var memsizeStr = SendCommand($"MEMSIZE{_cmdExtension}?"); int memsize = 4096; // Default value if (!string.IsNullOrEmpty((string)memsizeStr)) { int.TryParse((string)memsizeStr, out memsize); } // Also check if the tag is UL to save the counters too var configStr = SendCommand($"CONFIG{_cmdExtension}?") as string; if ((configStr != null) && (configStr.Contains("ULTRALIGHT"))) { if (memsize < 4069) { memsize += 3 * 4; // 3 more pages } } // Then send the download command SendCommandWithoutResult($"DOWNLOAD{_cmdExtension}"); // For the "110:WAITING FOR XMODEM" text _comport.ReadLine(); var ms = new MemoryStream(); var reason = xmodem.Receive(ms); if (reason == XMODEM.TerminationReasonEnum.EndOfFile) { var msg = $"[+] File download from device ok{Environment.NewLine}"; Console.WriteLine(msg); txt_output.Text += msg; // Transfer successful, so convert MemoryStream to byte array var bytes = ms.ToArray(); // Strip away the SUB (byte value 26) padding bytes bytes = xmodem.TrimPaddingBytesFromEnd(bytes); byte[] neededBytes = bytes; if (bytes.Length > memsize) { // Create a new array same size as memsize neededBytes = new byte[memsize]; Array.Copy(bytes, neededBytes, neededBytes.Length); } // Write the actual file File.WriteAllBytes(filename, neededBytes); msg = $"[+] File saved to {filename}{Environment.NewLine}"; Console.WriteLine(msg); txt_output.Text += msg; } else { // Something went wrong during the transfer var msg = $"[!] Failed to save dump{Environment.NewLine}"; MessageBox.Show(msg); txt_output.Text += msg; } }