探究软件内部运行的秘密


#1

先来一句问候语:大家开车愉快啊
帖子主讲的是Python其他语言如果觉得可以的话也可以看看

写帖子为了舒心,首先我要声明一下立场:Python是世界上最好的语言

概述:真是学习学魔障了,干什么都想偷窥一下内部运行是什么样子的

今天要说的东西我已经垂涎很久了,今天装vs2015的时候,总是装不上,等待安装,比较闹心,总觉得开着电脑啥也不干也不是那么回事,所有决定再研究一下这个东西

这是一款跨平台的web扫描器,基于B/S的,对,是B/S,是谁我就不说了,怕人家找后账,也正是因为是扫描器,所以觉得发在这里比较合适

(我废话比较多,因为总想叙述完整,叙述完整了又觉得怪怪的,话说写帖子这种东西需不需要叙事,还是直奔主题?求解答)

主题:拖某平台漏洞库(多简单明了)

python -c “exec(import(‘urllib2’).urlopen(‘地址’).read())” -m 5

这个扫描器首先是给你如上的一句代码(地址手动打码),在你的终端执行,然后就会连接上扫描器的服务器,下载扫描的脚本,据介绍,该扫描器完全在内存中运行,不会留下任何痕迹(神器啊)

这样可以防止被查水表

上面的代码官方也给出了解释 -m参数为一个节点最大能接受的目标数,其余就是读取那个地址的东西然后执行,就这么简单,然后我读取了一下这个地址的东西,是如下的这么个玩意

**import **urllib2
tmp=urllib2.urlopen(“地址”).read()
f=open(“1.py”,“w”)
f.write(tmp)
f.close()

这个样子,读取这个地址的东西,然后写入到1.py
然后开始看看1.py的东西是啥

#!/usr/bin/env python
**import **imp
**if **imp.get_magic() != ‘\x03\xf3\r\n’:
**print **"Please update to Python 2.7.3 (http://www.python.org/download/)"
exit()

**import **urllib, marshal, zlib, time, re, sys
**for **k **in **sys._getframe(1).f_code.co_consts:
**if not **isinstance(k, basestring):
**continue
**m = re.match(r"http://\w.]+/?\w]([0-9a-f]{16})"[s], k)
**if **m:
_S = “https”
_B = “地址”
_U = m.group(1)
_C = True
count = 30
**while **_C:
**if **count <= 0:
break
**** try
:
**exec **marshal.loads(zlib.decompress(urllib.urlopen(’%s://%s/bin/core_new’ % (_S, _B)).read()))
except:
time.sleep(240)
count = count - 1
break

[/s]继续打码,根据这个exec又得到一个代码的地址。。好坑
这个扫描器其实我之前逆过他的模块,发现他特别喜欢用marshal来加载对象。。。代码加密,体积还小,一举两得??、
继续找这个地址里的东西。。

在这里我想说一句,marshal.loads会加载一个string到内存成为对象,当然这个string不是说字符串,就是类似于序列化的东西
这个东西你想要搞到源码的话,需要找个逆向python的东东,我用的是uncompyle6的库,就还可以在py里面调用,还可以直接运行,超级方便
[s]
**import **urllib2
**from **uncompyle6.main **import **uncompyle
**import **marshal
**import **zlib
tmp=urllib2.urlopen(“地址”).read()
tmp=zlib.decompress(tmp)
f=open(“2.py”,“w”)
uncompyle(2.7,marshal.loads(tmp),f)
f.close()

[/s]就这个样子,把这个新的地址里面的东西也dump了出来,因为文件太大,所以我就不发了
现在我们有了一个问题,这个文件很大???是的,433KB

看起来这就是这个核心了,而且在内部我还看到了很多似曾相识的解密过的模块,当然,这不是重点,重点在于,这只是个空的框架,用来和服务器通讯,而且乱的一团糟,实在是为了防止破解下了很大的代价,比如我发一段代码[s]

**if **64 - 64:
i11iIiiIii
**if **65 - 65:
O0 / iIii1I11I1II1 % OoooooooOO - i1IIi
**if **73 - 73:
II111iiii
**if **22 - 22:
I1IiiI * Oo0Ooo / OoO0O00.OoOoOO00.o0oOOo0O0Ooo / I1ii11iIi11i
**if **48 - 48:
oO0o / OOooOOo / I11i / Ii1I
**if **48 - 48:
iII111i % IiII + I1Ii111 / ooOoO0o * Ii1I
**if **46 - 46:
ooOoO0o * I11i - OoooooooOO
**if **30 - 30:
o0oOOo0O0Ooo - O0 % o0oOOo0O0Ooo - OoooooooOO * O0 * OoooooooOO

[/s]这究竟是闹哪样???

好了,跳过这些不说,我已经验证了这就是那个核心的模块,但是我并没有看到在哪里下载或者导入的模块,,
这就尴尬了,但是这个模块习惯性的用marshal加载模块来用,,弱点的一逼,,[s]


[/s]魔术方法也没有文件路径,去Python路径里面搜索只有一个marshal.h的文件,简直找不到从良的理由,尝试用各种办法把marshal给dump出来也都不行,这下我方了,,

我现在只知道这货有4个方法,分别是load,loads,dump,dumps,,区别但就是针对文件还是string,,

一个十分恶毒的办法在我心中产生,这货调用marshal的方法??import marshal as dumpsss

class marshall:
@staticmethod
def load(file):
print "load"
return dumpsss.load(file)
@staticmethod
def dumps(values):
print "dumps"
return dumpsss.dumps(values)
@staticmethod
def dump(value,file):
print "dump"
return dumpsss.dump(value,file)
@staticmethod
def loads(strings):
print "loads"
return dumpsss.loads(strings)
marshal=marshall蛤蛤,我给marshal改了个别的名字,,,自己造了个假的类,来骗这个sb

结果就这么被我蒙过去了!!!
[s]

[/s]卧槽,真的被我蒙过去了。。。

这么说真的是用marshal的loads加载模块。。开心,而且每次的数据也都会经过我的手里,,,

又是和dump黄图一个套路,一个count,然后自增,我就发现个事,这个count居然好多次都重复了!!!

吓得我赶紧用多线程的锁,然后加入了数组,按个提取保存(这办法比上次正则还蠢。。)
[s]
count = 0
**from **uncompyle6.main **import **uncompyle

modules=]
**def **preload_module(strings):
**global **count
count+=1
**print **count
try:
f=open(“m/”+str(count)+".bak",“wb”)
f.write(strings)
f.close()
uncompyle(2.7,dumpsss.loads(strings),open(“m/”+str(count)+".py",“w”))
except:
**print **“Error”

lock = threading.Lock()
**def **run_thread():
**while **True:
lock.acquire()
try:
a=modules.pop(0)
preload_module(a)
except:
pass
**** finally
:
lock.release()
t1 = threading.Thread(target=run_thread)
t1.start()
**class **marshall:
@staticmethod
**def **load(file):
**return **dumpsss.load(file)
@staticmethod
**def **dumps(values,versions=None):
**return **dumpsss.dumps(values)
@staticmethod
**def **dump(value,file,version=None):
**return **dumpsss.dump(value,file)
@staticmethod
**def **loads(strings):
modules.append(strings)
**return **dumpsss.loads(strings)
marshal=marshall

[/s]最后的代码就是这样了,一句话总结就是,模块劫持

顺便解释一下这个段代码,我劫持了这个marshal的sb模块,,然后自己造了一个一毛一样的,这个程序每次加载模块都是用marshal.loads加载的,每次都会乖乖的把解密后的对象发给我,,让我写得这个冒牌货加载,,我只要负责保存就好,为了防止出错直接保存到数组(人家框架也是多线程的),然后如果有就会读取,,解密,保存,,,我看有些好像解密出错了,然后就保存了对象直接到bak文件里面

好了,我只能说这么多了,再说被抓到就真的要被打死了

秀一下成果[s]


[/s]看了一下模块,好像总共有一千三百五十个,我这个多是因为备份文件也算了,实际就七百多插件,剩下没dump下来是因为程序运行到一半就死掉了,我也不知道为毛


#2

:@搞毛啊,删除线是闹哪样


#3

毛帖子,不明觉厉


#4

就是个B/S的扫描器,然后通过他给的一句代码,dump出来所有的扫描插件