鱼C论坛

 找回密码
 立即注册
查看: 3945|回复: 17

写QQ邮箱登录加密算法时遇到的问题

[复制链接]
发表于 2016-5-31 08:55:17 | 显示全部楼层 |阅读模式
100鱼币
准备写一个登录QQ邮箱的小程序,腾讯对登录密码的加密算法是用js实现的,本来想用pyv8直接在python中执行js算出密码,奈何用pip装了几次都不成功,遇到各种问题,于是决定直接用python重写,就遇到了下面的问题,困扰了我一天一夜,觉得自己已经掉进思维的陷阱了,头已经大的不行了,特来求助.

先看代码:
  1. s = '0000000096c73e97'
  2. s1 = '\x00\x00\x00\x00\x96\xc7\x3e\x97'

  3. lst = []
  4. i = 0
  5. while i < len(s):
  6.     lst.append('\\x' + s[i:i+2])
  7.     i += 2

  8. s2 = ''.join(lst)

  9. print(s1)
  10. print(s2)
  11. print(s1 == s2)
复制代码


s是一个16进制的字符串(从qq号算出来的),现在要每两个字符拿出来和'\x'拼接,预期效果是s1那样,我的python版本是3.5

最佳答案

查看完整内容

楼主真是找对人了 看我的代码 def hextokeyword(string): p=re.compile(".{2}") split = p.findall(string) words=bytes() for x in split: words = words + struct.pack("B",int(x,16)) words = str(words,"utf-8") return words s= "E4B881" s=hextokeyword(s) print(s) 结果是 丁 如何把 "丁"转为 "E4B881"呢 import binascii ,re def ke ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-5-31 08:55:18 | 显示全部楼层
楼主真是找对人了
看我的代码
        
def hextokeyword(string):
    p=re.compile(".{2}")
    split = p.findall(string)
    words=bytes()
    for x in split:
        words = words + struct.pack("B",int(x,16))
   
    words = str(words,"utf-8")
    return words

s= "E4B881"

s=hextokeyword(s)

print(s)

结果是 丁

如何把 "丁"转为 "E4B881"呢




import binascii ,re

def keywordtohexstr(keyword):
        return str(binascii.b2a_hex(keyword.encode('utf-8')),"utf-8")

keywordtohexstr(“"E4B881”)
我也弄了一天才弄出来的,昨天刚见到这个问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-5-31 12:57:54 | 显示全部楼层
想不明白呀,为什么你也会用py的最新版本呢?!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-5-31 15:33:40 | 显示全部楼层
lst.append('\\x' + s[i:i+2])  这个的时候 其实改变的str加入的就是\\x了。。。。
只是print出来的时候  打印显示的是反斜杠\转译之后的
所以s1='\x00\x00\x00\x00\x96\xc7\x3e\x97'
s2='\\x00\\x00\\x00\\x00\\x96\\xc7\\x3e\\x97'

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-5-31 20:10:24 | 显示全部楼层
  1. import requests

  2. s = '0000000096c73e97'
  3. s1 = r'\x00\x00\x00\x00\x96\xc7\x3e\x97'
  4. news = []

  5. list(map(lambda x: x%2 and news.append(r'\x'+s[x-1:x+1]), range(len(s))))

  6. news = ''.join(news)
  7. print(news==s1)
  8. cookies = {
  9.         'x': news
  10. }

  11. requests.get('http://bbs.fishc.com/thread-72455-1-1.html', cookies=cookies)
复制代码


在纠结s不等于s1么。

用\\x或者r'\x'都是可以的,不过为啥之前不等于s1呢,那是因为你没给s1加r,也没转义\,python给解析了,所以数据不一样。
你抓包看一下不加r的s1,和加r的s1发送的数据就可以了。

处理后的s。
360截图20160531202225675.jpg
不加r的s1。
360截图20160531203040489.jpg
加r的s1。
360截图20160531203139055.jpg

处理后的s与加r的s1是一样的。

3.4测试, 3.5应该也是可以的。
2.x如果要用的话map不用加list处理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-5-31 21:20:29 | 显示全部楼层
本帖最后由 Looker 于 2016-5-31 21:29 编辑

##暴力破解方法
s = '0000000096c73e97'
s1 = '\x00\x00\x00\x00\x96\xc7\x3e\x97'

strtemp = ''
for i in range(0, len(s)-1, 2):
    if s[i:i+2] == '00':
        strtemp += '\x00'
    if s[i:i+2] == '96':
        strtemp += '\x96'
    if s[i:i+2] == 'c7':
        strtemp += '\xc7'
    if s[i:i+2] == '3e':
        strtemp += '\x3e'
    if s[i:i+2] == '97':
        strtemp += '\x97'
    ###......
    ###......
    ###......
    ###暴力破解16 * 16 = 256条if语句,外加一条else语句用于判断溢出
    ###......
    ###......
    ###......
print(s1)
print(strtemp)
print(s1 == strtemp)
4]]C6BAPTK()KSI~4$7L2[B.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-5-31 22:28:34 | 显示全部楼层
666+
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-5-31 22:54:52 | 显示全部楼层
wei_Y 发表于 2016-5-31 20:10
在纠结s不等于s1么。

用\\x或者r'\x'都是可以的,不过为啥之前不等于s1呢,那是因为你没给s1加r,也 ...

是我的表达能力有限,所以一般很少问问题,不是在纠结s不等于s1,而是s1不等于s2,因为s2,是用'\x'拼接的,算md5的时候,结果不同,不过问题已经解决了,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-5-31 22:56:34 | 显示全部楼层
~风介~ 发表于 2016-5-31 12:57
想不明白呀,为什么你也会用py的最新版本呢?!

我也发现了,新版本好多问题不容易解决,而且网上也不好找答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-5-31 22:57:25 | 显示全部楼层
阿狸爱吃鱼 发表于 2016-5-31 15:33
lst.append('\\x' + s)  这个的时候 其实改变的str加入的就是\\x了。。。。
只是print出来的时候  打印显 ...

我纠结的不是为什么不一样,而是怎么能让他们一样,已经解决了,谢谢帮忙
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-5-31 23:00:27 | 显示全部楼层
Looker 发表于 2016-5-31 21:20
##暴力破解方法
s = '0000000096c73e97'
s1 = '\x00\x00\x00\x00\x96\xc7\x3e\x97'

已解决,谢谢帮忙
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-1 09:25:02 | 显示全部楼层
挥舞乾坤 发表于 2016-5-31 22:56
我也发现了,新版本好多问题不容易解决,而且网上也不好找答案

这些年来一直用Python3.4.0,无形中避免了好多大坑~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-1 11:22:54 | 显示全部楼层
挥舞乾坤 发表于 2016-5-31 22:54
是我的表达能力有限,所以一般很少问问题,不是在纠结s不等于s1,而是s1不等于s2,因为s2,是用'\x'拼接的,算m ...

额,是我2B了,把s1改变了。
有不用库就可以的方法,
  1. s = '0000000096c73e97'
  2. s1 = '\x00\x00\x00\x00\x96\xc7\x3e\x97'
  3. news = []

  4. list(map(lambda x: x%2 and news.append(rb'\x'+s[x-1:x+1].encode('unicode-escape')), range(len(s))))
  5. news = b''.join(news)
  6. news = news.decode('unicode-escape')
  7. print(news==s1)
复制代码

把原字符串做unicode-escape编码,然后与\x拼接,再用unicode-escape解码即可。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-6-1 15:56:27 | 显示全部楼层
本帖最后由 挥舞乾坤 于 2016-6-1 15:59 编辑
wei_Y 发表于 2016-6-1 11:22
额,是我2B了,把s1改变了。
有不用库就可以的方法,


嗯,这个问题我解决了,我的解决办法是:
  1. s = '0000000096c73e97'
  2. s1 = '\x00\x00\x00\x00\x96\xc7\x3e\x97'
  3. s3 = b'\x00\x00\x00\x00\x96\xc7\x3e\x97'

  4. lst = []
  5. i = 0
  6. while i < len(s):
  7.     lst.append(chr(int(s[i:i+2], 16)))
  8.     i += 2

  9. s2 = ''.join(lst)
  10. print(s1 == s2)
  11. print(s2.encode() == s3)
复制代码


但是解决以后发现从一个坑里跳进了一个更深的坑,python3.x的版本,md5函数,参数必须是bytes,然后问题出现了,对s2,encode,试了n种编码类型,怎么也得不到跟s3一样的字节数据,又不知道怎么给一个变量前面加b前缀(或者b''到底默认使用的什么编码),查了不少资料也没找到给字符串加b前缀使用的是什么函数(也许是内部实现的根本就没函数),最后是用bytearray解决的,但总觉得不是那么好,应该有更好更简单的办法,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-1 17:34:14 | 显示全部楼层
挥舞乾坤 发表于 2016-6-1 15:56
嗯,这个问题我解决了,我的解决办法是:

但是解决以后发现从一个坑里跳进了一个更深的坑,python3.x的 ...


>>> bytes.fromhex(s)
b'\x00\x00\x00\x00\x96\xc7>\x97'
>>> bytes.fromhex(s) == s3
True

--
早说嘛,我之前也遇到这问题。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-6-1 18:21:21 | 显示全部楼层
wei_Y 发表于 2016-6-1 17:34
>>> bytes.fromhex(s)
b'\x00\x00\x00\x00\x96\xc7>\x97'
>>> bytes.fromhex(s) == s3

居然如此简单,连拼接\x都省了,python果然是python
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-1 20:37:40 | 显示全部楼层
挥舞乾坤 发表于 2016-6-1 18:21
居然如此简单,连拼接\x都省了,python果然是python

是啊,python就是简单易用强大~。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-2 19:55:54 | 显示全部楼层
兄弟我的代码是不会错的,我在写pa chong 的时候就见到十六进制字符串,已经把它转让为utf-8文字了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 15:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表