根据基站位置区识别码(LCA)和小区识别(CI)获取经纬度

news/2024/12/29 3:32:10/

需求

在网络攻击溯源时,需要对攻击者的位置进行定位。

已知参数

已知攻击者发送攻击报文的接入基站的位置区识别码(LCA)和小区识别(CI)码

目标

获取攻击者位置

技术路线

  • request 调用API查询经纬度位置
  • openpyxl 读取 excel 表格
  • sqlite3 读写数据库
  • json 数据解析

Python 代码

import requests
from openpyxl import load_workbook
import re
import os
import json
import sqlite3# 传入一个列表,里面包含字典数据。
def writeDB(conn, cursor, lac, ci, mnc, real_data):errcode  = real_data['errcode']lat = real_data['lat']lon = real_data['lon']radius = real_data['radius']address = real_data['address']cursor.execute("INSERT INTO lac_ci_cache(errcode, mnc, lac, ci, lat, lon, radius, address) VALUES (?,?,?,?,?,?,?,?)",(errcode, mnc, lac, ci, lat, lon, radius, address))conn.commit()def queryCache(cursor, lac, ci):cursor.execute("SELECT * FROM lac_ci_cache WHERE lac = ? AND ci = ?",(lac, ci))results = cursor.fetchall()# 获取查询结果的列名column_names = [desc[0] for desc in cursor.description]# 将查询结果转换为字典列表result_dict_list = []for row in results:row_dict = dict(zip(column_names, row))result_dict_list.append(row_dict)print(result_dict_list)return result_dict_listdef writeData(sheet, row, operator_code, content_str, status):print('content_str:' + str(content_str))print(type(content_str))dict_data = ["lat","lon","radius","address"]# 正常写入逻辑if(status == 0):real_data = json.loads(content_str)for number in range(4, 4 + len(dict_data)):sheet.cell(row = row, column = number, value = real_data[dict_data[number-4]])# 8 运营商operator_str = ""if(operator_code == 0):operator_str = "移动"elif(operator_code == 1):operator_str = "联通"else:operator_str = "未知"sheet.cell(row = row, column = 4 + len(dict_data), value = '移动')# 异常写入逻辑else:for number in range(4, 4 + len(dict_data) + 1):sheet.cell(row = row, column = number, value = 'N/A')def saveData(wb, file_name):wb.save(file_name)wb.close()# return sheet
def getSheet(file_name, sheet_name):# 获取当前目录current_directory = os.getcwd()# subdirectory = "xxx"# current_directory = os.path.join(current_directory, subdirectory)print(current_directory)# 读取Excel文件excel_file_path = file_name  # 替换为你的Excel文件路径wb = load_workbook(filename=excel_file_path)# 选择工作表sheet = wb[sheet_name]  # 替换为你的工作表名称return sheet,wb# return json text of lac ci
def getLocation(mnc, lac, ci, output):# 访问地址url = "http://api.cellocation.com:84/cell/?mcc=460&mnc={}&lac={}&ci={}&output={}".format(mnc, lac, ci, output) # 打印URLprint(url)# 定义要设置的Cookie# 发送HTTP GET请求获取页面内容response = requests.get(url)if response.status_code == 200:# 使用response.text获取页面的文本内容page_content = response.textreturn page_content;else:return 'none'if __name__ == "__main__":# 连接到 SQLite 数据库conn = sqlite3.connect('data.db')# 创建一个游标对象,用于执行 SQL 语句cursor = conn.cursor()# 创建表格cursor.execute('''CREATE TABLE IF NOT EXISTS lac_ci_cache (id INTEGER PRIMARY KEY AUTOINCREMENT,errcode INTEGER,mnc INTEGER,lac INTEGER,ci INTEGER,lat REAL,lon REAL,radius REAL,address TEXT)''')                   # 1 获取表单信息openpyxlsheet, wb= getSheet('lacci_test.xlsx','lacci_test')# 添加标题dict_data = ["纬度","精度","半径","地址","运营商"]for number in range(4, 4+len(dict_data)): sheet.cell(row = 1, column = number, value = dict_data[number-4])# 2 遍历查询row_index = 1;for row in sheet.iter_rows(min_row=2, max_row=201, min_col=1, max_col=2):row_index = row_index + 1;print('row_index' + str(row_index))# 获取单元格的值lac_value = row[0].valueci_value = row[1].value# 查询数据库是否已经存在cache_value = queryCache(cursor, lac_value, ci_value)# 数据库有直接填充if(len(cache_value)!=0):content_str = cache_value[0]operator_code = content_str['mnc']status = content_str['errcode']content_str = str(json.dumps(content_str))writeData(sheet, row_index, operator_code, content_str, status)continue;# 目前缓存的数据库不存在的情况 请求API 返回json字符串content_str = getLocation(0, lac_value, ci_value, 'json')real_data = json.loads(content_str)# 如果是移动的就写入if(real_data['errcode'] == 0):operator_code = 0;status = 0;writeData(sheet, row_index, operator_code, content_str, status)writeDB(conn, cursor, lac_value, ci_value, operator_code, real_data)continue;# 移动没有查到,换成联通的再调用API# 如果是联通的就写入content_str = getLocation(1, lac_value, ci_value, 'json')real_data = json.loads(content_str)if(real_data['errcode'] == 0):operator_code = 1;status = 0;writeData(sheet, row_index, operator_code, content_str, status)writeDB(conn, cursor, lac_value, ci_value, operator_code, real_data)continue;# 既不是移动也不是联通,触发异常逻辑operator_code = 0;status = 10001;writeData(sheet, row_index, operator_code, content_str, status)writeDB(conn, cursor, lac_value, ci_value, operator_code, real_data)saveData(wb,'lacci_test.xlsx')conn.close()

http://www.ppmy.cn/news/1101319.html

相关文章

Linux系统中驱动之设备树添加按键驱动方法

​大家好,每日一个简单的驱动,日久方长,对Linux驱动就越来越熟悉,也越来容易学会写驱动程序。今日进行简单的按键驱动。 一、Linux 下按键驱动原理 按键驱动和 LED 驱动原理上来讲基本都是一样的,都是操作 GPIO&…

机器学习——boosting之提升树

提升树和adaboost基本流程是相似的 我看到提升树的时候,懵了 这…跟adaboost有啥区别??? 直到看到有个up主说了,我才稍微懂 相当于,我在adaboost里的弱分类器,换成CART决策树就好了呗&#xff1…

如何查看服务器各项指标的配置-具体指令-服务器配置参数详解-大模型训练推荐配置单服务器和服务器之间显卡直通叠加扩容

查看服务器配置的指令 要查看服务器的各项组件配置,您可以执行以下步骤: 操作系统信息: 使用命令 uname -a(Linux/Unix)或 systeminfo(Windows)来查看操作系统的版本和内核信息。CPU 信息: 在Linux/Unix系统上,运行 lscpu 命令来查看CPU的详细信息。在Windows系统上,…

STL- 常用算法

概述: 算法主要是由头文件<algorithm> <functional> <numeric>组成。 <algorithm>是所有STL头文件中最大的一个&#xff0c;范围涉及到比较、 交换、查找、遍历操作、复制、修改等等 <numeric>体积很小&#xff0c;只包括几个在序列上面进行简…

数据可视化:四大发明的现代转化引擎

在科技和工业的蓬勃发展中&#xff0c;中国的四大发明——造纸术、印刷术、火药和指南针&#xff0c;早已不再是古代创新的象征&#xff0c;而是催生了众多衍生行业的崭新可能性。其中&#xff0c;数据可视化技术正成为这些行业的一颗璀璨明珠&#xff0c;开启了全新的时代。 1…

代码随想录第45天|70. 爬楼梯,322. 零钱兑换,279.完全平方数

70. 爬楼梯 开始按感觉做 class Solution {public int climbStairs(int n) {//第一版按感觉做//dp[i]爬到第i个台阶的方法数int[] dpnew int[n1];//初始化dp[0]1;dp[1]1;for(int i2;i<n;i){dp[i]dp[i-1]dp[i-2];}return dp[n];} } 改进-用完全背包做 这是背包里求排列问…

【数据分享】STRM 90米分辨率DEM地形数据(无需转发/全国/分省/分市)

地形数据是我们在各种设计、研究中都经常使用的基础数据&#xff01;之前我们分享过12.5米精度的DEM地形数据、30米精度的DEM地形数据(均可查看之前的文章获悉详情&#xff09;。 本次给大家带来的是90米分辨率的DEM地形数据——STRM 90m高程数据&#xff01;该数据是由美国太…

CHS零壹视频恢复程序OCR使用方法

目前CHS零壹视频恢复程序监控版、专业版、高级版已经支持了OCR&#xff0c;OCR是一种光学识别系统&#xff0c;通俗说就和扫描仪带的OCR软件一样的原理&#xff1a; 分析照片->OCR获取字符串->整理字符串->输出 使用方法如下&#xff08;以CHS零壹视频恢复程序监控版…