网页抓取解密

网页抓取解密

网页抓取解密(Androidkillerdata,参数怎么产生的?(图))

网站优化优采云 发表了文章 • 0 个评论 • 182 次浏览 • 2021-09-16 08:02 • 来自相关话题

  网页抓取解密(Androidkillerdata,参数怎么产生的?(图))
  本文以小提琴手为例。配置完成后,可以在fiddler界面中看到页面请求的HTTPS连接。以cos每周清单为例:
  
  如图所示,我们可以看到这个post请求的URL、查询参数、请求体和返回的JSON数据。完整的URL如下所示:
  *2160及;dpi=480&更新版本代码=412&\rticket=94
  这里,请求主体的密钥为数据,加密内容为:
  Lc59D72k2R4YFB0XMOPQRgpNKWGco6f1e86WkOur0ZArCiT+R6VLSVHQYEUTFTVXRYPX4TE3WZV5VF043AL8XSKW592ULRAZRH6OECMW9FBDZBRB+l9QIGFengtJ
  由于这是一个post请求,如果直接单击此处打开,将出现默认提示,并且不会返回任何数据。因此,我们可以通过postman等工具测试请求,如下所示:
  
  所以问题来了。数据是加密的。我们需要的是动态生成数据,根据参数自由获取数据。我们该怎么办
  长征的第二步:反编译
  为了查看请求主体中的数据参数是如何生成的,我们需要反编译以分析源代码
  首先,从官方网站下载半维APK的安装包。这里的地址是。在这里,您可以直接使用快速方便的Android killer来完成反编译逻辑。反编译成功后,如下所示:
  
  很容易找到类维度的源代码路径。完整的内容是com.banciyuan.bcywebview。因为我们可以直接看到SmalI汇编源代码,所以这里没有太多意义。这里我们通过Java查看器查看Java源代码。考虑到这是一个网络请求,我们重点查找与http相关的内容并进行搜索,我注意到其中一个httputils文件,如下所示:
  
  如图中的红色框所示,可以看到数据在这里被加密并传输到服务器,因此我们调用encrypt来查看
   public static String a(String paramString)
{
return a(paramString, 0);
}
  在encrypt中有这样一种方法。让我们继续看电话
   public static String a(String paramString, int paramInt)
{
return a(b(paramString, paramInt));
}
  好吧,继续看方法B
   private static byte[] b(String paramString, int paramInt)
{
Object localObject = getRandomString(paramInt);
if (localObject != null)
{
if (paramInt == 0) {}
try
{
if (((String)localObject).length() != 16) {
return null;
}
localObject = new SecretKeySpec(((String)localObject).getBytes(Charset.defaultCharset()), "AES");
Cipher localCipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
localCipher.init(1, (Key)localObject);
paramString = localCipher.doFinal(paramString.getBytes("utf-8"));
return paramString;
}
catch (Exception paramString) {}
}
return null;
}
  哦,是的,这里应该很清楚,数据是由AES通过密码加密的。关键是什么
  长征的第三步:模拟本地呼叫
  虽然我们看到了加密逻辑,但我们可以从代码中看到密钥是通过getrandomstring(paramint)方法获得的,这是一种本机方法,在代码中定义
  private static native String getRandomString(int paramInt);
  好的,因为它是本机方法,所以我们可以在项目中调用并打印键的实际值。因此,我发现本机方法来自library.so
   static
{
System.loadLibrary("random");
}
  将so文件引入到我自己的项目中,并编写类似的调用代码,如下所示:
  public class Encrypt {
static
{
System.loadLibrary("random");
}
public void Test(){
Log.e("Encrypt",getRandomString(0));
}
private static native String getRandomString(int paramInt);
}
  外呼:
   new Encrypt().Test();
  嗯,执行代码的结果没有按预期打印出来。相反,它会提示找不到本机方法getrandomstring。我很困惑。经过研究,发现本机方法的命名格式如下:
  Java_uuCOM_uuuCiyuan_uuBcyWebView_Uils_UEncrypt_UEncrypt_U1;getRandomString
  如果在任何项目中使用getrandomstring,将找不到它
  好的,解决方案是用相同的包名和半维重新创建一个项目。完整的包名是com.banciyuan.bcywebview。您可以通过再次调用它来成功打印它。结果如下:
  
  注:为了防止商业使用,决定隐藏一些关键内容
  哈哈,我这里有半维的加密密钥。大多数情况下,我们将键放在常量中,并将其直接写入代码中。对于这一点,半维也是善意的
  长征的第四步:数据解密
  同样清楚的是,这里写的是半维元素的加密过程和密钥结果。理论上,通过这一关键结果,我们可以伪造任意post请求的数据。真的可以吗
  如下所示,我在Android下编写了一段解密逻辑:
   private void decryptData() {
Object localObject = "com_banciyuan_AI";
String paramString = "Lc59D72k2R4YFB0XMOPQRgpNKWGco6f1e86WkOur0ZArCiT+R6VlSvHQYEUtFtTVXrYpx4tE3WZV5vf043AL8XwSxskW592ULRAzrh6oEcMW9FBDzBrB+l9QIGFengtJ";
if (((String) localObject).length() != 16) {
return;
}
localObject = new SecretKeySpec(((String) localObject).getBytes(Charset.defaultCharset()), "AES");
Cipher localCipher = null;
try {
localCipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
localCipher.init(DECRYPT_MODE, (Key) localObject);
paramString = new String(localCipher.doFinal(Base64.decode(paramString.getBytes("utf-8"), Base64.DEFAULT)), "UTF-8");
Log.e("Main", paramString);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchProviderException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
  那么字符串打印出来的究竟是什么呢
  {“日期”:“20180719”,“网格类型”:“时间线”,“标记”:“4b98b48cb5b20e72”,“p”:“1”,“类型”:“周”}
  呵呵,这些是post的核心数据。同样,您可以通过在线加密和解密网站查看,解密后如下所示:
  
  结果是一样的。最后,我们可能需要伪造数据来请求API实现一些隐藏的秘密==
  长征的第五步:尝试在体内伪造数据
  如果您在这里使用Java,它应该相对简单。只需反向解密。具体的方法是将uChange mode解密为encrypt uMode,然后在外层使用Base64,内层仍然使用AES进行加密。具体来说,它可以由您自己进行测试。在这里,我将重点介绍通过python的实现
  我们使用crytodome实现AES加密和解密。首先,我们导入以下模块:
  import base64
from Cryptodome.Cipher import AES
# str不是16的倍数那就补足为16的倍数
def add_to_16(text):
while len(text) % 16 != 0:
text += '5'
return str.encode(text) # 返回bytes
def generate_encrypt_data():
key = 'com_banxxxx' #隐藏部分密钥内容
dict_data = {"date": "20180719", "grid_type": "timeline", "token": "4b98b48cb5b20e72", "p": "1", "type": "week"}
data_json = json.dumps(dict_data).replace(' ', '') # 移除多余的空格
print(data_json)
cipher = AES.new(add_to_16(key), AES.MODE_ECB)
encrypted_text = str(base64.encodebytes(cipher.encrypt(add_to_16(data_json))), encoding='utf8') # 加密
print(encrypted_text)
generate_encrypt_data()
  
  比较Fiddler捕获的数据,如下所示:
  Lc59D72k2R4YFB0XMOPQRgpNKWGco6f1e86WkOur0ZArCiT+R6VLSVHQYEUTFTVXRYPX4TE3WZV5VF043AL8XSKW592ULRAZRH6OECMW9FBDZBRB+l9QIGFengtJ
  啊,什么鬼?最后几个不同的鬼魂是什么?你不应该去网页解密生成的文件
  
  很好,没问题。编码后会有什么不同
  可能的远程原因:
  dict生成的原创数据与实际原创数据不同。为了确保它是16位的倍数,使用***'\0'**作为填充
  首先,让我们看看DICT转换的数据和Android汇编所生成的数据两次:
  {“日期”:“20180719”,“网格类型”:“时间线”,“标记”:“4b98b48cb5b20e72”,“p”:“1”,“类型”:“周”}
  {“日期”:“20180719”,“网格类型”:“时间线”,“标记”:“4b98b48cb5b20e72”,“p”:“1”,“类型”:“周”}
  这让我说不出话来。绝对正确。让我们看看填充问题。首先,我检查了反编译的源代码,没有找到明确的填充逻辑,因此我考虑通过所有ASIL代码生成相应的加密数据,并将其与正确的数据进行比较
  测试后,所有ASCII码都不会生成一致的加密数据(放弃)
  查看代码后,发现生成cilper的逻辑如下
  Cipher.getInstance("AES/ECB/PKCS7Padding", "BC")
  此处使用Pkcs7padding,但在py中没有指定此设置的位置。如何保持一致性?关于PKCS7填充,请参阅PKCS5填充和PKCS7填充之间的区别
  在这里我突然有了新的灵感。如果填充不一致,两个原创数据也应不一致,但肉眼看起来完全相同。即使通过文本比较,也是一样的。那么如何检查呢
  将在两个位置生成的原创数据转换为列表,然后打印以进行字符级比较。新的代码如下
  def generate_encrypt_data():
key = 'com_banciyuan_AI'
dict_data = {"date": "20180719", "grid_type": "timeline", "token": "4b98b48cb5b20e72", "p": "1", "type": "week"}
data_json = json.dumps(dict_data).replace(' ', '') # 移除多余的空格
print(len(data_json))
print(list(data_json))
cipher = AES.new(add_to_16(key), AES.MODE_ECB)
encrypted_text = str(base64.encodebytes(cipher.encrypt(add_to_16(data_json))), encoding='utf8') # 加密
# print(encrypted_text)
encrypted_text = "Lc59D72k2R4YFB0XMOPQRgpNKWGco6f1e86WkOur0ZArCiT+R6VlSvHQYEUtFtTVXrYpx4tE3WZV5vf043AL8XwSxskW592ULRAzrh6oEcMW9FBDzBrB+l9QIGFengtJ" #正确的加密数据
text_decrypted = str(cipher.decrypt(base64.decodebytes(bytes(encrypted_text, encoding='utf8'))).rstrip(b'\0').decode("utf8")) # 解密
print(len(text_decrypted))
print(list(text_decrypted))
  结果:
  91(dict生成)
  “","t,","i","m","e","e","e","e","e","t"o","k"e","n",","p","p","p","p","p","e","t","y","p"","e 34
  96(由Java解密)
  “,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,”","t","i","m","e","l","i","m","e","e","e","t"o,"k",","p",","p","p","p","e","k","1","","t"y","p","e",""
  通过比较,发现第一个长度不一致,还有五个**'\X05',吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼
  def generate_encrypt_data():
key = 'com_banciyuan_AI'
dict_data = {"date": "20180719", "grid_type": "timeline", "token": "4b98b48cb5b20e72", "p": "1", "type": "week"}
data_json = json.dumps(dict_data).replace(' ', '') # 移除多余的空格
print(data_json+"\n")
cipher = AES.new(add_to_16(key), AES.MODE_ECB)
encrypted_text = str(base64.encodebytes(cipher.encrypt(add_to_16(data_json))), encoding='utf8') # 加密
print(encrypted_text)
text_decrypted = str(cipher.decrypt(base64.decodebytes(bytes(encrypted_text, encoding='utf8'))).rstrip(b'\x05').decode("utf8")) # 解密
print(text_decrypted)
  执行代码:
  
  那么,这篇文章就到此结束了。其实这是一种非常主流的移动加密传输方式。对于HTTPS+AES+本机密钥存储,您可以看到在这方面,半维元素仍然非常充足。如果您有任何疑问,请在评论中指出
  参考博客链接:
  Android本机方法无法找到问题
  在线加密和解密
  python3.6执行AES加密和解密方法
  郑重声明:本文章仅供学习和交流之用,禁止用于任何商业目的 查看全部

  网页抓取解密(Androidkillerdata,参数怎么产生的?(图))
  本文以小提琴手为例。配置完成后,可以在fiddler界面中看到页面请求的HTTPS连接。以cos每周清单为例:
  
  如图所示,我们可以看到这个post请求的URL、查询参数、请求体和返回的JSON数据。完整的URL如下所示:
  *2160及;dpi=480&更新版本代码=412&\rticket=94
  这里,请求主体的密钥为数据,加密内容为:
  Lc59D72k2R4YFB0XMOPQRgpNKWGco6f1e86WkOur0ZArCiT+R6VLSVHQYEUTFTVXRYPX4TE3WZV5VF043AL8XSKW592ULRAZRH6OECMW9FBDZBRB+l9QIGFengtJ
  由于这是一个post请求,如果直接单击此处打开,将出现默认提示,并且不会返回任何数据。因此,我们可以通过postman等工具测试请求,如下所示:
  
  所以问题来了。数据是加密的。我们需要的是动态生成数据,根据参数自由获取数据。我们该怎么办
  长征的第二步:反编译
  为了查看请求主体中的数据参数是如何生成的,我们需要反编译以分析源代码
  首先,从官方网站下载半维APK的安装包。这里的地址是。在这里,您可以直接使用快速方便的Android killer来完成反编译逻辑。反编译成功后,如下所示:
  
  很容易找到类维度的源代码路径。完整的内容是com.banciyuan.bcywebview。因为我们可以直接看到SmalI汇编源代码,所以这里没有太多意义。这里我们通过Java查看器查看Java源代码。考虑到这是一个网络请求,我们重点查找与http相关的内容并进行搜索,我注意到其中一个httputils文件,如下所示:
  
  如图中的红色框所示,可以看到数据在这里被加密并传输到服务器,因此我们调用encrypt来查看
   public static String a(String paramString)
{
return a(paramString, 0);
}
  在encrypt中有这样一种方法。让我们继续看电话
   public static String a(String paramString, int paramInt)
{
return a(b(paramString, paramInt));
}
  好吧,继续看方法B
   private static byte[] b(String paramString, int paramInt)
{
Object localObject = getRandomString(paramInt);
if (localObject != null)
{
if (paramInt == 0) {}
try
{
if (((String)localObject).length() != 16) {
return null;
}
localObject = new SecretKeySpec(((String)localObject).getBytes(Charset.defaultCharset()), "AES");
Cipher localCipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
localCipher.init(1, (Key)localObject);
paramString = localCipher.doFinal(paramString.getBytes("utf-8"));
return paramString;
}
catch (Exception paramString) {}
}
return null;
}
  哦,是的,这里应该很清楚,数据是由AES通过密码加密的。关键是什么
  长征的第三步:模拟本地呼叫
  虽然我们看到了加密逻辑,但我们可以从代码中看到密钥是通过getrandomstring(paramint)方法获得的,这是一种本机方法,在代码中定义
  private static native String getRandomString(int paramInt);
  好的,因为它是本机方法,所以我们可以在项目中调用并打印键的实际值。因此,我发现本机方法来自library.so
   static
{
System.loadLibrary("random");
}
  将so文件引入到我自己的项目中,并编写类似的调用代码,如下所示:
  public class Encrypt {
static
{
System.loadLibrary("random");
}
public void Test(){
Log.e("Encrypt",getRandomString(0));
}
private static native String getRandomString(int paramInt);
}
  外呼:
   new Encrypt().Test();
  嗯,执行代码的结果没有按预期打印出来。相反,它会提示找不到本机方法getrandomstring。我很困惑。经过研究,发现本机方法的命名格式如下:
  Java_uuCOM_uuuCiyuan_uuBcyWebView_Uils_UEncrypt_UEncrypt_U1;getRandomString
  如果在任何项目中使用getrandomstring,将找不到它
  好的,解决方案是用相同的包名和半维重新创建一个项目。完整的包名是com.banciyuan.bcywebview。您可以通过再次调用它来成功打印它。结果如下:
  
  注:为了防止商业使用,决定隐藏一些关键内容
  哈哈,我这里有半维的加密密钥。大多数情况下,我们将键放在常量中,并将其直接写入代码中。对于这一点,半维也是善意的
  长征的第四步:数据解密
  同样清楚的是,这里写的是半维元素的加密过程和密钥结果。理论上,通过这一关键结果,我们可以伪造任意post请求的数据。真的可以吗
  如下所示,我在Android下编写了一段解密逻辑:
   private void decryptData() {
Object localObject = "com_banciyuan_AI";
String paramString = "Lc59D72k2R4YFB0XMOPQRgpNKWGco6f1e86WkOur0ZArCiT+R6VlSvHQYEUtFtTVXrYpx4tE3WZV5vf043AL8XwSxskW592ULRAzrh6oEcMW9FBDzBrB+l9QIGFengtJ";
if (((String) localObject).length() != 16) {
return;
}
localObject = new SecretKeySpec(((String) localObject).getBytes(Charset.defaultCharset()), "AES");
Cipher localCipher = null;
try {
localCipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
localCipher.init(DECRYPT_MODE, (Key) localObject);
paramString = new String(localCipher.doFinal(Base64.decode(paramString.getBytes("utf-8"), Base64.DEFAULT)), "UTF-8");
Log.e("Main", paramString);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchProviderException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
  那么字符串打印出来的究竟是什么呢
  {“日期”:“20180719”,“网格类型”:“时间线”,“标记”:“4b98b48cb5b20e72”,“p”:“1”,“类型”:“周”}
  呵呵,这些是post的核心数据。同样,您可以通过在线加密和解密网站查看,解密后如下所示:
  
  结果是一样的。最后,我们可能需要伪造数据来请求API实现一些隐藏的秘密==
  长征的第五步:尝试在体内伪造数据
  如果您在这里使用Java,它应该相对简单。只需反向解密。具体的方法是将uChange mode解密为encrypt uMode,然后在外层使用Base64,内层仍然使用AES进行加密。具体来说,它可以由您自己进行测试。在这里,我将重点介绍通过python的实现
  我们使用crytodome实现AES加密和解密。首先,我们导入以下模块:
  import base64
from Cryptodome.Cipher import AES
# str不是16的倍数那就补足为16的倍数
def add_to_16(text):
while len(text) % 16 != 0:
text += '5'
return str.encode(text) # 返回bytes
def generate_encrypt_data():
key = 'com_banxxxx' #隐藏部分密钥内容
dict_data = {"date": "20180719", "grid_type": "timeline", "token": "4b98b48cb5b20e72", "p": "1", "type": "week"}
data_json = json.dumps(dict_data).replace(' ', '') # 移除多余的空格
print(data_json)
cipher = AES.new(add_to_16(key), AES.MODE_ECB)
encrypted_text = str(base64.encodebytes(cipher.encrypt(add_to_16(data_json))), encoding='utf8') # 加密
print(encrypted_text)
generate_encrypt_data()
  
  比较Fiddler捕获的数据,如下所示:
  Lc59D72k2R4YFB0XMOPQRgpNKWGco6f1e86WkOur0ZArCiT+R6VLSVHQYEUTFTVXRYPX4TE3WZV5VF043AL8XSKW592ULRAZRH6OECMW9FBDZBRB+l9QIGFengtJ
  啊,什么鬼?最后几个不同的鬼魂是什么?你不应该去网页解密生成的文件
  
  很好,没问题。编码后会有什么不同
  可能的远程原因:
  dict生成的原创数据与实际原创数据不同。为了确保它是16位的倍数,使用***'\0'**作为填充
  首先,让我们看看DICT转换的数据和Android汇编所生成的数据两次:
  {“日期”:“20180719”,“网格类型”:“时间线”,“标记”:“4b98b48cb5b20e72”,“p”:“1”,“类型”:“周”}
  {“日期”:“20180719”,“网格类型”:“时间线”,“标记”:“4b98b48cb5b20e72”,“p”:“1”,“类型”:“周”}
  这让我说不出话来。绝对正确。让我们看看填充问题。首先,我检查了反编译的源代码,没有找到明确的填充逻辑,因此我考虑通过所有ASIL代码生成相应的加密数据,并将其与正确的数据进行比较
  测试后,所有ASCII码都不会生成一致的加密数据(放弃)
  查看代码后,发现生成cilper的逻辑如下
  Cipher.getInstance("AES/ECB/PKCS7Padding", "BC")
  此处使用Pkcs7padding,但在py中没有指定此设置的位置。如何保持一致性?关于PKCS7填充,请参阅PKCS5填充和PKCS7填充之间的区别
  在这里我突然有了新的灵感。如果填充不一致,两个原创数据也应不一致,但肉眼看起来完全相同。即使通过文本比较,也是一样的。那么如何检查呢
  将在两个位置生成的原创数据转换为列表,然后打印以进行字符级比较。新的代码如下
  def generate_encrypt_data():
key = 'com_banciyuan_AI'
dict_data = {"date": "20180719", "grid_type": "timeline", "token": "4b98b48cb5b20e72", "p": "1", "type": "week"}
data_json = json.dumps(dict_data).replace(' ', '') # 移除多余的空格
print(len(data_json))
print(list(data_json))
cipher = AES.new(add_to_16(key), AES.MODE_ECB)
encrypted_text = str(base64.encodebytes(cipher.encrypt(add_to_16(data_json))), encoding='utf8') # 加密
# print(encrypted_text)
encrypted_text = "Lc59D72k2R4YFB0XMOPQRgpNKWGco6f1e86WkOur0ZArCiT+R6VlSvHQYEUtFtTVXrYpx4tE3WZV5vf043AL8XwSxskW592ULRAzrh6oEcMW9FBDzBrB+l9QIGFengtJ" #正确的加密数据
text_decrypted = str(cipher.decrypt(base64.decodebytes(bytes(encrypted_text, encoding='utf8'))).rstrip(b'\0').decode("utf8")) # 解密
print(len(text_decrypted))
print(list(text_decrypted))
  结果:
  91(dict生成)
  “","t,","i","m","e","e","e","e","e","t"o","k"e","n",","p","p","p","p","p","e","t","y","p"","e 34
  96(由Java解密)
  “,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,”","t","i","m","e","l","i","m","e","e","e","t"o,"k",","p",","p","p","p","e","k","1","","t"y","p","e",""
  通过比较,发现第一个长度不一致,还有五个**'\X05',吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼
  def generate_encrypt_data():
key = 'com_banciyuan_AI'
dict_data = {"date": "20180719", "grid_type": "timeline", "token": "4b98b48cb5b20e72", "p": "1", "type": "week"}
data_json = json.dumps(dict_data).replace(' ', '') # 移除多余的空格
print(data_json+"\n")
cipher = AES.new(add_to_16(key), AES.MODE_ECB)
encrypted_text = str(base64.encodebytes(cipher.encrypt(add_to_16(data_json))), encoding='utf8') # 加密
print(encrypted_text)
text_decrypted = str(cipher.decrypt(base64.decodebytes(bytes(encrypted_text, encoding='utf8'))).rstrip(b'\x05').decode("utf8")) # 解密
print(text_decrypted)
  执行代码:
  
  那么,这篇文章就到此结束了。其实这是一种非常主流的移动加密传输方式。对于HTTPS+AES+本机密钥存储,您可以看到在这方面,半维元素仍然非常充足。如果您有任何疑问,请在评论中指出
  参考博客链接:
  Android本机方法无法找到问题
  在线加密和解密
  python3.6执行AES加密和解密方法
  郑重声明:本文章仅供学习和交流之用,禁止用于任何商业目的

网页抓取解密(有讯软件为客户量身定制最适合自己的网络数据爬虫软件)

网站优化优采云 发表了文章 • 0 个评论 • 89 次浏览 • 2021-09-14 14:02 • 来自相关话题

  网页抓取解密(有讯软件为客户量身定制最适合自己的网络数据爬虫软件)
  优讯软件专注于网络数据抓取和网络数据分析,致力于为客户量身定制最适合的网络数据爬虫软件。只要是网络上可以查看的数据和内容,无论是静态数据还是动态数据,都可以抓取、分析和保存网络数据。
  优讯软件通常开发功能全面、数据准确、性能稳定、操作简单的网络数据爬虫软件。它可以轻松抓取您想要的网络数据内容(包括文本、图片、文件、音乐、视频等)。 采集接收到的数据可以直接存入数据库,生成Excel表格,也可以根据自定义模板保存为任意格式的文件(如保存为网页文件、TXT文件等) 也可以在采集的同时将数据实时保存到远程数据库,或者推送到服务器网站接口。
  目前大部分网页的网站结构或数据结构比较复杂,以至于市面上的一些通用的采集软件无法抓取到网络数据内容,或者是因为那些采集软件需要要使用的。只有懂编程技术的人才可以在数据采集前进行复杂的规则配置。但是大多数用户并不知道如何操作这些复杂的规则配置方法,即使购买了通用软件也无法启动。优讯软件推陈出新,推出量身定制的专业数据爬虫爬虫软件。只需告诉我们数据抓取的需求和数据处理的方法,我们的专业软件工程师就会为您量身定制一套完全符合您个性的套装。满足定制需求的网络数据采集软件。
  与一般爬虫软件相比,定制化爬虫软件具有界面设计简洁、操作简单易用、数据抓取准确、爬虫效率高、功能优化等特点。我们所有的软件都是傻瓜式。只要您能用简单的电脑界面进行操作,您一定会使用我们的软件。我们为您提供最好的数据采集程序和可靠高效的数据采集软件,以及优质的售后服务和软件升级,确保软件的长期有效性。 查看全部

  网页抓取解密(有讯软件为客户量身定制最适合自己的网络数据爬虫软件)
  优讯软件专注于网络数据抓取和网络数据分析,致力于为客户量身定制最适合的网络数据爬虫软件。只要是网络上可以查看的数据和内容,无论是静态数据还是动态数据,都可以抓取、分析和保存网络数据。
  优讯软件通常开发功能全面、数据准确、性能稳定、操作简单的网络数据爬虫软件。它可以轻松抓取您想要的网络数据内容(包括文本、图片、文件、音乐、视频等)。 采集接收到的数据可以直接存入数据库,生成Excel表格,也可以根据自定义模板保存为任意格式的文件(如保存为网页文件、TXT文件等) 也可以在采集的同时将数据实时保存到远程数据库,或者推送到服务器网站接口。
  目前大部分网页的网站结构或数据结构比较复杂,以至于市面上的一些通用的采集软件无法抓取到网络数据内容,或者是因为那些采集软件需要要使用的。只有懂编程技术的人才可以在数据采集前进行复杂的规则配置。但是大多数用户并不知道如何操作这些复杂的规则配置方法,即使购买了通用软件也无法启动。优讯软件推陈出新,推出量身定制的专业数据爬虫爬虫软件。只需告诉我们数据抓取的需求和数据处理的方法,我们的专业软件工程师就会为您量身定制一套完全符合您个性的套装。满足定制需求的网络数据采集软件。
  与一般爬虫软件相比,定制化爬虫软件具有界面设计简洁、操作简单易用、数据抓取准确、爬虫效率高、功能优化等特点。我们所有的软件都是傻瓜式。只要您能用简单的电脑界面进行操作,您一定会使用我们的软件。我们为您提供最好的数据采集程序和可靠高效的数据采集软件,以及优质的售后服务和软件升级,确保软件的长期有效性。

网页抓取解密(优秀的网页抓取工具可供使用使用API)

网站优化优采云 发表了文章 • 0 个评论 • 116 次浏览 • 2021-09-11 11:08 • 来自相关话题

  网页抓取解密(优秀的网页抓取工具可供使用使用API)
  总结
  新信息、新设计模式和大量数据不断涌现。将这些数据组织到一个独特的库中并不容易。但是,有很多出色的网络抓取工具可用。
  新信息、新设计模式和大量数据不断涌现。将这些数据组织到一个独特的库中并不容易。但是,有很多出色的网络抓取工具可用。
  代理抓取
  使用代理抓取 API,您可以抓取网络上的任何 网站/platform。有代理支持、验证码绕过、基于动态内容抓取JavaScript页面的优势。
  
  可以免费获取1000个请求,足以在复杂的内容页面中探索Proxy Crawl的强大功能。
  Scrapy
  Scrapy 是一个开源项目,为抓取网页提供支持。 Scrapy 抓取框架在从 网站 和网页中提取数据方面做得非常出色。
  
  最重要的是,Scrapy 可用于挖掘数据、监控数据模式以及对大型任务执行自动化测试。强大的功能可以与ProxyCrawl完美结合。使用 Scrapy,由于内置工具,选择内容源(HTML 和 XML)轻而易举。您还可以使用 Scrapy API 来扩展所提供的功能。
  抢
  Grab 是一个基于 Python 的框架,用于创建自定义 Web Scraping 规则集。使用 Grab,您可以为小型个人项目创建爬虫机制,也可以构建可同时扩展到数百万页的大型动态爬虫任务。
  
  内置 API 提供了执行请求的方法,也可以处理已删除的内容。 Grab 提供的另一个 API 称为 Spider。使用 Spider API,您可以使用自定义类来创建异步爬虫。
  雪貂
  Ferret 是一种相当新的网络抓取,在开源社区中获得了相当大的吸引力。 Ferret 的目标是提供更简洁的客户端抓取解决方案。例如,允许开发人员编写不必依赖于应用程序状态的爬虫。
  
  此外,Ferret 使用自定义的声明式语言,避免了构建的复杂性。相反,您可以编写严格的规则来从任何站点抓取数据。
  X 射线
  由于 X-Ray 和 Osmosis 等库的可用性,使用 Node.js 抓取网页非常容易。
  Diffbot
  Diffbot 是市场上的新玩家。你甚至不用写太多代码,因为Diffbot的AI算法可以从网站页面解密结构化数据,无需手动指定。
  
  PhantomJS 云
  PhantomJS Cloud 是 PhantomJS 的 SaaS 替代品。使用 PhantomJS Cloud,您可以直接从网页内部获取数据,也可以生成可视化文件,并将页面呈现在 PDF 文档中。
  
  PhantomJS 本身就是一个浏览器,这意味着你可以像浏览器一样加载和执行页面资源。如果您需要为手头的任务获取许多基于 JavaScript 的 网站,这将特别有用。 查看全部

  网页抓取解密(优秀的网页抓取工具可供使用使用API)
  总结
  新信息、新设计模式和大量数据不断涌现。将这些数据组织到一个独特的库中并不容易。但是,有很多出色的网络抓取工具可用。
  新信息、新设计模式和大量数据不断涌现。将这些数据组织到一个独特的库中并不容易。但是,有很多出色的网络抓取工具可用。
  代理抓取
  使用代理抓取 API,您可以抓取网络上的任何 网站/platform。有代理支持、验证码绕过、基于动态内容抓取JavaScript页面的优势。
  
  可以免费获取1000个请求,足以在复杂的内容页面中探索Proxy Crawl的强大功能。
  Scrapy
  Scrapy 是一个开源项目,为抓取网页提供支持。 Scrapy 抓取框架在从 网站 和网页中提取数据方面做得非常出色。
  
  最重要的是,Scrapy 可用于挖掘数据、监控数据模式以及对大型任务执行自动化测试。强大的功能可以与ProxyCrawl完美结合。使用 Scrapy,由于内置工具,选择内容源(HTML 和 XML)轻而易举。您还可以使用 Scrapy API 来扩展所提供的功能。
  抢
  Grab 是一个基于 Python 的框架,用于创建自定义 Web Scraping 规则集。使用 Grab,您可以为小型个人项目创建爬虫机制,也可以构建可同时扩展到数百万页的大型动态爬虫任务。
  
  内置 API 提供了执行请求的方法,也可以处理已删除的内容。 Grab 提供的另一个 API 称为 Spider。使用 Spider API,您可以使用自定义类来创建异步爬虫。
  雪貂
  Ferret 是一种相当新的网络抓取,在开源社区中获得了相当大的吸引力。 Ferret 的目标是提供更简洁的客户端抓取解决方案。例如,允许开发人员编写不必依赖于应用程序状态的爬虫。
  
  此外,Ferret 使用自定义的声明式语言,避免了构建的复杂性。相反,您可以编写严格的规则来从任何站点抓取数据。
  X 射线
  由于 X-Ray 和 Osmosis 等库的可用性,使用 Node.js 抓取网页非常容易。
  Diffbot
  Diffbot 是市场上的新玩家。你甚至不用写太多代码,因为Diffbot的AI算法可以从网站页面解密结构化数据,无需手动指定。
  
  PhantomJS 云
  PhantomJS Cloud 是 PhantomJS 的 SaaS 替代品。使用 PhantomJS Cloud,您可以直接从网页内部获取数据,也可以生成可视化文件,并将页面呈现在 PDF 文档中。
  
  PhantomJS 本身就是一个浏览器,这意味着你可以像浏览器一样加载和执行页面资源。如果您需要为手头的任务获取许多基于 JavaScript 的 网站,这将特别有用。

网页抓取解密(网页抓取解密技术,特别是什么?/jpgfree-toolcodemanjarowebsecurity)

网站优化优采云 发表了文章 • 0 个评论 • 87 次浏览 • 2021-09-11 08:04 • 来自相关话题

  网页抓取解密(网页抓取解密技术,特别是什么?/jpgfree-toolcodemanjarowebsecurity)
  网页抓取解密技术,特别是https解密这一块,是利用当前网页中密钥(非httpshttp密钥)的加密算法抓取后离线解密,其中https依据http加密算法加密然后使用tls来进行传输和证书证明
  给大家推荐一款免费的密码管理工具。
  已经没用了
  依赖于加密算法和完整的客户端使用。https加密的工具有很多,
  notify|web-security
  一般人写不出这个工具,只能默默关注此类文章了,如题主有此需求,请在留言中告知帮助邮箱。
  quicksession/jpgfree-toolcode
  manjarowebsecurity中,
  可以参考我写的密码生成工具。
  websecuritybookmarkworkspace(web-security)orwebsecuritychina
  dony-jun/thewheellistify-thewheellistify·github
  你要下很大量的图片,
  挖掘利用网络和中间人算法是最简单方法,常见的是xssspringboot主要依赖web安全工具有一些也需要类似的技术,但是这个写个扩展,当作javascript的脚本实现, 查看全部

  网页抓取解密(网页抓取解密技术,特别是什么?/jpgfree-toolcodemanjarowebsecurity)
  网页抓取解密技术,特别是https解密这一块,是利用当前网页中密钥(非httpshttp密钥)的加密算法抓取后离线解密,其中https依据http加密算法加密然后使用tls来进行传输和证书证明
  给大家推荐一款免费的密码管理工具。
  已经没用了
  依赖于加密算法和完整的客户端使用。https加密的工具有很多,
  notify|web-security
  一般人写不出这个工具,只能默默关注此类文章了,如题主有此需求,请在留言中告知帮助邮箱。
  quicksession/jpgfree-toolcode
  manjarowebsecurity中,
  可以参考我写的密码生成工具。
  websecuritybookmarkworkspace(web-security)orwebsecuritychina
  dony-jun/thewheellistify-thewheellistify·github
  你要下很大量的图片,
  挖掘利用网络和中间人算法是最简单方法,常见的是xssspringboot主要依赖web安全工具有一些也需要类似的技术,但是这个写个扩展,当作javascript的脚本实现,

网页抓取解密(Androidkillerdata,参数怎么产生的?(图))

网站优化优采云 发表了文章 • 0 个评论 • 182 次浏览 • 2021-09-16 08:02 • 来自相关话题

  网页抓取解密(Androidkillerdata,参数怎么产生的?(图))
  本文以小提琴手为例。配置完成后,可以在fiddler界面中看到页面请求的HTTPS连接。以cos每周清单为例:
  
  如图所示,我们可以看到这个post请求的URL、查询参数、请求体和返回的JSON数据。完整的URL如下所示:
  *2160及;dpi=480&更新版本代码=412&\rticket=94
  这里,请求主体的密钥为数据,加密内容为:
  Lc59D72k2R4YFB0XMOPQRgpNKWGco6f1e86WkOur0ZArCiT+R6VLSVHQYEUTFTVXRYPX4TE3WZV5VF043AL8XSKW592ULRAZRH6OECMW9FBDZBRB+l9QIGFengtJ
  由于这是一个post请求,如果直接单击此处打开,将出现默认提示,并且不会返回任何数据。因此,我们可以通过postman等工具测试请求,如下所示:
  
  所以问题来了。数据是加密的。我们需要的是动态生成数据,根据参数自由获取数据。我们该怎么办
  长征的第二步:反编译
  为了查看请求主体中的数据参数是如何生成的,我们需要反编译以分析源代码
  首先,从官方网站下载半维APK的安装包。这里的地址是。在这里,您可以直接使用快速方便的Android killer来完成反编译逻辑。反编译成功后,如下所示:
  
  很容易找到类维度的源代码路径。完整的内容是com.banciyuan.bcywebview。因为我们可以直接看到SmalI汇编源代码,所以这里没有太多意义。这里我们通过Java查看器查看Java源代码。考虑到这是一个网络请求,我们重点查找与http相关的内容并进行搜索,我注意到其中一个httputils文件,如下所示:
  
  如图中的红色框所示,可以看到数据在这里被加密并传输到服务器,因此我们调用encrypt来查看
   public static String a(String paramString)
{
return a(paramString, 0);
}
  在encrypt中有这样一种方法。让我们继续看电话
   public static String a(String paramString, int paramInt)
{
return a(b(paramString, paramInt));
}
  好吧,继续看方法B
   private static byte[] b(String paramString, int paramInt)
{
Object localObject = getRandomString(paramInt);
if (localObject != null)
{
if (paramInt == 0) {}
try
{
if (((String)localObject).length() != 16) {
return null;
}
localObject = new SecretKeySpec(((String)localObject).getBytes(Charset.defaultCharset()), "AES");
Cipher localCipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
localCipher.init(1, (Key)localObject);
paramString = localCipher.doFinal(paramString.getBytes("utf-8"));
return paramString;
}
catch (Exception paramString) {}
}
return null;
}
  哦,是的,这里应该很清楚,数据是由AES通过密码加密的。关键是什么
  长征的第三步:模拟本地呼叫
  虽然我们看到了加密逻辑,但我们可以从代码中看到密钥是通过getrandomstring(paramint)方法获得的,这是一种本机方法,在代码中定义
  private static native String getRandomString(int paramInt);
  好的,因为它是本机方法,所以我们可以在项目中调用并打印键的实际值。因此,我发现本机方法来自library.so
   static
{
System.loadLibrary("random");
}
  将so文件引入到我自己的项目中,并编写类似的调用代码,如下所示:
  public class Encrypt {
static
{
System.loadLibrary("random");
}
public void Test(){
Log.e("Encrypt",getRandomString(0));
}
private static native String getRandomString(int paramInt);
}
  外呼:
   new Encrypt().Test();
  嗯,执行代码的结果没有按预期打印出来。相反,它会提示找不到本机方法getrandomstring。我很困惑。经过研究,发现本机方法的命名格式如下:
  Java_uuCOM_uuuCiyuan_uuBcyWebView_Uils_UEncrypt_UEncrypt_U1;getRandomString
  如果在任何项目中使用getrandomstring,将找不到它
  好的,解决方案是用相同的包名和半维重新创建一个项目。完整的包名是com.banciyuan.bcywebview。您可以通过再次调用它来成功打印它。结果如下:
  
  注:为了防止商业使用,决定隐藏一些关键内容
  哈哈,我这里有半维的加密密钥。大多数情况下,我们将键放在常量中,并将其直接写入代码中。对于这一点,半维也是善意的
  长征的第四步:数据解密
  同样清楚的是,这里写的是半维元素的加密过程和密钥结果。理论上,通过这一关键结果,我们可以伪造任意post请求的数据。真的可以吗
  如下所示,我在Android下编写了一段解密逻辑:
   private void decryptData() {
Object localObject = "com_banciyuan_AI";
String paramString = "Lc59D72k2R4YFB0XMOPQRgpNKWGco6f1e86WkOur0ZArCiT+R6VlSvHQYEUtFtTVXrYpx4tE3WZV5vf043AL8XwSxskW592ULRAzrh6oEcMW9FBDzBrB+l9QIGFengtJ";
if (((String) localObject).length() != 16) {
return;
}
localObject = new SecretKeySpec(((String) localObject).getBytes(Charset.defaultCharset()), "AES");
Cipher localCipher = null;
try {
localCipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
localCipher.init(DECRYPT_MODE, (Key) localObject);
paramString = new String(localCipher.doFinal(Base64.decode(paramString.getBytes("utf-8"), Base64.DEFAULT)), "UTF-8");
Log.e("Main", paramString);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchProviderException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
  那么字符串打印出来的究竟是什么呢
  {“日期”:“20180719”,“网格类型”:“时间线”,“标记”:“4b98b48cb5b20e72”,“p”:“1”,“类型”:“周”}
  呵呵,这些是post的核心数据。同样,您可以通过在线加密和解密网站查看,解密后如下所示:
  
  结果是一样的。最后,我们可能需要伪造数据来请求API实现一些隐藏的秘密==
  长征的第五步:尝试在体内伪造数据
  如果您在这里使用Java,它应该相对简单。只需反向解密。具体的方法是将uChange mode解密为encrypt uMode,然后在外层使用Base64,内层仍然使用AES进行加密。具体来说,它可以由您自己进行测试。在这里,我将重点介绍通过python的实现
  我们使用crytodome实现AES加密和解密。首先,我们导入以下模块:
  import base64
from Cryptodome.Cipher import AES
# str不是16的倍数那就补足为16的倍数
def add_to_16(text):
while len(text) % 16 != 0:
text += '5'
return str.encode(text) # 返回bytes
def generate_encrypt_data():
key = 'com_banxxxx' #隐藏部分密钥内容
dict_data = {"date": "20180719", "grid_type": "timeline", "token": "4b98b48cb5b20e72", "p": "1", "type": "week"}
data_json = json.dumps(dict_data).replace(' ', '') # 移除多余的空格
print(data_json)
cipher = AES.new(add_to_16(key), AES.MODE_ECB)
encrypted_text = str(base64.encodebytes(cipher.encrypt(add_to_16(data_json))), encoding='utf8') # 加密
print(encrypted_text)
generate_encrypt_data()
  
  比较Fiddler捕获的数据,如下所示:
  Lc59D72k2R4YFB0XMOPQRgpNKWGco6f1e86WkOur0ZArCiT+R6VLSVHQYEUTFTVXRYPX4TE3WZV5VF043AL8XSKW592ULRAZRH6OECMW9FBDZBRB+l9QIGFengtJ
  啊,什么鬼?最后几个不同的鬼魂是什么?你不应该去网页解密生成的文件
  
  很好,没问题。编码后会有什么不同
  可能的远程原因:
  dict生成的原创数据与实际原创数据不同。为了确保它是16位的倍数,使用***'\0'**作为填充
  首先,让我们看看DICT转换的数据和Android汇编所生成的数据两次:
  {“日期”:“20180719”,“网格类型”:“时间线”,“标记”:“4b98b48cb5b20e72”,“p”:“1”,“类型”:“周”}
  {“日期”:“20180719”,“网格类型”:“时间线”,“标记”:“4b98b48cb5b20e72”,“p”:“1”,“类型”:“周”}
  这让我说不出话来。绝对正确。让我们看看填充问题。首先,我检查了反编译的源代码,没有找到明确的填充逻辑,因此我考虑通过所有ASIL代码生成相应的加密数据,并将其与正确的数据进行比较
  测试后,所有ASCII码都不会生成一致的加密数据(放弃)
  查看代码后,发现生成cilper的逻辑如下
  Cipher.getInstance("AES/ECB/PKCS7Padding", "BC")
  此处使用Pkcs7padding,但在py中没有指定此设置的位置。如何保持一致性?关于PKCS7填充,请参阅PKCS5填充和PKCS7填充之间的区别
  在这里我突然有了新的灵感。如果填充不一致,两个原创数据也应不一致,但肉眼看起来完全相同。即使通过文本比较,也是一样的。那么如何检查呢
  将在两个位置生成的原创数据转换为列表,然后打印以进行字符级比较。新的代码如下
  def generate_encrypt_data():
key = 'com_banciyuan_AI'
dict_data = {"date": "20180719", "grid_type": "timeline", "token": "4b98b48cb5b20e72", "p": "1", "type": "week"}
data_json = json.dumps(dict_data).replace(' ', '') # 移除多余的空格
print(len(data_json))
print(list(data_json))
cipher = AES.new(add_to_16(key), AES.MODE_ECB)
encrypted_text = str(base64.encodebytes(cipher.encrypt(add_to_16(data_json))), encoding='utf8') # 加密
# print(encrypted_text)
encrypted_text = "Lc59D72k2R4YFB0XMOPQRgpNKWGco6f1e86WkOur0ZArCiT+R6VlSvHQYEUtFtTVXrYpx4tE3WZV5vf043AL8XwSxskW592ULRAzrh6oEcMW9FBDzBrB+l9QIGFengtJ" #正确的加密数据
text_decrypted = str(cipher.decrypt(base64.decodebytes(bytes(encrypted_text, encoding='utf8'))).rstrip(b'\0').decode("utf8")) # 解密
print(len(text_decrypted))
print(list(text_decrypted))
  结果:
  91(dict生成)
  “","t,","i","m","e","e","e","e","e","t"o","k"e","n",","p","p","p","p","p","e","t","y","p"","e 34
  96(由Java解密)
  “,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,”","t","i","m","e","l","i","m","e","e","e","t"o,"k",","p",","p","p","p","e","k","1","","t"y","p","e",""
  通过比较,发现第一个长度不一致,还有五个**'\X05',吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼
  def generate_encrypt_data():
key = 'com_banciyuan_AI'
dict_data = {"date": "20180719", "grid_type": "timeline", "token": "4b98b48cb5b20e72", "p": "1", "type": "week"}
data_json = json.dumps(dict_data).replace(' ', '') # 移除多余的空格
print(data_json+"\n")
cipher = AES.new(add_to_16(key), AES.MODE_ECB)
encrypted_text = str(base64.encodebytes(cipher.encrypt(add_to_16(data_json))), encoding='utf8') # 加密
print(encrypted_text)
text_decrypted = str(cipher.decrypt(base64.decodebytes(bytes(encrypted_text, encoding='utf8'))).rstrip(b'\x05').decode("utf8")) # 解密
print(text_decrypted)
  执行代码:
  
  那么,这篇文章就到此结束了。其实这是一种非常主流的移动加密传输方式。对于HTTPS+AES+本机密钥存储,您可以看到在这方面,半维元素仍然非常充足。如果您有任何疑问,请在评论中指出
  参考博客链接:
  Android本机方法无法找到问题
  在线加密和解密
  python3.6执行AES加密和解密方法
  郑重声明:本文章仅供学习和交流之用,禁止用于任何商业目的 查看全部

  网页抓取解密(Androidkillerdata,参数怎么产生的?(图))
  本文以小提琴手为例。配置完成后,可以在fiddler界面中看到页面请求的HTTPS连接。以cos每周清单为例:
  
  如图所示,我们可以看到这个post请求的URL、查询参数、请求体和返回的JSON数据。完整的URL如下所示:
  *2160及;dpi=480&更新版本代码=412&\rticket=94
  这里,请求主体的密钥为数据,加密内容为:
  Lc59D72k2R4YFB0XMOPQRgpNKWGco6f1e86WkOur0ZArCiT+R6VLSVHQYEUTFTVXRYPX4TE3WZV5VF043AL8XSKW592ULRAZRH6OECMW9FBDZBRB+l9QIGFengtJ
  由于这是一个post请求,如果直接单击此处打开,将出现默认提示,并且不会返回任何数据。因此,我们可以通过postman等工具测试请求,如下所示:
  
  所以问题来了。数据是加密的。我们需要的是动态生成数据,根据参数自由获取数据。我们该怎么办
  长征的第二步:反编译
  为了查看请求主体中的数据参数是如何生成的,我们需要反编译以分析源代码
  首先,从官方网站下载半维APK的安装包。这里的地址是。在这里,您可以直接使用快速方便的Android killer来完成反编译逻辑。反编译成功后,如下所示:
  
  很容易找到类维度的源代码路径。完整的内容是com.banciyuan.bcywebview。因为我们可以直接看到SmalI汇编源代码,所以这里没有太多意义。这里我们通过Java查看器查看Java源代码。考虑到这是一个网络请求,我们重点查找与http相关的内容并进行搜索,我注意到其中一个httputils文件,如下所示:
  
  如图中的红色框所示,可以看到数据在这里被加密并传输到服务器,因此我们调用encrypt来查看
   public static String a(String paramString)
{
return a(paramString, 0);
}
  在encrypt中有这样一种方法。让我们继续看电话
   public static String a(String paramString, int paramInt)
{
return a(b(paramString, paramInt));
}
  好吧,继续看方法B
   private static byte[] b(String paramString, int paramInt)
{
Object localObject = getRandomString(paramInt);
if (localObject != null)
{
if (paramInt == 0) {}
try
{
if (((String)localObject).length() != 16) {
return null;
}
localObject = new SecretKeySpec(((String)localObject).getBytes(Charset.defaultCharset()), "AES");
Cipher localCipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
localCipher.init(1, (Key)localObject);
paramString = localCipher.doFinal(paramString.getBytes("utf-8"));
return paramString;
}
catch (Exception paramString) {}
}
return null;
}
  哦,是的,这里应该很清楚,数据是由AES通过密码加密的。关键是什么
  长征的第三步:模拟本地呼叫
  虽然我们看到了加密逻辑,但我们可以从代码中看到密钥是通过getrandomstring(paramint)方法获得的,这是一种本机方法,在代码中定义
  private static native String getRandomString(int paramInt);
  好的,因为它是本机方法,所以我们可以在项目中调用并打印键的实际值。因此,我发现本机方法来自library.so
   static
{
System.loadLibrary("random");
}
  将so文件引入到我自己的项目中,并编写类似的调用代码,如下所示:
  public class Encrypt {
static
{
System.loadLibrary("random");
}
public void Test(){
Log.e("Encrypt",getRandomString(0));
}
private static native String getRandomString(int paramInt);
}
  外呼:
   new Encrypt().Test();
  嗯,执行代码的结果没有按预期打印出来。相反,它会提示找不到本机方法getrandomstring。我很困惑。经过研究,发现本机方法的命名格式如下:
  Java_uuCOM_uuuCiyuan_uuBcyWebView_Uils_UEncrypt_UEncrypt_U1;getRandomString
  如果在任何项目中使用getrandomstring,将找不到它
  好的,解决方案是用相同的包名和半维重新创建一个项目。完整的包名是com.banciyuan.bcywebview。您可以通过再次调用它来成功打印它。结果如下:
  
  注:为了防止商业使用,决定隐藏一些关键内容
  哈哈,我这里有半维的加密密钥。大多数情况下,我们将键放在常量中,并将其直接写入代码中。对于这一点,半维也是善意的
  长征的第四步:数据解密
  同样清楚的是,这里写的是半维元素的加密过程和密钥结果。理论上,通过这一关键结果,我们可以伪造任意post请求的数据。真的可以吗
  如下所示,我在Android下编写了一段解密逻辑:
   private void decryptData() {
Object localObject = "com_banciyuan_AI";
String paramString = "Lc59D72k2R4YFB0XMOPQRgpNKWGco6f1e86WkOur0ZArCiT+R6VlSvHQYEUtFtTVXrYpx4tE3WZV5vf043AL8XwSxskW592ULRAzrh6oEcMW9FBDzBrB+l9QIGFengtJ";
if (((String) localObject).length() != 16) {
return;
}
localObject = new SecretKeySpec(((String) localObject).getBytes(Charset.defaultCharset()), "AES");
Cipher localCipher = null;
try {
localCipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
localCipher.init(DECRYPT_MODE, (Key) localObject);
paramString = new String(localCipher.doFinal(Base64.decode(paramString.getBytes("utf-8"), Base64.DEFAULT)), "UTF-8");
Log.e("Main", paramString);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchProviderException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
  那么字符串打印出来的究竟是什么呢
  {“日期”:“20180719”,“网格类型”:“时间线”,“标记”:“4b98b48cb5b20e72”,“p”:“1”,“类型”:“周”}
  呵呵,这些是post的核心数据。同样,您可以通过在线加密和解密网站查看,解密后如下所示:
  
  结果是一样的。最后,我们可能需要伪造数据来请求API实现一些隐藏的秘密==
  长征的第五步:尝试在体内伪造数据
  如果您在这里使用Java,它应该相对简单。只需反向解密。具体的方法是将uChange mode解密为encrypt uMode,然后在外层使用Base64,内层仍然使用AES进行加密。具体来说,它可以由您自己进行测试。在这里,我将重点介绍通过python的实现
  我们使用crytodome实现AES加密和解密。首先,我们导入以下模块:
  import base64
from Cryptodome.Cipher import AES
# str不是16的倍数那就补足为16的倍数
def add_to_16(text):
while len(text) % 16 != 0:
text += '5'
return str.encode(text) # 返回bytes
def generate_encrypt_data():
key = 'com_banxxxx' #隐藏部分密钥内容
dict_data = {"date": "20180719", "grid_type": "timeline", "token": "4b98b48cb5b20e72", "p": "1", "type": "week"}
data_json = json.dumps(dict_data).replace(' ', '') # 移除多余的空格
print(data_json)
cipher = AES.new(add_to_16(key), AES.MODE_ECB)
encrypted_text = str(base64.encodebytes(cipher.encrypt(add_to_16(data_json))), encoding='utf8') # 加密
print(encrypted_text)
generate_encrypt_data()
  
  比较Fiddler捕获的数据,如下所示:
  Lc59D72k2R4YFB0XMOPQRgpNKWGco6f1e86WkOur0ZArCiT+R6VLSVHQYEUTFTVXRYPX4TE3WZV5VF043AL8XSKW592ULRAZRH6OECMW9FBDZBRB+l9QIGFengtJ
  啊,什么鬼?最后几个不同的鬼魂是什么?你不应该去网页解密生成的文件
  
  很好,没问题。编码后会有什么不同
  可能的远程原因:
  dict生成的原创数据与实际原创数据不同。为了确保它是16位的倍数,使用***'\0'**作为填充
  首先,让我们看看DICT转换的数据和Android汇编所生成的数据两次:
  {“日期”:“20180719”,“网格类型”:“时间线”,“标记”:“4b98b48cb5b20e72”,“p”:“1”,“类型”:“周”}
  {“日期”:“20180719”,“网格类型”:“时间线”,“标记”:“4b98b48cb5b20e72”,“p”:“1”,“类型”:“周”}
  这让我说不出话来。绝对正确。让我们看看填充问题。首先,我检查了反编译的源代码,没有找到明确的填充逻辑,因此我考虑通过所有ASIL代码生成相应的加密数据,并将其与正确的数据进行比较
  测试后,所有ASCII码都不会生成一致的加密数据(放弃)
  查看代码后,发现生成cilper的逻辑如下
  Cipher.getInstance("AES/ECB/PKCS7Padding", "BC")
  此处使用Pkcs7padding,但在py中没有指定此设置的位置。如何保持一致性?关于PKCS7填充,请参阅PKCS5填充和PKCS7填充之间的区别
  在这里我突然有了新的灵感。如果填充不一致,两个原创数据也应不一致,但肉眼看起来完全相同。即使通过文本比较,也是一样的。那么如何检查呢
  将在两个位置生成的原创数据转换为列表,然后打印以进行字符级比较。新的代码如下
  def generate_encrypt_data():
key = 'com_banciyuan_AI'
dict_data = {"date": "20180719", "grid_type": "timeline", "token": "4b98b48cb5b20e72", "p": "1", "type": "week"}
data_json = json.dumps(dict_data).replace(' ', '') # 移除多余的空格
print(len(data_json))
print(list(data_json))
cipher = AES.new(add_to_16(key), AES.MODE_ECB)
encrypted_text = str(base64.encodebytes(cipher.encrypt(add_to_16(data_json))), encoding='utf8') # 加密
# print(encrypted_text)
encrypted_text = "Lc59D72k2R4YFB0XMOPQRgpNKWGco6f1e86WkOur0ZArCiT+R6VlSvHQYEUtFtTVXrYpx4tE3WZV5vf043AL8XwSxskW592ULRAzrh6oEcMW9FBDzBrB+l9QIGFengtJ" #正确的加密数据
text_decrypted = str(cipher.decrypt(base64.decodebytes(bytes(encrypted_text, encoding='utf8'))).rstrip(b'\0').decode("utf8")) # 解密
print(len(text_decrypted))
print(list(text_decrypted))
  结果:
  91(dict生成)
  “","t,","i","m","e","e","e","e","e","t"o","k"e","n",","p","p","p","p","p","e","t","y","p"","e 34
  96(由Java解密)
  “,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,”","t","i","m","e","l","i","m","e","e","e","t"o,"k",","p",","p","p","p","e","k","1","","t"y","p","e",""
  通过比较,发现第一个长度不一致,还有五个**'\X05',吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼,吼
  def generate_encrypt_data():
key = 'com_banciyuan_AI'
dict_data = {"date": "20180719", "grid_type": "timeline", "token": "4b98b48cb5b20e72", "p": "1", "type": "week"}
data_json = json.dumps(dict_data).replace(' ', '') # 移除多余的空格
print(data_json+"\n")
cipher = AES.new(add_to_16(key), AES.MODE_ECB)
encrypted_text = str(base64.encodebytes(cipher.encrypt(add_to_16(data_json))), encoding='utf8') # 加密
print(encrypted_text)
text_decrypted = str(cipher.decrypt(base64.decodebytes(bytes(encrypted_text, encoding='utf8'))).rstrip(b'\x05').decode("utf8")) # 解密
print(text_decrypted)
  执行代码:
  
  那么,这篇文章就到此结束了。其实这是一种非常主流的移动加密传输方式。对于HTTPS+AES+本机密钥存储,您可以看到在这方面,半维元素仍然非常充足。如果您有任何疑问,请在评论中指出
  参考博客链接:
  Android本机方法无法找到问题
  在线加密和解密
  python3.6执行AES加密和解密方法
  郑重声明:本文章仅供学习和交流之用,禁止用于任何商业目的

网页抓取解密(有讯软件为客户量身定制最适合自己的网络数据爬虫软件)

网站优化优采云 发表了文章 • 0 个评论 • 89 次浏览 • 2021-09-14 14:02 • 来自相关话题

  网页抓取解密(有讯软件为客户量身定制最适合自己的网络数据爬虫软件)
  优讯软件专注于网络数据抓取和网络数据分析,致力于为客户量身定制最适合的网络数据爬虫软件。只要是网络上可以查看的数据和内容,无论是静态数据还是动态数据,都可以抓取、分析和保存网络数据。
  优讯软件通常开发功能全面、数据准确、性能稳定、操作简单的网络数据爬虫软件。它可以轻松抓取您想要的网络数据内容(包括文本、图片、文件、音乐、视频等)。 采集接收到的数据可以直接存入数据库,生成Excel表格,也可以根据自定义模板保存为任意格式的文件(如保存为网页文件、TXT文件等) 也可以在采集的同时将数据实时保存到远程数据库,或者推送到服务器网站接口。
  目前大部分网页的网站结构或数据结构比较复杂,以至于市面上的一些通用的采集软件无法抓取到网络数据内容,或者是因为那些采集软件需要要使用的。只有懂编程技术的人才可以在数据采集前进行复杂的规则配置。但是大多数用户并不知道如何操作这些复杂的规则配置方法,即使购买了通用软件也无法启动。优讯软件推陈出新,推出量身定制的专业数据爬虫爬虫软件。只需告诉我们数据抓取的需求和数据处理的方法,我们的专业软件工程师就会为您量身定制一套完全符合您个性的套装。满足定制需求的网络数据采集软件。
  与一般爬虫软件相比,定制化爬虫软件具有界面设计简洁、操作简单易用、数据抓取准确、爬虫效率高、功能优化等特点。我们所有的软件都是傻瓜式。只要您能用简单的电脑界面进行操作,您一定会使用我们的软件。我们为您提供最好的数据采集程序和可靠高效的数据采集软件,以及优质的售后服务和软件升级,确保软件的长期有效性。 查看全部

  网页抓取解密(有讯软件为客户量身定制最适合自己的网络数据爬虫软件)
  优讯软件专注于网络数据抓取和网络数据分析,致力于为客户量身定制最适合的网络数据爬虫软件。只要是网络上可以查看的数据和内容,无论是静态数据还是动态数据,都可以抓取、分析和保存网络数据。
  优讯软件通常开发功能全面、数据准确、性能稳定、操作简单的网络数据爬虫软件。它可以轻松抓取您想要的网络数据内容(包括文本、图片、文件、音乐、视频等)。 采集接收到的数据可以直接存入数据库,生成Excel表格,也可以根据自定义模板保存为任意格式的文件(如保存为网页文件、TXT文件等) 也可以在采集的同时将数据实时保存到远程数据库,或者推送到服务器网站接口。
  目前大部分网页的网站结构或数据结构比较复杂,以至于市面上的一些通用的采集软件无法抓取到网络数据内容,或者是因为那些采集软件需要要使用的。只有懂编程技术的人才可以在数据采集前进行复杂的规则配置。但是大多数用户并不知道如何操作这些复杂的规则配置方法,即使购买了通用软件也无法启动。优讯软件推陈出新,推出量身定制的专业数据爬虫爬虫软件。只需告诉我们数据抓取的需求和数据处理的方法,我们的专业软件工程师就会为您量身定制一套完全符合您个性的套装。满足定制需求的网络数据采集软件。
  与一般爬虫软件相比,定制化爬虫软件具有界面设计简洁、操作简单易用、数据抓取准确、爬虫效率高、功能优化等特点。我们所有的软件都是傻瓜式。只要您能用简单的电脑界面进行操作,您一定会使用我们的软件。我们为您提供最好的数据采集程序和可靠高效的数据采集软件,以及优质的售后服务和软件升级,确保软件的长期有效性。

网页抓取解密(优秀的网页抓取工具可供使用使用API)

网站优化优采云 发表了文章 • 0 个评论 • 116 次浏览 • 2021-09-11 11:08 • 来自相关话题

  网页抓取解密(优秀的网页抓取工具可供使用使用API)
  总结
  新信息、新设计模式和大量数据不断涌现。将这些数据组织到一个独特的库中并不容易。但是,有很多出色的网络抓取工具可用。
  新信息、新设计模式和大量数据不断涌现。将这些数据组织到一个独特的库中并不容易。但是,有很多出色的网络抓取工具可用。
  代理抓取
  使用代理抓取 API,您可以抓取网络上的任何 网站/platform。有代理支持、验证码绕过、基于动态内容抓取JavaScript页面的优势。
  
  可以免费获取1000个请求,足以在复杂的内容页面中探索Proxy Crawl的强大功能。
  Scrapy
  Scrapy 是一个开源项目,为抓取网页提供支持。 Scrapy 抓取框架在从 网站 和网页中提取数据方面做得非常出色。
  
  最重要的是,Scrapy 可用于挖掘数据、监控数据模式以及对大型任务执行自动化测试。强大的功能可以与ProxyCrawl完美结合。使用 Scrapy,由于内置工具,选择内容源(HTML 和 XML)轻而易举。您还可以使用 Scrapy API 来扩展所提供的功能。
  抢
  Grab 是一个基于 Python 的框架,用于创建自定义 Web Scraping 规则集。使用 Grab,您可以为小型个人项目创建爬虫机制,也可以构建可同时扩展到数百万页的大型动态爬虫任务。
  
  内置 API 提供了执行请求的方法,也可以处理已删除的内容。 Grab 提供的另一个 API 称为 Spider。使用 Spider API,您可以使用自定义类来创建异步爬虫。
  雪貂
  Ferret 是一种相当新的网络抓取,在开源社区中获得了相当大的吸引力。 Ferret 的目标是提供更简洁的客户端抓取解决方案。例如,允许开发人员编写不必依赖于应用程序状态的爬虫。
  
  此外,Ferret 使用自定义的声明式语言,避免了构建的复杂性。相反,您可以编写严格的规则来从任何站点抓取数据。
  X 射线
  由于 X-Ray 和 Osmosis 等库的可用性,使用 Node.js 抓取网页非常容易。
  Diffbot
  Diffbot 是市场上的新玩家。你甚至不用写太多代码,因为Diffbot的AI算法可以从网站页面解密结构化数据,无需手动指定。
  
  PhantomJS 云
  PhantomJS Cloud 是 PhantomJS 的 SaaS 替代品。使用 PhantomJS Cloud,您可以直接从网页内部获取数据,也可以生成可视化文件,并将页面呈现在 PDF 文档中。
  
  PhantomJS 本身就是一个浏览器,这意味着你可以像浏览器一样加载和执行页面资源。如果您需要为手头的任务获取许多基于 JavaScript 的 网站,这将特别有用。 查看全部

  网页抓取解密(优秀的网页抓取工具可供使用使用API)
  总结
  新信息、新设计模式和大量数据不断涌现。将这些数据组织到一个独特的库中并不容易。但是,有很多出色的网络抓取工具可用。
  新信息、新设计模式和大量数据不断涌现。将这些数据组织到一个独特的库中并不容易。但是,有很多出色的网络抓取工具可用。
  代理抓取
  使用代理抓取 API,您可以抓取网络上的任何 网站/platform。有代理支持、验证码绕过、基于动态内容抓取JavaScript页面的优势。
  
  可以免费获取1000个请求,足以在复杂的内容页面中探索Proxy Crawl的强大功能。
  Scrapy
  Scrapy 是一个开源项目,为抓取网页提供支持。 Scrapy 抓取框架在从 网站 和网页中提取数据方面做得非常出色。
  
  最重要的是,Scrapy 可用于挖掘数据、监控数据模式以及对大型任务执行自动化测试。强大的功能可以与ProxyCrawl完美结合。使用 Scrapy,由于内置工具,选择内容源(HTML 和 XML)轻而易举。您还可以使用 Scrapy API 来扩展所提供的功能。
  抢
  Grab 是一个基于 Python 的框架,用于创建自定义 Web Scraping 规则集。使用 Grab,您可以为小型个人项目创建爬虫机制,也可以构建可同时扩展到数百万页的大型动态爬虫任务。
  
  内置 API 提供了执行请求的方法,也可以处理已删除的内容。 Grab 提供的另一个 API 称为 Spider。使用 Spider API,您可以使用自定义类来创建异步爬虫。
  雪貂
  Ferret 是一种相当新的网络抓取,在开源社区中获得了相当大的吸引力。 Ferret 的目标是提供更简洁的客户端抓取解决方案。例如,允许开发人员编写不必依赖于应用程序状态的爬虫。
  
  此外,Ferret 使用自定义的声明式语言,避免了构建的复杂性。相反,您可以编写严格的规则来从任何站点抓取数据。
  X 射线
  由于 X-Ray 和 Osmosis 等库的可用性,使用 Node.js 抓取网页非常容易。
  Diffbot
  Diffbot 是市场上的新玩家。你甚至不用写太多代码,因为Diffbot的AI算法可以从网站页面解密结构化数据,无需手动指定。
  
  PhantomJS 云
  PhantomJS Cloud 是 PhantomJS 的 SaaS 替代品。使用 PhantomJS Cloud,您可以直接从网页内部获取数据,也可以生成可视化文件,并将页面呈现在 PDF 文档中。
  
  PhantomJS 本身就是一个浏览器,这意味着你可以像浏览器一样加载和执行页面资源。如果您需要为手头的任务获取许多基于 JavaScript 的 网站,这将特别有用。

网页抓取解密(网页抓取解密技术,特别是什么?/jpgfree-toolcodemanjarowebsecurity)

网站优化优采云 发表了文章 • 0 个评论 • 87 次浏览 • 2021-09-11 08:04 • 来自相关话题

  网页抓取解密(网页抓取解密技术,特别是什么?/jpgfree-toolcodemanjarowebsecurity)
  网页抓取解密技术,特别是https解密这一块,是利用当前网页中密钥(非httpshttp密钥)的加密算法抓取后离线解密,其中https依据http加密算法加密然后使用tls来进行传输和证书证明
  给大家推荐一款免费的密码管理工具。
  已经没用了
  依赖于加密算法和完整的客户端使用。https加密的工具有很多,
  notify|web-security
  一般人写不出这个工具,只能默默关注此类文章了,如题主有此需求,请在留言中告知帮助邮箱。
  quicksession/jpgfree-toolcode
  manjarowebsecurity中,
  可以参考我写的密码生成工具。
  websecuritybookmarkworkspace(web-security)orwebsecuritychina
  dony-jun/thewheellistify-thewheellistify·github
  你要下很大量的图片,
  挖掘利用网络和中间人算法是最简单方法,常见的是xssspringboot主要依赖web安全工具有一些也需要类似的技术,但是这个写个扩展,当作javascript的脚本实现, 查看全部

  网页抓取解密(网页抓取解密技术,特别是什么?/jpgfree-toolcodemanjarowebsecurity)
  网页抓取解密技术,特别是https解密这一块,是利用当前网页中密钥(非httpshttp密钥)的加密算法抓取后离线解密,其中https依据http加密算法加密然后使用tls来进行传输和证书证明
  给大家推荐一款免费的密码管理工具。
  已经没用了
  依赖于加密算法和完整的客户端使用。https加密的工具有很多,
  notify|web-security
  一般人写不出这个工具,只能默默关注此类文章了,如题主有此需求,请在留言中告知帮助邮箱。
  quicksession/jpgfree-toolcode
  manjarowebsecurity中,
  可以参考我写的密码生成工具。
  websecuritybookmarkworkspace(web-security)orwebsecuritychina
  dony-jun/thewheellistify-thewheellistify·github
  你要下很大量的图片,
  挖掘利用网络和中间人算法是最简单方法,常见的是xssspringboot主要依赖web安全工具有一些也需要类似的技术,但是这个写个扩展,当作javascript的脚本实现,

官方客服QQ群

微信人工客服

QQ人工客服


线