index.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #!/usr/bin/env node
  2. const program = require('commander')
  3. const path = require('path')
  4. const chalk = require('chalk')
  5. var base = path.join(process.env.HOME, '/Library/Application Support/MobileSync/Backup/')
  6. var reportTypes = {
  7. 'apps': require('./reports/apps'),
  8. 'calls': require('./reports/calls'),
  9. 'conversations': require('./reports/conversations'),
  10. 'list': require('./reports/list'),
  11. 'manifest': require('./reports/manifest'),
  12. 'messages': require('./reports/messages'),
  13. 'notes': require('./reports/notes'),
  14. 'oldnotes': require('./reports/oldnotes'),
  15. 'photolocations': require('./reports/photolocations'),
  16. 'voicemail-files': require('./reports/voicemail-files'),
  17. 'voicemail': require('./reports/voicemail'),
  18. 'webhistory': require('./reports/webhistory'),
  19. 'wifi': require('./reports/wifi')
  20. }
  21. program
  22. .version('2.0.6')
  23. .option('-l, --list', 'List Backups')
  24. .option(`-b, --backup <backup>`, 'Backup ID')
  25. .option('-r, --report <report_type>', 'Select a report type. see below for a full list.')
  26. .option('-c, --conversations', 'List Conversations')
  27. .option('-m, --messages <conversation_id>', 'List messages')
  28. .option(`-e, --extract <dir>`, 'Extract data for commands. supported by: voicemail-files')
  29. .option(`-f, --filter <filter>`, 'Filter output for individual reports. See the README for usage.')
  30. .option(`-d, --dir <directory>`, `Backup Directory (default: ${base})`)
  31. .option(`-v, --verbose`, 'Verbose debugging output')
  32. .option(`-x, --no-color`, 'Disable colorized output')
  33. .option('-z, --dump', 'Dump a ton of raw JSON formatted data instead of formatted output')
  34. program.on('--help', function () {
  35. console.log('')
  36. console.log('Supported Report Types:')
  37. for (var i in reportTypes) {
  38. if (program.isTTY) {
  39. console.log(' ', reportTypes[i].name, '-', reportTypes[i].description)
  40. } else {
  41. console.log(' ', chalk.green(reportTypes[i].name), '-', reportTypes[i].description)
  42. }
  43. }
  44. console.log('')
  45. console.log("If you're interested to know how this works, check out my post:")
  46. console.log('https://www.richinfante.com/2017/3/16/reverse-engineering-the-ios-backup')
  47. console.log('')
  48. })
  49. program.parse(process.argv)
  50. if (!process.stdout.isTTY) { program.color = false }
  51. base = program.dir || base
  52. if (program.verbose) console.log('Using source:', base)
  53. if (program.list) {
  54. // Shortcut for list report
  55. reportTypes.list.func(program, base)
  56. } else if (program.conversations) {
  57. // Legacy shortcut for conversations report
  58. reportTypes.conversations.func(program, base)
  59. } else if (program.messages) {
  60. // Legacy shortcut for messages report
  61. reportTypes.messages.func(program, base)
  62. } else if (program.report) {
  63. // If the report is valid
  64. if (reportTypes[program.report]) {
  65. var report = reportTypes[program.report]
  66. // Try to use it
  67. if (report.func) {
  68. try {
  69. report.func(program, base)
  70. } catch (e) {
  71. console.log('[!] Encountered an error', e)
  72. }
  73. }
  74. } else {
  75. console.log('')
  76. console.log(' [!] Unknown Option type:', program.report)
  77. console.log(' [!] It\'s possible this tool is out-of date.')
  78. console.log('')
  79. program.outputHelp()
  80. }
  81. } else {
  82. program.outputHelp()
  83. }