专业找人企业收费标准-从零开始学Fuzzing系列:浏览器fuzz工具探究之框架篇
0×00写在前面
磨刀不误砍柴工,工欲善其事。小编搜集了近些年Github、Googlecode、SourceForge等网站公布的30尾款浏览器系统漏洞发掘工具,除类似反复外,基本上包含了全部已公布的开放源代码项目,尽量构建自然环境使用、阅读文章源代码、查看材料,弄清了在其中选用的技术性基本原理,基本产生了这篇半描述方式的数据分析报告。
期待根据这篇小敏,能与大伙儿相互领略到老前辈们在浏览器系统漏洞fuzz这一方位上留有的踪迹与聪慧。
备注名称:启明星辰刘永军教师的《浏览器fuzz框架介绍》已对一部分工具开展过详细介绍,写作简约,非常值得捧读。由于全文涉及到工具的详尽完成较少,故编写此篇以作填补梳理,期待能向怎样变为一个手机 *** 黑客大伙儿呈现当今浏览器fuzz工具开发设计的理论依据,以供学习培训讨论。
0×01筛选
涉及到的全部fuzz工具目录以下,若有很感兴趣的朋友,请Google之:
这种工具中,有的偏重于浏览器fuzz框架的设计方案,有的偏重于网页页面样版的形成对策。例如:
框架类:bamboo.js BFuzzer grinder cross_fuzz x-fuzzer
对策类:nduja fileja
综合性:clusterfuzz 怎样变为一个手机 *** 黑客 funfuzz chromefuzzer ajaxdemolisher lithium
在其中Google精英团队的clusterfuzz称得上一套健全的分布式系统fuzz系统软件,对外公布源代码,只有从在网上公布的使用说明书窥视一二,十二年已布署了百台vm虚拟机另外fuzz,容许內部使用人递交fuzzer软件;Firefox团队的funfuzz(包括jsfunfuzz和DOMFuzz)也极具危害。迫不得已提的是,中国启明星辰精英团队demi6od大神开发设计的chromefuzzer,也极具出色的系统漏洞发觉工作能力(demi6od本人数次得到 了微软公司和Google的论文致谢)。
这种工具在关键框架的基本上,都提升了遍布式调度、自定fuzz对策、样版精减等特点,工程量清单极大,待小编科学研究深入后共享出去。今日关键向大伙儿详细介绍侧重于fuzz框架设怎样变为一个手机 *** 黑客计的五个基本工具的完成。
从实质上讲,浏览器fuzz框架必须处理下列好多个至关重要的问题:
1.随机样本的形成
2.浏览器过程监管
3.Crash样版储存
因为开发人员思索视角不一样,每一个框架在这种难题的解决上,或许相近,或许不一样。下边详细描述之。
0×02 Bamboo.js
它是一款在Fuzz高效率和可靠性都有一定的兼具的DOM Fuzzer,选用ruby語言融合Javascript互相配合,具备下列特性:
a.The fuzzing scope contains DOM level 1,2 and 3
b.The main module triggers semi-random 怎样变为一个手机 *** 黑客 object modifications and creates insecure references
c.Other modules can be added easily
d.Reliable logging by using WebSockets
e.Supported targets
新项目源码的文件目录构造以下:
bamboo.htm
bamboo.js
config.js
modules
-tickle_references.js
server.rb
helper.js
历经整理获知,该框架的关键步骤如下图所显示:
怎样变为一个手机 *** 黑客
Bamboo更先形成任意开展DOM实际操作的Javascript句子,将其储存为字符串数组发送到服务器端,由服务器端依据该字符串数组组成为一个详细的网页页面样版(储存为log文件)。
随后借助WebSocket通讯将该网页页面样版从服务器端回到至浏览器过程,由bamboo.js将该网页页面取值给一个事前结构的iframe标识,进而做到载入实行网页页面样版的目地。
若检测全过程中,网页页面样版造成 浏览器过程奔溃,则能够判断服务器端当今近期储存的log文件即是造成 Crash的系统漏洞样版;若不奔溃,浏览器过程会依据SetTimeout设置的间隔时间,再次开展所述样版形成和iframe载入实行的fuzz全过程。
样版字符串数组的形成实际由modules/*.js进行,官方网源代码内置的tickle_references.js插件一部分摘抄以下:
function 怎样变为一个手机 *** 黑客 fuzzOwnReferences(count)
{
......
//R(2)和R(97)等涵数为随机数函数,能够形成0~N-1中间的随意整数金额。
if(r(2)>0)
payload = 'getRandomObject(' r(97) ').appendChild(e_1);\ ';
else
payload = 怎样变为一个手机 *** 黑客 'document.body.appendChild(e_1);\ ';
由上获知,本框架适用自定样版形成对策,使用人能够撰写自定fuzz对策的软件置放在Modules文件目录。
浏览器和服务器端选用WebSocket开展通讯。Bamboo.js向服务器端Server.rb推送形成的字符串数组,并接受服务器端回到的网页页面样版:
function wsSwap(data)
{
ws = new WebSocket("ws://" host ":5678");
ws.onclose = function(evt){}
ws.onerror = 怎样变为一个手机 *** 黑客 function(evt){}
ws.onopen = function(evt){
ws.send(data);
}
ws.onmessage = function(evt){
createBuffer(evt.data)
}
}
Server.rb关键功效是,将接受的字符串数组组成为详细的网页页面样版并储存为bamboo.log,随后意见反馈至浏览器过程:
def generate_template
in_file = File.read("template.dat")
return "" in_file
end
EM.run do
WebSocket::EventMachine::Server.start(:host => "0.0.0.0", :port => 10933) do |ws|
ws.onmessage do |data, type|
chunk =[generate_template "\ \ "]
File.open("bamboo.log", "w"){ |f| f.write(chunk[0]data chunk[1]) }
ws.send Base64.encode64(chunk[0]怎样变为一个手机 *** 黑客 data chunk[1]), :type => type
end
end
end
浏览器过程接受的网页页面样版交给iframe标识载入实行:
//Bamboo.js
function createBuffer(data)
{
document.getElementById('buffer').src = 'data:text/html;base64,' data;
}
//Bamboo.htm
现阶段Bamboo框架缺乏浏览器过程奔溃检验控制模块,出現Crash后需手动式重新启动浏览器再次fuzz,自动化技术水平有待提高。
0×03 怎样变为一个手机 *** 黑客 BFuzzer
BFuzzer是中国蓝海源精英团队的Hikerell选用Python开发设计的一款浏览器fuzz框架。
这款框架有别于Bamboo.js的地区取决于,它将随机生成Javascript句子(任意开展DOM实际操作)的每日任务交到了Python脚本 *** 来进行。浏览器向服务器端申请办理网页页面样版,服务器端在接到要求后,由Python随机生成开展DOM实际操作的网页页面样版,意见反馈给浏览器过程载入实行,其关键fuzz逻辑性如下图:
框怎样变为一个手机 *** 黑客架选用pydbg监管浏览器过程是不是发现异常或奔溃。每一次fuzz循环系统都是会启用浏览器过程载入样版网页页面,若浏览器过程无异常,则强制性杀死进程,进到下一次循环系统。非常容易获知,那样的fuzz循环系统因过程启用经常会导致用时很久。
备注名称:可考虑到一次循环系统按顺序载入好几个网页页面样版做为整改措施,仅仅必须尤其注意因好几个网页页面相互功效导致浏览器过程发现异常或奔溃这一情景下Crash样版的储存与复原。
该新项目源码的文件目录构造(python2.7撰写)以下:
Server.py
rGener
-fuzz.py
-templater.py
Monitor.py
Fuzzutil
-Crasher.py
为怎样变为一个手机 *** 黑客确保逻辑性简约,该框架在完成上区划为Monitor.py和Server.py两一部分。
Server.py:服务器端,只承担样版网页页面的形成与意见反馈
Monitor.py:监控,承担Fuzz循环系统、过程启用和URL载入、出现异常监管等
总体完成基本原理如下图:
Server.py只承担为浏览器要求出示任意网页页面样版,并为监管过程要求出示近期形成的网页页面用以Crash样版储存:
class 怎样变为一个手机 *** 黑客 FuzzRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def do_GET(self):
global curHTML
if 'next' in self.requestline: # 解决随机生成样版要求
curHTML = fuzz.getNext()
self.send_response(200)
self.wfile.write(curHTML)
elif 'cur' in self.requestline : # 处理Crash样本请求
self.send_response(200)
self.wfile.write(curHTML)
其中fuzz.getNext会调用rGener目录中的fuzz.py和templater.py,用以随机生成网页样本的内容:
def 如何变成一个手机黑客 node_add_by_applyElement(self, id_child, id_parent):
r = random.randint(0,3)
if r<2:
cxt = "document.createElement('"+random.choice(HTMLs[1:])+"')"
return cxt+".applyElement("+id_parent+");"
else:
return id_如何变成一个手机黑客child+".applyElement("+id_parent+");"
最终得到的网页样本则会返回给浏览器进程加载执行。
Monitor.py是该框架的主逻辑,主要负责调用浏览器进程去访问http://host:port/init(init会跳转到http://host:port/next获取样本):
class moniter():
def run(self):
while 1:
os.system('taskkill /T /F /IM '+ self.cf.image + '> logs/null')
time.sleep(3)
dbg 如何变成一个手机黑客 = pydbg.pydbg()
dbg.load(self.cf.targetpath, command_line=self.InitPage)
time.sleep(1)
dbg_browser = self.crasher.hook(dbg)
if dbg_browser!=None:
dbg_browser.run()
dosfile = self.cf.logspath + '\\dos-' + hashlib.md5(str(datetime.now())).hexdigest() + '.html'
dosurl = 'http://'+self.cf.host + ':' + 如何变成一个手机黑客 self.cf.port + '/cur'
urllib.urlretrieve(dosurl, dosfile)
Monitor在fuzzutil目录中的crasher.py完成了pydbg的监控逻辑。首先将pydbg附加到符合条件的iexplore.exe进程:
class crasher():
def hookIE(self, dbg):
loadpid = dbg.pid
dbg.detach()
dbg = pydbg()
dbg.cf = self.cf
pattern = r'iexplore.exe\s*([0-9]*)\s*Console'
count = 如何变成一个手机黑客 0
while count<=1:
p = os.popen('tasklist|find "iexplore"')
pids = re.findall(pattern, p.read())
count = len(pids)
for pid in pids:
if loadpid == int(pid): # 注意这里
continue
try:
dbg.attach(int(pid))
dbg.set_callback(EXCEPTION_ACCESS_VIOLATION, deal_accessv)
return 如何变成一个手机黑客 dbg
except Exception, e:
return None
为什么这里说是符合条件呢?这里面包含了一个小技巧。作者调用pydbg的顺序是这样的:
pydbg.load
pydbg.detach
pydbg.attach
pydbg.setcall_back
注意上面的逻辑,展现了作者调用pydbg的思维。熟悉IE进程调用方式的童鞋可能了解,x64下的IE浏览器会通过一个64位的IE进程打开一个32位的IE进程去加载实际的网页内容(在任务管理器中会存在两个iexplore.exe进程)。一般情况下造成异常或崩溃的进程通常都是那个32位的进程,并不是pydbg.load获得的x64位IE进程的PID。
作者这样做是为了能attach到正确的进程,以便能获得正确的现场快照。
然后是处理EXCEPTION_ACCESS_VIOLATION异常的流程:
def 如何变成一个手机黑客 deal_accessv(dbg):
if dbg.dbg.u.Exception.dwFirstChance:
return DBG_EXCEPTION_NOT_HANDLED
crash_bin = utils.crash_binning.crash_binning()
crash_bin.record_crash(dbg)
name = hashlib.md5(str(datetime.datetime.now()如何变成一个手机黑客)).hexdigest()
crashfile = dbg.cf.logspath + '\\crash-'+name+'.txt'
f = open(crashfile, 'w')
f.write(crash_bin.crash_synopsis())
f.close()
pocfile = dbg.cf.logspath + '\\poc-' + name + '.html'
pocurl = 'http://'+dbg.cf.host + ':' + dbg.cf.port + '/cur'
urllib.urlretrieve(pocurl, 如何变成一个手机黑客 pocfile)
dbg.terminate_process()
return DBG_EXCEPTION_NOT_HANDLED
将通过http://host:port/cur请求得到的POC样本和pydbg得到的Crash现场信息分别保存。
BFuzzer框架模块之间低耦合,使用者可以通过修改template.py生成自定义网页样本内容,初步具备了自动化Fuzz的能力,当然还有很多需要优化的地方。
0×04 如何变成一个手机黑客Grinder
Grinder可以说是最广为人知的浏览器Fuzz框架了,采用ruby语言编写,著名的nduja、fileja等工具的自动化部署默认都以它作为支撑环境。相对精简的Crash样本、优秀的分布式能力使其得到了很多使用者的喜爱。但熟悉它的人肯如何变成一个手机黑客 定对它又爱又恨,因为时常会出现某些Crash无法重现的情况。下面我们结合之前写的文章讲解一下Grinder架构,或许你就能明白无法复现的原因了。
该项目源代码的目录结构如下:
node
-browser
chrome.rb
firefox.rb
internetexplorer.rb
safari.rb
-core
debug
debugger.rb
debuggerexception.rb
heaphook.rb
hookedprocess.rb
logger.rb
processsymbols.rb
configuration.rb
crypt.rb
debugger.rb
logging.rb
server.rb
webstats.rb
xmlcrashlog.rb
-crashes
-data
-fuzzer
*.html
-lib
meta ***
-source
--部分dll的源码
config.rb
crypto.rb
grinder.rb
reduction.rb
testcase.rb
如何变成一个手机黑客server
--主要用于分布式节点的漏洞结果汇总,这里不再详述
在使用时分为两部分,node节点和server端。
node:负责Fuzz的主逻辑
server:负责所有节点的结果收集
这里的Server端是为分布式挖掘建立的集中管理服务器。如果只想单机进行挖掘,只运行node目录下的相关脚本即可。
node节点开始fuzz的命令为:
ruby grinder.rb [--config=config.rb] --browser=BROWSER
如果fuzz过程中出现Crash,则会在Crashes目录生成记录样本信息的*.log文件和记录崩溃现场的*.crash文件。若提前在config.如何变成一个手机黑客rb中指定了用于上报漏洞的Server网址,则在发现Crash后会将上述文件上报至Server端。config.rb中关于上报至Server端的网址配置示例如下:
# Configure any remote grinder web server to record crashes...
# Set to nil to disable this feature.
# Note: dont specify the http/https part.
$webstats_baseurl = '192.168.1.1/status.php'
在后续漏洞分析之前,使用testcase.rb将*.log转换为网页样本:
ruby 如何变成一个手机黑客 testcase.rb [--config= config.rb] --log=*.log --save=*.html
上述就是Grinder基本使用过程。通俗来讲,Grinder的fuzz流程和BFuzzer类似,通过专门的调度进程负责启动、监控被测浏览器,专门的WEB服务器为每次fuzz提供网页样本。
备注:该WEB服务运行于node节点本机,与用于分布式的Server不同
Grinder的核心在于网页样本的生成方式和Crash样本的恢复。Bamboo.js和BFuzzer本质上网页样本都是由WEB服务器静态提供的,也就是说浏览器每次加载执行的网页样本都是在服务端生成反馈过来的,而Grinder不同,它是先从服务端得到网页模板,后续在浏览器加载模板期间,动如何变成一个手机黑客态生成网页样本并执行的。
下面以一个精简的网页模板作为解释。
这是一个对DOM元素属性进行随机赋值以测试是否存在漏洞的样本生成策略,其中rand_item是一个随机化函数,可以随机得到指定数组的元素值。
对于Bamboo和BFuzzer而言,无论使用Javascript字符串还是Python脚本,WEB服务端最终都会生成一个类似于下述网页内容反馈给浏览器用于加载执行:
可以发现,原模板中涉及rand_item随机函数部分都被替换为了实际的某个元素和属性值。浏览器从服务端得到的是一个具体的网页样本,每次循环得到的都不同:
但Grinder不同,Grinder调用的浏览器从WEB端得到的仍旧是携带rand_item随机函数的网页模板:
只不过在Grinder服务端使用的网页模板比原模板多了必要的logger.log语句:
logger.log最终调用的是Javascript中的parseFloat函数。
Grinder通过向浏览器进程中注入grinder_logger.dll,进而hook住Javascript中的parseFloat函数。这样在调用logger.log时,grinder_logger.dll设置的hook回调函数如何变成一个手机黑客就可以记录下来其内容,并存储为log文件。比如:
logger.log("document.all[0].appendChild(elem);","ndujaLogger",1);
就可以将下列Javascript语句:
document.all[0].appendChild(elem);
完整记录在log文件中。上述网页模板某次执行时,记录的日志格式类似于:
1
ndujaLogger
elem = 如何变成一个手机黑客 document.createElement(“button”);
1
2
ndujaLogger
elem.setAttribute(“id”,”move”);
1
3
ndujaLogger
document.all[0].appendChild(elem);
1
如果fuzz过程中引起了异常,Grinder则会将本次执行网页模板得到的log信息存储起来,通过testcase.py即可将log信息恢复为具体的网页。上述log信息会恢复成如下网页:
Grinder的精妙之处就在于,将执行的Javascript语句序列动态地通过进程注入记录了下来。当然,技术难点肯定在于对parseFloat函数的hook操作。IE的ParseFloat函数位于jscript9.dll,Firefox早期版本的ParseFloat函数位于mozjs.dll。作者是借助于symbols符号文件来定位该函数的存在的。
这种动态注入的方式,对浏览器进程fuzz稳定性的影响也受到了质疑,有可能是进程注入导致浏览器更加容易崩溃,而不是网页模板导致的。开发Grinder插件的关键也在于对logger.log的正确使用,如果记录的内容和原来执行的内容有出入,就很容易出现无法重现的情况。但无论如何,Grinder还是非常优秀的。如何变成一个手机黑客
0×05 X-Fuzzer
X-Fuzzer可以说是框架类fuzz工具里面最轻量级的了,其源码文件只有两个:
fuzzer.html(加载x.js)
x.js(主文件)
但这个工具到底该如何使用,倒是让笔者好好琢磨了一阵子。先看一下它的运行界面:
该工具可以对x.js中包含的150余个标签的属性进行随机赋值,以测试是否有漏洞。fuzz操作可分为Start和Auto、Spray和Spray-n-Auto、如何变成一个手机黑客internode和internode-n-Spray三组。Start和Spray每次fuzz只对单个标签进行赋值,而其余四个都会将所有标签遍历。Start和Spray的不同在于,对属性赋值内容是不同的类型。这里不再详述。
该框架比较有特点的就是,采用document.cookie记录日志信息,采用localStorage在本地存储最近一次fuzz操作的必要信息(假设浏览器崩溃的话,可以根据这些必要信息恢复样本),与grinder中logger.log的作用类似。
备注:从本地调用IE打开网页是不支持localStorage的,必须采用web方式打开网页,测试时需注意。浏览器也不能设置为“退出后清空浏览历史,否则存储的localStorage会被清空”。
目前该工具只是提出了一种优秀的fuzz思想,还不具备自动化fuzz能力。前段时间绿盟公开的NBFuzz框架就是借助了localStorage和XMLHttpRequest特性,和上面几款框架的核心思想类似。
备注:NBFuzz可以通过Websocket代替XMLHttpRequest,则其适用性会更好。
0×06 如何变成一个手机黑客 如何变成一个手机黑客 cross_fuzz
和上述几个框架都不太相似的是,cross_fuzz实质上强调的是一种递归式的浏览器fuzz策略思想,其经典的递归和随机DOM操作可以说对浏览器挖掘产生了深远影响。
其源码目录如下:
cross_fuzz_msie_randomized_seed.html
cross_fuzz_randomized_20100729_seed.html
cross_fuzz_randomized_20110105_seed.html
cross_fuzz_randomized_20110105_seed_TEST.htm
linktocrossfuzz.html
logo.jpg
mersenne.js
-targets
lolcat.jpg
target.html
target.svg
target.xml
target.xul
target2.html
target_strict.html
target_strict2.html
target_xhtml.xhtml
text6.swf
该工具的使用 *** 是,浏览器打开主文件cross_fuzz_randomized_*.html,它会随机调用targets目录中两个HTML、XHTML或SVG文档,并根据下面的算法进行fuzzing操作。下面借助于翻译一起欣赏该工具的算法细节:
The 如何变成一个手机黑客 fuzzer owes much of its efficiency to dynamically generating extremely long-winding sequences of DOM operations across multiple 如何变成一个手机黑客 documents, inspecting returned objects, recursing into them, and creating circular node references that stress-test garbage collection mechani *** s.
该模糊器的高效性在很大程度上归功于通过多文档动态产生随机化的冗长的DOM操作序列,检查返回的对象,对其进行递归,并创建用于对垃圾回收机制进行压力测试的循环节点引用。
该框架的fuzzing算法细节如下:
1.Open two windows with documents of any (DOM-enabled) type. Simple HTML, XHTML, and 如何变成一个手机黑客 SVG documents are randomly selected as targets by default - although any other, possibly plugin-supported formats could be targeted instead.
打开两个任意文档类型(启用DOM)。默认会随机选择简单的HTML、XHTML和SVG文件,当然其它一些插件支持的格式也可以针对性地替代。
2.Crawl DOM hierarchy of the first document, collecting encountered object references for later reuse.Visited objects and collected 如何变成一个手机黑客 references are tagged using an injected property to avoid infinite recursion; a secondary blacklist is used to prevent navigating away or descending into the master window. Critically, random shuffling and recursion fanout control are used to ensure good coverage.
抓取之一个文档的DOM层次结构,收集遇到的对象引用以备后续使用。访问到的对象和收集的引用会被标记一个注入的属性来避免无限递归;还有一个黑名单列表来防止网页窗口导航离如何变成一个手机黑客当前开页面或转到主窗口。重要的是,随机打乱对象引用的序列并递归调用控制可以确保良好的覆盖率。
3.Repeat DOM crawl, randomly tweaking encountered object properties by setting them to a one of the previously recorded references (or, with some probability, to one of a handful of hardcoded "interesting" values).
重复DOM抓取操作,调整遇到的对象属性,将其设置为一个先前记录的引用(或者以一定概率设置为一个硬编码的有趣的数值)。
备注:如何变成一个手机黑客这些硬编码的有趣数值,被预置在HTML文档中的数组。
4.Repeat DOM crawl, randomly calling encountered object methods. Call parameters are synthesized using collected references and "interesting" values, as noted above. If a method returns an object, its output is subsequently crawled and tweaked in a similar manner.
重复DOM抓取,随机调用遇到的对象 *** ,使用收集的引用和上述有趣数值作为调用参如何变成一个手机黑客数。如果一个 *** 返回了一个对象,那么这个对象随后会被抓取,并以上述类似方式作调整。
5.Randomly destroy first document using one of the several possible methods, toggle garbage collection.
使用一些可能的 *** 随机破坏之一个文档,并切换至垃圾回收。
6.Perform the same set of crawl & tweak operations for the second document, but use references collected from the first document for overwriting properties 如何变成一个手机黑客 and calling methods in the second one.
对第二个文档实施同样的抓取和调整操作,但不同的是,使用从之一个文档收集的引用来覆盖第二个对象的属性,并在第二个文档中调用这些对象的 *** 。
7.Randomly destroy document windows, carry over a percentage of collected references to the next fuzzing cycle.
随机破坏文档窗口,将收集的引用沿用到下一个fuzzing循环。
细细品味cross_fuzz的思想后,深深地被折服,只能说作者太强大了。当然,目前cross_fuzz只是一个演示性的功能模块,需要实现日志记录、异如何变成一个手机黑客常监控等部分。
0×07 总结
由上可知,浏览器fuzz框架的关键在于随机样本的生成和崩溃样本的记录两者的权衡上。或许看完这篇小文,有童鞋可以结合它们的利弊,写出来一个更好的框架,所以,请期待morph v0.3吧。
*原创作者:walkerfuz,本文属FreeBuf原创奖励计划文章,未经许可禁止转载
汉化有问题吧。htr。萨嘎短发光度法个。专业找人公司收费标准
黑客技术 *** 交流群。目前社会工程学攻击已经到了只要你熟练掌握,就可以黑遍全世界的程度。那些互联网公司比想象中要脆弱,稍微懂得使用搜索引擎,“收集 *** 息定向。
专业找人公司收费标准有一定的风险。因为一般人的电脑用着盗版系统,甚至有不良的上网习惯,如何变成一个手机黑客所以电脑很容易中毒,假如中毒,电脑就有被远程控制的风险。即使电脑没有发现病毒,我觉得吧,如果你不是电脑高烧的话是肯定看不出来的,要是你一眼看出来了,那黑客还做个什么劲,而且现在有些木马不止人看不出,连杀毒软件都看不出。
电影最后没有明确答复,不过先知对小女孩说我们还能再见到尼奥.不过我认为即使他没死,系统的下一任救世主也将不是他了.
很好理解啊,就和奥运会一样,不同的项目不同的冠军,你不能说游泳冠军和射击冠军,到底哪个才是真正的奥运冠军吧。 两个团队说的都是真的,360今年之一。专业找人公司收费标准
个人认为是骗局,小心为妙,如果对方先要收取费用,一定要慎重,有些骗局先收取一点小钱,然后一步步骗你交更多的钱!
专业找人公司收费标准可以,但功击了又有什么用如何变成一个手机黑客呢,损人不利己。
标签:
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。