index.js 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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.5')
  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(`-d, --dir <directory>`, `Backup Directory (default: ${base})`)
  30. .option(`-v, --verbose`, 'Verbose debugging output')
  31. .option(`-x, --no-color`, 'Disable colorized output')
  32. .option('-z, --dump', 'Dump a ton of raw JSON formatted data instead of formatted output')
  33. program.on('--help', function () {
  34. console.log('')
  35. console.log('Supported Report Types:')
  36. for (var i in reportTypes) {
  37. if (program.isTTY) {
  38. console.log(' ', reportTypes[i].name, '-', reportTypes[i].description)
  39. } else {
  40. console.log(' ', chalk.green(reportTypes[i].name), '-', reportTypes[i].description)
  41. }
  42. }
  43. console.log('')
  44. console.log("If you're interested to know how this works, check out my post:")
  45. console.log('https://www.richinfante.com/2017/3/16/reverse-engineering-the-ios-backup')
  46. console.log('')
  47. })
  48. program.parse(process.argv)
  49. if (!process.stdout.isTTY) { program.color = false }
  50. base = program.dir || base
  51. if (program.verbose) console.log('Using source:', base)
  52. if (program.list) {
  53. // Shortcut for list report
  54. reportTypes.list.func(program, base)
  55. } else if (program.conversations) {
  56. // Legacy shortcut for conversations report
  57. reportTypes.conversations.func(program, base)
  58. } else if (program.messages) {
  59. // Legacy shortcut for messages report
  60. reportTypes.messages.func(program, base)
  61. } else if (program.report) {
  62. // If the report is valid
  63. if (reportTypes[program.report]) {
  64. var report = reportTypes[program.report]
  65. // Try to use it
  66. if (report.func) {
  67. try {
  68. report.func(program, base)
  69. } catch (e) {
  70. console.log('[!] Encountered an error', e)
  71. }
  72. }
  73. } else {
  74. console.log('')
  75. console.log(' [!] Unknown Option type:', program.report)
  76. console.log(' [!] It\'s possible this tool is out-of date.')
  77. console.log('')
  78. program.outputHelp()
  79. }
  80. } else {
  81. program.outputHelp()
  82. }