创建或修改目录:/www/wwwroot/104.219.215.234/data 失败!
cccc77 [原创]VB 分享软件防破解遐想技艺初探(三)更新-软件逆向-看雪-安全社区|安全招聘|kanxue.com - 洋萝莉系
cccc77 [原创]VB 分享软件防破解遐想技艺初探(三)更新-软件逆向-看雪-安全社区|安全招聘|kanxue.com

栏目分类
色人阁26uuu

你的位置:洋萝莉系 > 色人阁26uuu > cccc77 [原创]VB 分享软件防破解遐想技艺初探(三)更新-软件逆向-看雪-安全社区|安全招聘|kanxue.com

cccc77 [原创]VB 分享软件防破解遐想技艺初探(三)更新-软件逆向-看雪-安全社区|安全招聘|kanxue.com

发布日期:2024-10-02 08:02    点击次数:167

VB 分享软件防破解遐想技艺初探(三)×××××××××××××××××××××××××××××××××××××××××××××× 其他著作快速通顺: VB 分享软件防破解遐想技艺初探(一) ?t=72050 VB 分享软件防破解遐想技艺初探(二) ?t=72204××××××××××××××××××××××××××××××××××××××××××××××作家:爱琴海[SCG] 2008/09/10 (转载请保留该信息) 第一篇我粗拙的讲了以下几个内容: 1、        文献竣工性,负责被违纪修改 2、        运行时的校验,负责被LOADER 3、        反调试,负责动态追踪和挂接 4、        防静态反汇编分析 5、        注册码系统(算法部分,中枢内容) 6、        加壳防脱壳 7、        躲避性遐想 8、        别具肺肠 第二篇我翔实得考验了以下内容: 1、遐想念念想:水桶旨趣 2、竣工性校验,包括VB-CRC32打针器和主体的编写;文献修改时候自校验;文献大小自校验等 3、防LOADER遐想,包括查找标题,经典时值,还有要点的“夺门而出”反LOADER 上节课我忘讲了种常见的反LOADER的方法:开释设施法(借鸡生蛋) 这里飞快补上: 开释设施法(借鸡生蛋) 旨趣:讲需要保护的设施作为自界说资源添加到新的VB设施里,新设施一运行就自动开释里面包含的设施到特定位置,然后通过SHELL调用,自己则收尾运行,怀疑就是“借鸡生蛋”,亦然常用的木马病毒免杀技艺。 掀开VB6.0 新建工程,然后单击“外接设施”――“外接设施顾问器”――“VB 6 资源裁剪器”,在右下角选项里遴聘“加载/卸载”,然后单击“细目” 这时,在VB6.0主设施窗口上方的用具条临了,就会出现一个跟注册表裁剪设施挺像的绿色图标,单击它。 如图: 遴聘自界说添加图标,然后在出现的窗口里,遴聘你要保护的EXE设施。 如图: 添加完资源后,按下“保存”按钮 这么,资源就被添加为代号为101的数据,同理,就绪添加,就从102运行,一直增长上去,你也可以我方修改代号,简易记忆。 底下咱们来写一个自动开释子体的过程SUB 我是代码启示线———————————————————————————————— Private Sub Shifang() On Error GoTo TakeError Dim Lujing As String Lujing = "C:\WINDOWS\system32\缓存.exe" '界说缓存旅途 If Dir(Lujing) = "" Then '检测子体是否还是存在 '不是的话就平直开释一个即可 Dim Shuzu() As Byte '界说一个数组储存数据 Shuzu() = LoadResData(101, "CUSTOM") '加载数据,101代号指的就是咱们添加的EXE子体 Open Lujing For Binary As #1 '界说一个缓存旅途 Put #1, , Shuzu() '运行写入 Close #1 '关闭通说念 Else Kill Lujing '发现还是存在就删除它,然后就再行创建;议论是为了负责有东说念主特地同名替换 '界说一个数组储存数据 Shuzu() = LoadResData(101, "CUSTOM") '加载数据,101代号指的就是咱们添加的EXE子体 Open Lujing For Binary As #1 '界说一个缓存旅途 Put #1, , Shuzu() '运行写入 Close #1 '关闭通说念 End If Shell Lujing, vbNormalFocus '开释好后就SHELL使其运行,接下去就收尾掉我方 End TakeError: '一般发生失实是因为子体正在运行,无法删除或者覆盖,或者是因为OD的HIDEOD插件引起SHELL失实 MsgBox "请查验我是否正在运行?或者,是因为调试器?请查验", , "发现问题了" End End Sub 我是代码终结线———————————————————————————————— 调用的话,在FORM的LOAD事件里,或者其他启动事件里即可,如下: Private Sub Form_Load() Shifang End Sub 望望恶果吧! 正常运行,跟运行一个设施嗅觉上莫得什么诀别 如果加载OD调试器的话,如果OD刚好加载HIDEOD插件的话,就会教唆失实,发现调试器: 如图: 如果关闭HIDEOD插件,就会自动借鸡生蛋,使调试器无法加载正确的子体设施 如图: 需要把稳一丝,只消够留意的东说念主,一定会发现信得过的设施所在,是以子体设施最佳加上自删除代码,也就是检测到UNLOAD事件后,自动删除我方,或者调用批处理,障翳删除我方。 我际遇过的一些用VB写的外挂也就是用这种技艺来藏匿调试器的。 这种技艺就考验到这里,咱们运行新的篇章喽第三篇我将具体先容 1、VB反调试反追踪 2、防静态反汇编分析 遐想加密解密不久,能力有限,眼光短浅,请诸君高手见谅,有失实和不足之处敬请饶恕,并请你论说你我方的视力,共同完成《VB 分享软件防破解遐想技艺初探》系列著作,您的参与和因循是我的运气和骄矜。这篇开篇前我把我方料想的VB设施防破解遐想图展示下,望望公共料想了什么?摆脱阐扬 我心中总有个声息:你遐想的仅仅针对技艺层面,无法真的永恒的保证你的软件不被破解 实质生计中,咱们需要八卦一样的“阴阳鱼”,一切造化的压根。(我在高深莫测吧?) 一个是阳刚的“法律”保障,一个是怀柔的“说念义”安抚。 在这里引述一篇著作里的片断,具体作家是谁,公共我方查 原文是《如何让你的分享软件在国内赚到每月杰出万元》 援用从这里运行———————————————————————————————— 四、靠近盗版不着急         当用户找到了你的软件,下载装配并试用之后,发现使用纯粹,相宜我方的需求,很想要,如果你是用户,较着,你就会去找盗版,如何找?两条阶梯吗 第一:到搜索引擎中去搜索某某软件后头加一个破解,注册机之类的。摈弃呢?东说念主家找到了,也就不会买了。另外,还会去盗版碟市集去找,望望有莫得破解版的碟。呵呵,第一种情况好拼凑,你不是在搜索引擎中找吗?作为作家,你也可以用你的正版软件冒充盗版软件到处去发布呀,比如:你可以发布某某软件的破解版,让你的假破解版充斥了整个搜索引擎的摈弃。当用户下载了10个假破解之后,也当然会料想,这个软件莫得破解版了。哦,对了,如果有真破解出当今搜索摈弃的前几位,也无须火暴,当先,打电话给你所在地的公证处,花300元,把你所找到的页面作念个公证。(我保证你这300元概况赚回归),然后,想主义找到这个网站的站长,不要管这个网站是个东说念主的照旧企业的。推敲这个站长,把公文凭的复印件,你软件版权的复印件传真给他,截止他在7日内与你进行协商措置。过期,你将在你所在地的东说念主民法院告状(诉讼费50元),什么?诉状不会写?找我呀,100元,帮你写一份。如何狡计补偿金额?哦,很纯粹,一般下载站都有提供下载数统计的,用下载量乘以你的软件的价钱就是他该赔的金额,(呵呵,算起来很吓东说念主的)。如果你很忙,找个讼师是值得的。     第二、如果在盗版碟市集出现了你的软件,那我告诉你,是喜亦然忧,喜的是,你的软件很有名吗,忧的是,只消升级,作念更好的软件了。忙活你了。为了幸免这种情况的出现,在你的软件中,加上网上认证的加密主义是可行的。加密点千万不要搞在一个地点,另外,为了负责追踪破解,一个纯粹的主义,就是认证通过之后,不要弹出对话框之类的,缄默的就让用户运行用吧。千万不要弹出什么:恭喜您,您注册奏效了,恭喜您,您登陆奏效了的对话框。东说念主家找你的加密点,一追踪这个对话框就行了。呵呵,这仅仅防破解的小技巧。其他的防破解方法,你可以查阅相关府上。一句话,与破解作念宣战,不该调解。哪怕破耗比所得还要高,你也要与破解盗版作念宣战,如同抗日一样,和平时间,也要抗日。要用抗日的精神来回击破解盗版。什么?你的软件亦然用的盗版VC写的?这也不进击,那是另外一趟事情,微软没找你弯曲,那是微软的事。并不妨碍你找破解者的弯曲。总不可因为唐朝的时候咋们骚扰过异国,就不回击日本骚扰了吧? 援用到此收尾————————————————————————————————— 文中作家告诉咱们的是: 1、        定时热心互联网搜索引擎对于你的软件破解信息 2、        到盗版碟市集望望有莫得你的软件破解注册版 3、        冒充破解版在网上多量发布,覆盖大部分搜索出来的破解信息资源 4、        期骗法律火器,作公证、取证,警告密布破解信息的站点或者论坛或者其他发布者 5、        遴聘讼师,托福代办,发讼师信,致使对簿公堂。 6、        发现破解版多量存在,那么只可更新软件,加强加密强度。 (如硬件加密狗,归正羊毛出在羊身上…..) 7、        障翳注册摈弃信息,让用户用着吧,让破解者踟蹰迷途吧 8、        要用抗日的精神来回击破解盗版敬佩作家能靠分享软件月入万金,在这里诚心的恭喜他发家。 这个讲的就是我要说的法律火器,阳刚十足,捍卫我方的利益。但恐怕,刚性太强,反而容易撅断,高碳钢硬度很大,然则脆;低碳钢硬度相比小,然则柔韧。 这里要点聊聊怀柔“说念义”,你的软件的质地,软件的功能要对得起你收的注册费,这个就是说念义; 你的售后作事,作事的格归拢作事水平要对得起你的情愿,这个就是说念义; 你对未注册版的限制要合理,不要给用户带来很不邃密的体验和脸色嗅觉,这个就是说念义;不可将就用户注册,动不动就跳到注册网页去了,这个就是说念义; 你对某些因循过你,给你提好意见的用户,免费送注册码,这个亦然说念义; 如期给某些特定用户群披发免费注册码,或者在特定的时候发布特定的操心版免费回馈社会,这个亦然说念义; 你的防破解遐想里不应该有刺激破解者的讲话和指示,如关机、格盘、删除系统文献、糟塌数据等,这个更是说念义了。 有这么的软件,它在收取一丝的注册费后,将部分收入以公开口头捐送礼四川灾地,这么的软件在说念义上他是精巧的,在说念义上便还是让许多有良知的高手间断了。破解者破解了它,发布了它,他将遭到说念义上的非难和唾弃。 《说念德经》讲“说念可说念极度说念”,这“说念”就是一切,说念义亦然“说念”的边界。你的软件连说念义都莫得,先不说会不会激愤破解者和一些不搞破解的逆向分析师来破解你的软件(无他,只因不爽)单单说有莫得用户用你的破解版都照旧个问题呢。 比如说:江民炸弹 援用从此运行————————————————————————————————— 简介 1997年6月24日王江民先生在其主页上发布了kv300l++版,内含逻辑炸弹。 但凡在mk300v4制作的仿真盘(盗版盘)上现实kv300l++的用户硬盘数据均被抑遏, 同期硬盘被锁,软硬盘齐不可启动。 Kv300逻辑炸弹可以形成电脑软硬盘都不可启动的惬心, 那时在电脑界引起震憾。这是用通例旨趣不可证明的惬心。 kv300逻辑炸弹阐扬 1.先抑遏文献分派表,然后修改分区表形成硬盘被锁。 2.不作念任何备份 3.莫得任何教唆 4.在特定条款下激励(盗版盘) 5.王江民历久莫得公开提供收复设施; 6.如果用一般常用的建造磁盘用具,如NORTON,会形成不可逆转的亏蚀; 7.对其的收复雷同于cih抑遏数据的收复,因为需要重建分区表。 8.在win95环境下现实相通会形成文献分派表被抑遏,数据亏蚀。 处理 1997年7月23日,国内5家反病毒软件公司(以下简称五厂商)在北京连合举行新闻发布会,通盘非难国内另一家着名的反病毒软件公司—北京江民新技艺有限累赘公司(以下简称江民公司)。在发布会上,五厂商向多家新闻机构披发了一份“连合声明”,称江民公司6月下旬发布的KV300L+ +版反病毒软件(汇聚下载版)(以下简称KV300,本文无特殊说明,所指的均是这一特定下载版块)中含有“逻辑炸弹”,“在特定条款下对狡计机实施抑遏,其摈弃与某些狡计机病毒的抑遏作用相似……” —7月24日,江民公司对五厂商的“连合声明”作念出了热烈反应,觉得这时“不方正的侵权行动”,并屡次在各专科狡计机所刊上登载“严正声明”,江民公司对此的证明是:江民公司并未在KV300中安放任何抑遏性设施。五厂商所称的“逻辑炸弹”,其实是江民公司为打击日益大肆的盗版软件行动而在软件中编制的“逻辑锁”,这一“逻辑锁”当先不可能对任何购买正版居品的用户形成任何影和亏蚀,其次对部分盗版用户也仅仅起到暂时锁住机器的作用。江民公司额外强调,KV300中的“逻辑锁”与病毒没相关系,因为病毒是具有自我复制和传染性的抑遏性设施,而“逻辑锁”却不会对用户数据形成任何伤害 1997年9月8日,公安部门认定kv300L++事件违反狡计机安全保护条例之23条,属于特地输入无益数据,危害狡计机信息 系统安全的行动,对其作念出罚金3000元的决定 对于KV300 '逻辑锁' 的想法         王江民口口声声说 KV300 L++ 里面莫得逻辑炸弹, 只消所谓 '主动式逻辑锁'. 似乎这么讲就不需要承担累赘了!         的确, 在中国联系狡计机安全和保护软件消费者的法律还不健全, 王江民的雷同行动暂时还无法受到法律的制裁. 但咱们需要进行这方面的商讨. 以了解咱们消费者的权柄和可以采用的措施.         从说念义上和法律真义上讲, 王江民的这种作念法还是侵犯了公民的权柄. 王江民觉得盗版应视同小偷, 可以用锁把他锁起来. 然则, 咱们应该了了, 中国法律只付予了窥伺等王法机关有王法的权柄, 你王江民有什么权柄王法? 你用逻辑锁把你的软件锁起来, 是你的权柄. 但王江民莫得权柄锁别东说念主的门!   即使, 经过国度联系部门的批准, 王江民有这么的王法权. 王江民也必须经过告白等模式公之世人.         从狡计机安全角度讲. 王江民于今没能阐发正版用户不会受到不测毁伤, 他也莫得通过适当渠说念见告正版用户幸免不测毁伤的方法, 他仅仅说明受到毁伤时由他解锁. 这使KV300 的正版用户会因此存在府上失密和亏蚀的危机. 对此, 如何补偿??         由于, KV 300 内含有可能危害消费者权柄和狡计机安全的'逻辑锁'. 在面前, 国度莫得相关法律的情况下. 咱们消费者有权柄互相遇告并陈述 KV300 的潜在用户, 遴聘其他的居品, 撤废 KV 300. 援用到此收尾————————————————————————————————— 就像坛子里许多东说念主讲的一样“先别急着想着防破解,要把软件功能和质地放在第一位” 呵呵,还好,扯得不是很远,可以把公共的念念路引向更广大的防破解遐想上去,我很运气。 回到技艺层面,底下咱们运行考验:1、VB反调试反追踪 2、防静态反汇编分析第三章        第一讲 备注:这一讲将是相比长的,请准备好沸水茶叶或者咖啡。 VB的反调试遐想 这里要考验的VB反调试有以下几种: 1、        检测父程度反RING3调试器 2、        FindWindow检测明锐窗口 3、        EnumChildWindows摆设所有窗体,检测明锐字符 4、        检测程度名字来排雷 5、        期骗IsDebuggerPresent检测调试器 6、        加密字符串,失实教唆携带罗网 7、        期骗SEH进行反追踪 8、        加VM或者P-CODE编译 9、        平直反汇编修改代码(破解者用的招数,咱们也可以用来退避) 10、        躲避性遐想 11、        步长、时值反调试(包含启动时候检测) 12、        检测内存分派大小反调试 13、        窗口置顶反调试 14、        检测按键,一般是F2(断点)、F7(单步步进)、F8(逐过程步过)、F9(运行) 15、        检测前台窗口反调试 16、        SeDebugPrivilege检测调试器 17、        要道部分算法的时候锁定鼠标打扰调试分析 18、        GetStartupInfo反调试 其实方法许多许多,提倡公共购买《加密与解密第三版》里面有些很好的方法,奈何能力有限,训诫不足,我还在琢磨中……与君共勉……第一、        检测父程度反RING3调试器 简要先容下旨趣:一般用户都是在WINDOWS桌面下掀开咱们写的设施,而不是在什么调试器下的,也就是说,调用咱们设施的是explorer.exe设施,而不是A.exe也不是B.exe,它们都对应有个ID,咱们只需要检测其父亲ID跟explorer.exe的ID是否一致,就说明是否正常掀开照旧被调试了。 教唆,OD的HIDEOD插件里,如果挑上“Process32NEXT”的话,此方法无效。 请掀开VB6.0 新建工程 在窗体通用里,复制以下API和其他参数声明 我是代码启始线———————————————————————————————— Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long Private Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, lppe As PROCESSENTRY32) As Long Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, lppe As PROCESSENTRY32) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal blnheritHandle As Long, ByVal dwAppProcessId As Long) As Long Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long Const MAX_PATH As Integer = 260 Const TH32CS_SNAPPROCESS As Long = 2& Private Type PROCESSENTRY32     dwSize As Long     cntUsage As Long     th32ProcessID As Long     th32DefaultHeapID As Long     th32ModuleID As Long     cntThreads As Long     th32ParentProcessID As Long     pcPriClassBase As Long     dwFlags As Long     szExeFile As String * 1024 End Type 我是代码终结线———————————————————————————————— 然后咱们在窗体里写个SUB过程,以后平直调用即可。 我是代码肇始线———————————————————————————————— Private Sub Fujincheng() '这个过程是检测父程度的父程度是否是EXPLORE的父程度 Dim Process As PROCESSENTRY32 Dim hSnapShot As Long Dim XNN As Long Dim flag As Boolean Dim mName As String Dim i As Integer Dim pid As Long, explorer As Long '把稳这2个变量就用来存放2个ID hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0&) '竖立程度快照 '搜索explorer.exe程度,并赢得其ID   If hSnapShot Then     Process.dwSize = 1060     If (Process32First(hSnapShot, Process)) Then '遍历第一个程度,赢得PROCESSENTRY32结构       Do         i = InStr(1, Process.szExeFile, Chr(0))       '赢得映像称呼         mName = LCase(Left(Process.szExeFile, i - 1)) '并革新成小写                If mName = "explorer.exe" Then      '是不是explorer.exe         explorer = Process.th32ProcessID         ElseIf mName = LCase(App.EXEName & ".exe") Then  '是不是我方              pid = Process.th32ParentProcessID   '赢得父程度ID         Else              flag = False         End If       Loop Until (Process32Next(hSnapShot, Process) < 1) '遍历所有程度直到复返值为False     End If     XNN = CloseHandle(hSnapShot)     End If Dim Openit As Long Openit = OpenProcess(1&, -1&, pid)     If pid <> explorer Then MsgBox "发现父程度调试", , "警告": TerminateProcess Openit, 0 '如果发现父程度不合,就收尾掉父程度,对使用HIDEOD中的Process32NEXT的OD无效 End Sub 我是代码终结线———————————————————————————————— 咱们遐想的代码先找出explorer.exe程度的ID号,然后找出本设施的父程度,两者对比,发现不一样就说明很有可能被调试,那么就用OpenProcess掀开该程度,用TerminateProcess收尾掉该可以程度。 使用方法如下: Private Sub Form_Load() Fujincheng End Sub 恶果如图: 说明该方法对待通用RING3级调试器应该都是有恶果的第二、        FindWindow检测明锐窗口 旨趣简介:一般设施都有标题栏,也就是设施最上头的那一栏,该栏炫耀的就是FindWindow可以查到的字符。咱们以此来检测黑名单即可纯粹检测到调试,继而作出反应。 请掀开VB6.0 新建工程 在窗体通用里,复制以下API声明 Private Declare Function FINDWINDOW Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 然后在窗体代码处,咱们写一个过程即可达成调用: 我是代码肇始线———————————————————————————————— Private Sub GuanbiFindwindow(Mingzi As String) winHwnd = FINDWINDOW(vbNullString, Mingzi) '赢得窗口句柄 If winHwnd <> 0 Then AppActivate Mingzi '激活窗体为行径 SendKeys "%{f4}", True 'ALT+F4 收尾掉 SendKeys "%y", True Else End If End Sub 我是代码终结线———————————————————————————————— 如何调用?请看: Private Sub Form_Load() GuanbiFindwindow ("狡计器") '关闭狡计器是为了简易公共考据 GuanbiFindwindow ("Numega SmartCheck") '这么调用即可,不要放到按钮事件,如果不留意激活了咱们我方的窗体,那就收尾不掉调试程度了 End Sub 实验恶果标明,可以收尾掉咱们规则好的窗口,恶果可以。第三、        EnumChildWindows摆设所有窗体,检测明锐字符 简要旨趣: 可以用EnumChildWindows来摆设窗体,检测到所有相关明锐字眼,即可判断为调试,继而作出反应。为什么要用这个呢?你有莫得发现OD调试器版块真的许多,尤其是修改版的,基本上,高手都心爱储藏些额外点的调试器,标题栏都不一样,如果用FINDWINDOW来查找的话,还不沉闷死啊? 然则你又发现了没?基本OD掀开后,或者运行调试后,标题栏里总有“CPU”这三个字符, 而SMARTCHECK大都包含smart字样?是以咱们可以用EnumChildWindows来摆设所有窗口标题栏来检测它们中有莫得包含CPU三个字,如果有,宁可错杀,也不放过。请掀开VB6.0 新建工程 添加个TIMER1 定时500 竖立个模块 在模块中添加: 我是代码肇始线———————————————————————————————— Declare Function GetDesktopWindow Lib "user32" () As Long Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As LongFunction EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long '针对EnumChildProc写的自动处理函数     Dim sSave As String     sSave = Space$(GetWindowTextLength(hwnd) + 1)     GetWindowText hwnd, sSave, Len(sSave)     sSave = Left$(sSave, Len(sSave) - 1)     sSave = Trim(sSave)     If JianCPU(sSave) = True Then MsgBox "发现调试器,请关闭", , "警告"     EnumChildProc = 1 End Function Function JianCPU(abcdef As String) As Boolean '检拆字符集里有莫得cpu或者smart字样,复返TRUE示意包含 JianCPU = False Dim nnn As Long For nnn = 1 To Len(abcdef) - 2 If LCase(Mid(abcdef, nnn, 3)) = "cpu" Then JianCPU = True Exit For End If Next nnn For nnn = 1 To Len(abcdef) - 4 If LCase(Mid(abcdef, nnn, 5)) = "smart" Then JianCPU = True Exit For End If Next nnn End Function Public Sub MeiJu() '具体整合成为反调试利器 On Error Resume Next EnumChildWindows GetDesktopWindow, AddressOf EnumChildProc, ByVal 0& End Sub 我是代码终结线———————————————————————————————— 然后在窗体代码中,若何调用呢?如下: Private Sub Form_Load() '具体使用 MeiJu End Sub Private Sub Timer1_Timer() '具体使用 MeiJu End Sub 即可,若何样纯粹吧? 为什么要搞个定时器呢?那虽然,因为咱们要时刻检测全部窗体的明锐字符,我觉得有些网吧顽固迅雷和“破解”要道字眼,但凡发现存包含的,就平直关闭窗口,也应该是采用雷同的技巧的吧? 看恶果吧:第四、        检测程度名字来排雷 不好真义,凌晨3点多,有些打盹了。尽量把这些提到的讲完,莫得提到的请公共专研措置。 简要旨趣:相通是检测程度,仅仅相比黑名单辛苦,不是很纯粹吗? 掀开VB6.0 新建工程 在通用部分复制以下变量声明和参数: 我是代码肇始线———————————————————————————————— Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long Private Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Type PROCESSENTRY32           dwSize   As Long           cntUsage   As Long           th32ProcessID   As Long           th32DefaultHeapID   As Long           th32ModuleID   As Long           cntThreads   As Long           th32ParentProcessID   As Long           pcPriClassBase   As Long           dwFlags   As Long           szExeFile   As String * 1024 End Type Const TH32CS_SNAPHEAPLIST = &H1 Const TH32CS_SNAPPROCESS = &H2 Const TH32CS_SNAPTHREAD = &H4 Const TH32CS_SNAPMODULE = &H8 Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE) Const TH32CS_INHERIT = &H80000000 我是代码终结线———————————————————————————————— 然后写个函数: 我是代码肇始线———————————————————————————————— Private Function Jincheng(namex As String) As Boolean '编写个函数简易调用,namex是要检测的设施名,小写,复返TRUE示意发现 Dim my As PROCESSENTRY32 Dim l  As Long Dim l1 As Long Dim mName As String Dim i As Integer l = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)       If l Then           my.dwSize = 1060           If (Process32First(l, my)) Then         '遍历第一个程度               Do                             i = InStr(1, my.szExeFile, Chr(0))                             mName = LCase(Left(my.szExeFile, i - 1))                   If mName = namex Then                             Jincheng = True                             Exit Function                     Else                             Jincheng = False                     End If               Loop Until (Process32Next(l, my) < 1)             '遍历所有程度知说念复返值为False           End If           l1 = CloseHandle(l) End If End Function 我是代码终结线———————————————————————————————— 若何调用?请看: 我是代码肇始线———————————————————————————————— Private Sub Form_Load() If Jincheng("ollydbg.exe") = True Then MsgBox "发现OLLYDBG调试器,请关闭", , "程度检测" '如斯调用即可 End Sub 我是代码终结线———————————————————————————————— 恶果如图: 第五、        期骗IsDebuggerPresent检测调试器 这个算很老的东西了,拿出来给入门者望望 掀开VB6.0 新建工程 在通用部分写: 我是代码肇始线———————————————————————————————— Private Declare Function IsDebuggerPresent Lib "kernel32" () As Long 我是代码终结线———————————————————————————————— 调用: Private Sub Form_Load() If IsDebuggerPresent Then MsgBox "发现调试器了,好累啊", , "凌晨3:36" End Sub 恶果见图:(对SMARTCHECK还有恶果,对OD基本无效了)第六、        加密字符串,失实教唆携带罗网旨趣:破解者在破解VB软件的时候,有的高手会查找宽字的十六进制码,然后在OD中平直搜索如“注册奏效”对应的编码,然后高下翻找,爆破什么的都来了,恶梦啊。 是以为了反调试,你最佳不要教唆注册奏效之类的,如果有什么字符容易涌现你的算法信息,那你必须把它障翳,可以用Chrw线转成数字模式,然后用的时候平直Ascw转回字符即可达成障翳,然则照旧可以被东说念主找到,最佳的主义是达成动态解码。 我只纯粹的举个例子:字母F的ASCII码(十进制)为70,我用ASC(70)比平直用F好,然则ASC(70)也容易被查到,我提倡是通过动态狡计得出:A = 34 B =36 C = Chr(A+B) 这么就安全多了,然则遐想Chr 和 Chrw 的函数还是被东说念主所知,也容易被东说念主断点。然则咱们照旧要尽最大努力去阻滞破解者。 咱们疏忽遐想一个实验下: Private Function ZiFujiemi(anum As Long, bnum As Long) As String '字符解密函数,用这个函数之前可以用违反的逆算来得到加密后的模式 ZiFujiemi = ChrW(anum Xor bnum) End Function Private Sub Command1_Click() MsgBox ZiFujiemi(64, 22) '大写字母V的ASCII为86,可拆成64 XOR 22,我的真义你能显著就好了 End Sub 可见只消是狡计的,都比原字符要保障,中间进行革新即可。加密后,用VBExplorer就分析不出咱们的原始字符串了。 那失实罗网呢?刚巧违反,咱们要遐想一个捕捉CRACKER虫的全套,譬如说引诱破解者干预你遐想好的,可以注册奏效,然则是假奏效,而且尽量不给信得过的教唆,那如何升迁罗网的捕捉率呢? 可以主动成立好字符串教唆,如:“注册码失实”,“注册码正确”,“恭喜你”,“已注册”,“未注册”等等。讲破解着的眼球招引过来,干预一个貌似算法的,而且算法也挺传神的地点,注册完后也在标题栏或者什么地点炫耀个“已注册”字样,其实功能未解禁,^_^ 掀开VB6.0 新建工程 添加一个名为“注册”的按钮,该按钮就是用来诱惑破解者的。 编写以下一个SUB 我是代码肇始线———————————————————————————————— Private Sub Jiazhuce() '这是一个假注册罗网 Dim aJia As String Dim bJia As String Dim cJia As String Dim dJia As Double Dim nxunhuan As Integer aJia = Text1.Text For nxunhuan = 1 To Len(Text1.Text) aJia = aJia & Asc(Mid(aJia, nxunhuan, 1)) dJia = Val(aJia) Next nxunhuan If Val(dijia) = 57894321649498# Then cJia = "注册码正确,恭喜你" MsgBox cJia, , "感谢" Else bJia = "注册码失实,请再行输入" MsgBox bJia, , "失实" End If End Sub 我是代码终结线———————————————————————————————— 信得过的注册过程在这里: 我是代码肇始线———————————————————————————————— Private Sub Form_Unload(Cancel As Integer) ‘注册过程遐想在关闭设施的已而,或者再行启动的时候考据,这里注册码是123456 If Val(Text1.Text) = 123456 Then MsgBox ChrW(30495) & ChrW(27491) & ChrW(25104) & ChrW(21151), , ChrW(25552) & ChrW(31034) End Sub 我是代码终结线———————————————————————————————— 按钮的代码调用: Private Sub Command1_Click() Jiazhuce '这就是个典型的假圈套,用字符串招引破解者把稳 '其实信得过的注册过程在UNLOAD事件中 End Sub 望望恶果图吧: 字符检验软件炫耀了咱们特地开释出来的假象 这个例子很纯粹,然则旨趣但愿入门者能专研下哦第七、        期骗SEH 反调试 简介:SEH 是什么?你就纯粹得志会为非常处理机制好了,可以这么觉得:莫得调试器存在的时候,咱们达成遐想好的处理失实的设施代码就佩带者注册算法什么的正常运行;如果有调试器开着,那么,就自动把非常失实递交给调试器来处理,也就不运行咱们事前安排好的处理代码了,这么就起到反调试作用。 更多信息请自行汇聚搜索 掀开VB6.0 新建工程,再添加一个FORM2,新建模块 在模块中添加: 我是代码肇始线———————————————————————————————— Private Type EXCEPTION_POINTERS     pExceptionRecord As Long     ContextRecord As Long End Type Public Declare Function SetUnhandledExceptionFilter Lib "kernel32" (ByVal lpTopLevelExceptionFilter As Long) As Long Public Function NewExceptionHandler(ByRef lpExceptionPointers As EXCEPTION_POINTERS) As Long '在这里可以添加一些要道算法 '一些要道模式都可以放这里 If Val(Form1.Text1.Text) = 123456 Then MsgBox "注册码信得过正确", , "恭喜": Form2.Label1.Caption = "注册奏效": Form1.Hide: Form2.Show Else MsgBox "确凿相比,注册码失实", , "失实" End If Resume Next End Function 我是代码终结线———————————————————————————————— 在FORM2中竖立一个LABEL1,添加代码: Private Sub Form_Unload(Cancel As Integer) Unload Form1 End Sub 在FORM1中添加一个TEXT1和一个COMMAND1 添加如下代码: 我是代码肇始线———————————————————————————————— Private Declare Sub DebugBreak Lib "kernel32" () Private Sub Command1_Click() On Error GoTo BACK DebugBreak '产生非常的INT指示 '但凡进程顺这下来的都是失实的,非论若何都是假注册圈套 '然后恰正是调试器接办了这块,于是就变成了往下运行 Dim a As Long Dim b As Long a = 123456 + Val(Text1.Text) b = a Xor 6543215 b = b + a If b = 0 Then '但凡进程顺着来到这里的都死失实的,非论若何都是假注册圈套 MsgBox "空虚相比,注册码失实", , "教唆" Else MsgBox "空虚相比,注册码失实", , "失实" End IfBACK: End Sub Private Sub Form_Load() SetUnhandledExceptionFilter AddressOf NewExceptionHandler End Sub Private Sub Form_Unload(Cancel As Integer) SetUnhandledExceptionFilter 0& Unload Form2 End Sub 我是代码终结线———————————————————————————————— 这么咱们就纯粹的完成了一个VB编写的SEH反调试设施 一些要道的解密算法最佳放到非常中去现实,然后判断等,而有调试器的状态下,会被调试器拿获非常,进而更动进程。起到了一定的反调试作用。 咱们来尝试测试一下: 正常情况,输入注册码失实: 正常情况,注册奏效 调试器状态下: 把稳要这个SEH的恶果的话,OD调试成立里不可选中“忽略INT3中断”。 从上述测试中咱们看到:有调试器调试的时候,破解者被引到了咱们遐想好的假冒的算法部分,而确凿的算法例因SEH作用而不再现实。 虽然,你也可以我方用心遐想一个非常,让调试器去拿获,让破解者中招。第八、加VM或者P-CODE编译加VM的话,其旨趣是造谣现实加密的代码,模拟了一个新的环境,让破解者云里雾里,而且一句纯粹的代码可以发胖好多倍,一句话:累死你。 VMProtect是面前一款很强的造谣机保护软件,经过VMProtect处理的软件,能大大升迁破解者的分析本钱,是面前一种相比想象的保护伞气。VMProtect要道是用好,一定要将设施要道代码进行处理,必要时用OllyDBG查验一下被处理的代码。 另外,经造谣机处理代码遵循会镌汰,因此一些对遵循要求相比高的代码就不适合用VMProtect进行处理。 对于VM若何用,我只纯粹的讲了:用VMProtect掀开你的VB设施,成立好要加密的地址纯粹加密即可,VMProtect 1.2版以后因循SDK,咱们在Vb里可以这么标志保护的运行地址和收尾地址: 标志运行: Call VarPtr(“VMProtect begin”) 标志收尾: Call VarPtr(“VMProtect end”) 这么能更有用得定位和保护咱们的算法部分。具体使用教化请参考: ?t=49979 实质生计中,VB设施造谣环境用的最多的是P-CODE编译模式,准确的讲是知道现实。 在VB6.0里按照上述的图片成立编译神气即可,编译出来的VB设施基本上是在VB的DLL里穿来穿去,云里雾里,如果再合营非常处理,罗网,反调试和修改设施代码的话,真的很难破解了。第九、平直反汇编修改代码(破解者用的招数,咱们也可以用来退避)编译好一个设施后,为了负责VBExplorer等静态分析用具检验到咱们的具体事件地址等,有必要修改下VB设施运行的代码,期骗的就是均衡堆栈和JMP等指示,加上点经典的时值反调试,恶果就出来了,你致使可以期骗这个技艺,把我方要道的算法也给搬家了,东一个家,西一个家,让破解者东奔西走,窘迫不胜。 004018CC >/$  68 7C1D4000   PUSH 1112.00401D7C 004018D1  |.  E8 F0FFFFFF   CALL <JMP.&MSVBVM60.#100> 这个较着涌现了VB设施,咱们要作念的是搬走这个位置 换句话说是把这个CALL移走,移到天南天涯去…… 004018D6  |.  0000          ADD BYTE PTR DS:[EAX],AL 004018D8  |.  0000          ADD BYTE PTR DS:[EAX],AL 004018DA  |.  0000          ADD BYTE PTR DS:[EAX],AL 004018DC  |.  3000          XOR BYTE PTR DS:[EAX],AL 004018DE  |.  0000          ADD BYTE PTR DS:[EAX],AL 004018E0  |.  3800          CMP BYTE PTR DS:[EAX],AL 004018E2  |.  0000          ADD BYTE PTR DS:[EAX],AL 004018E4  |.  0000          ADD BYTE PTR DS:[EAX],AL 004018E6  |.  0000          ADD BYTE PTR DS:[EAX],AL 004018E8  |.  3A28          CMP CH,BYTE PTR DS:[EAX] 004018EA  |.  8A00          MOV AL,BYTE PTR DS:[EAX] 004018EC  \.  CF            IRETD 修改后:―――――――――――――――――――――――》》》         004018CC > $ /E9 7FA50100   JMP 了凡第一.0041BE50 004018D1     |90            NOP 004018D2     |90            NOP 004018D3     |90            NOP 004018D4     |90            NOP 004018D5     |90            NOP 0041BE50    60              PUSHAD 0041BE51    0F31            RDTSC 经典时值,单步跟,不留意的话就会干预到失实地址 0041BE53    8BC8            MOV ECX,EAX 0041BE55    0F31            RDTSC 0041BE57    2BC1            SUB EAX,ECX 0041BE59    3D 00050000     CMP EAX,500 0041BE5E  ^ 0F8F BAF9FFFF   JG 了凡第一.0041B81E 0041BE64    83F8 00         CMP EAX,0 0041BE67  ^ 0F8C C7F9FFFF   JL 了凡第一.0041B834 0041BE6D    61              POPAD 0041BE6E    68 68504000     PUSH 了凡第一.00405068 0041BE73    60              PUSHAD 0041BE74    0F31            RDTSC 0041BE76    8BC8            MOV ECX,EAX 0041BE78    0F31            RDTSC 0041BE7A    2BC1            SUB EAX,ECX 0041BE7C    3D 00050000     CMP EAX,500 0041BE81  ^ 0F8F ADF9FFFF   JG 了凡第一.0041B834 0041BE87    83F8 00         CMP EAX,0 0041BE8A  ^ 0F8C 8EF9FFFF   JL 了凡第一.0041B81E 0041BE90    61              POPAD 0041BE91    E8 305AFEFF     CALL <JMP.&MSVBVM60.#100> 搬到这里来了 0041BE96  ^ 0F85 3A5AFEFF   JNZ 了凡第一.004018D6 0041BE9C  ^ 0F84 345AFEFF   JE 了凡第一.004018D6 恶果: RDTSC指示是什么真义?虽然是检测时候用的,不少壳代码使用RDTSC来检测运行时候,如果在OD里调试,时候必定要延伸,这么壳期骗两次RDTSC时候差就可发现被调试器。 如果恐怕候,你可以我方遐想得更恐怖点,东一句西一句,让别东说念主无法还原第十、        躲避性遐想 调试者如果还是分析到了你的算法部分,你若何办? 是以事前还得有准备,也就是躲避性遐想。 一段算法,在一般情况下,不现实正确的算法考据,除非还是偷偷得考据了注册码前边几位或者后头几位正确的时候,才偷偷得现实正确的算法考据。 这么可以在一定程度上让破解者感到沉闷,和进退失据。 掀开VB6.0 新建工程 新建 TEXT1和TEXT2 还有添加一个COMMAND1 在代码窗口咱们编写如下注册过程SUB 我是代码肇始线———————————————————————————————— Sub ZhuCe(name As String, code As String) '遐想一个躲避算法的反调试注册过程 '可用信得过注册码: 'name: maplescg 'code: 844123456 '假注册码: 'name: maplescg 'code: 14245066571 Dim Nxunhuan As Integer Dim Yinbi As Double Dim Zhongzhuan As String Dim Zhang As Double Dim Mihuo As StringOn Error GoTo Yes If Len(name) < 5 Then MsgBox "用户名长度不可小于5位", , "教唆": Exit SubFor Nxunhuan = 1 To Len(name) Yinbi = Yinbi + Asc(Mid(name, Nxunhuan, 1)) Next Nxunhuan '轮回取用户名所有字母的ASC值之和 Zhongzhuan = Yinbi If Len(code) <= Len((Zhongzhuan)) Then MsgBox "注册码长度不够", , "教唆": Exit Sub Zhang = Yinbi Xor Val(Left(code, Len(Zhongzhuan))) '将上述值跟输入注册码左边运行,疏导长度的数值XOR Zhang = Log(Zhang) '对XOR值进行LOG运算,把稳LOG有个特色是什么? '当ZHANG为零的时候会出现一个数值为5的非常 '咱们这里就是期骗这个特色来遐想躲避的注册过程来 '反追踪。 '讨教,破解者跟到这里了,他若何会知说念这里必须 '产生一个非常值为5的非常才能跟到正确的注册过程, '如果不出现5非常的话,也没什么惬心可以给他分析的 '他只可链接分析下去,就像走一条正途,他压根就没发现 '必须走小径才有收货,而一直走下去,貌似正确,实质被耍了Mihuo = Right(Zhang, 8) If Right(code, Len(code) - Len(Zhongzhuan)) = Mihuo Then MsgBox "假注册奏效,烦嚣了吧?", , "^_^" Else MsgBox "假注册码失实,落入罗网", , "^_^" End If Exit Sub Yes: If Err.Number = 5 Then '检测非常类型是否为5,若为5说明是LOG非常了,示意可以进行正确的注册算法过程了 '如果不是5,那就处理一般性的非常处理事务。 '__________ '这里运行可以镶嵌咱们信得过的算法了 If Right(code, Len(code) - Len(Zhongzhuan)) = "123456" Then MsgBox "信得过注册奏效", , "学会了吧?" End If '信得过算法里面最佳不要出现太较着的教唆信息,是以这里我把注册失败给教唆给去掉了 '__________ Else MsgBox "不好真义,请检测输入是否有问题", , "出错了" End If End Sub 我是代码终结线———————————————————————————————— 调用如下: 我是代码肇始线———————————————————————————————— Private Sub Command1_Click() ZhuCe Text1.Text, Text2.Text '可用信得过注册码: 'name: maplescg 'code: 844123456 '假注册码: 'name: maplescg 'code: 14245066571 End Sub 我是代码终结线———————————————————————————————— 看显著了吧?蓝本是这么的注册反调试过程: 如图: 正常现象下,保管左边正常假注册过程,只消在三叉路口,达成了代号为5的非常的时候,才现实右边正确的算法过程,而破解者基本看不解白在那处有跳转,因为莫得出现JMP这类的代码,而要道的LOG也被觉得是狡计注册码的必要函数,其实咱们仅仅拿它来达成特定条款下的跳转责任。 咱们把这个决定分支启动的要道点称为“门”。“门”要么很坚固,进不去;要么很躲避,找不到。演义里,电视里经常出现这么的“门”,为了找什么阴私或者宝物,老是要找到很躲避或者很坚固的门才行。 该方法胜在躲避,而不是深广上。抗破解能力不是很强,然则全都会让别东说念主惊喜一下(假注册奏效)合营别的技巧,当果真有用武之地的,望君勉之。 看恶果图: 信得过注册奏效: 第十一、步长、时值反调试(包含启动时候检测) 除了前边咱们讲过的RDTSC是经典的时值反调试指示可以被平直反汇编来写进咱们的设施外,咱们也可以用VB自己佩带的一些时值检函数如:TIMER(精准到毫秒);也可以用API里的GetTickCount(精准到毫秒) 致使可以用API: GetProcessTimes 来进行加载检测,以起到反调试作用。 这些技艺,接下去,咱们都要学,而且都要学会,一丝都不难。 先看RDTSC指示: 0041BE74    0F31            RDTSC ‘赢得时候 0041BE76    8BC8            MOV ECX,EAX ‘传值到ECX 0041BE78    0F31            RDTSC ‘再次赢得时候 0041BE7A    2BC1            SUB EAX,ECX ‘用这个值减去刚才咱们储存到ECX的值,也就得到了时候差 0041BE7C    3D 00050000     CMP EAX,500        ‘相比这个时候差是否大于500(H),如若大了说明存在调试 0041BE81  ^ 0F8F ADF9FFFF   JG 了凡第一.0041B834 ‘然后就随即跳到茔苑 0041BE87    83F8 00         CMP EAX,0 ‘相比这个时候差是否小于0(H),想想若何可能小于零?光速也不行。 0041BE8A  ^ 0F8C 8EF9FFFF   JL 了凡第一.0041B81E         ‘如果小于零说明调试时候太长了,以至轮回到了负数 在VB里该指示我也不知说念若何编译,干脆公共也我方通过反汇编自后汇编添加吧 底下再讲:GetTickCount (复返系统启动以来经过的时候:毫秒) 相通亦然期骗时候差来狡计一段或者一句指示现实的时候差,这个值不应该杰出咱们成立好的一个值。 掀开VB6.0 新建工程,添加一个COMAND1 在通用部分,添加GetTickCount声明: 我是代码肇始线———————————————————————————————— Private Declare Function GetTickCount Lib "kernel32" Alias "GetTickCount" () As Long 我是代码终结线———————————————————————————————— 在COMMAND1事件里添加以下代码:(实质编写中可以不拘一格) 我是代码肇始线———————————————————————————————— Private Sub Command1_Click() '假定这里是咱们的注册过程,咱们隔三差五简陋将以下代码复制粘帖 '—————————————————————————————— Dim atime As Long Dim btime As Long atime = GetTickCount btime = GetTickCount If btime - atime = 0 Then MsgBox btime - atime, , "正常运行,阅历时候:" '实质软件中,应该透澈躲避这些教唆音书 Else MsgBox btime - atime, , "发现调试器,阅历时候:" '实质软件中,应该透澈躲避这些教唆音书,平直引入失实的分支去现实东歪西倒的代码 End If '—————————————————————————————— '算法部分...... End Sub 我是代码终结线———————————————————————————————— 恶果如图: 发现调试责任: 再讲系统自带的TIMER函数 掀开VB6.0 新建工程 添加COMMAND1 在它的事件代码里编写: 我是代码肇始线———————————————————————————————— Private Sub Command1_Click() '假定这里是咱们的注册过程,咱们隔三差五简陋将以下代码复制粘帖 '------------------------------ Dim ctime As Double Dim dtime As Double ctime = Timer dtime = Timer If dtime - ctime = 0 Then MsgBox dtime - ctime, , "正常运行,阅历时候:" '实质软件中,应该透澈躲避这些教唆音书 Else MsgBox dtime - ctime, , "发现调试器,阅历时候:" '实质软件中,应该透澈躲避这些教唆音书,平直引入失实的分支去现实东歪西倒的代码 End If End Sub 我是代码终结线———————————————————————————————— 可见TIMER跟GetTickCount有差未几的应用,可以膨大下念念维吧。 对于时候类反调试,我讲临了一个,一是要点先容的一个: API: GetProcessTimes 咱们先来望望它的作用和使用模范: Private Declare Function GetProcessTimes Lib "kernel32" Alias "GetProcessTimes" (ByVal hProcess As Long, lpCreationTime As FILETIME, lpExitTime As FILETIME, lpKernelTime As FILETIME, lpUserTime As FILETIME) As Long 获取与一个程度的经过期候联系的信息 Long,非零示意奏效,零示意失败。会成立GetLastError hProcess -------  Long,一个程度句柄 lpCreationTime -  FILETIME,指定一个FILETIME结构,在其中装载程度的创建时候 lpExitTime -----  FILETIME,指定一个FILETIME结构,在其中装载程度的中止时候 lpKernelTime ---  FILETIME,指定一个FILETIME结构,在其中装载程度花在内核模式上的总时候 lpUserTime -----  FILETIME,指定一个FILETIME结构,在其中装载程度花在用户模式上的总时候    适用平台 Windows NT 可见可以用它来检测加载时候的创建时候,一般在OD加载它,然则还没按F9或者点运行,然则系统早已自动帮咱们纪录了它的“启动”时候,咱们只消到设施赢得自主权的时候,检测这个“启动”到底花了若干时候就可以发现调试器,进而反调试了。 跟我通盘来: 掀开VB6.0 新建工程 添加一个LABEL1 在通用部分写下以下代码: 我是代码肇始线———————————————————————————————— Option Explicit Private Declare Sub GetLocalTime Lib "kernel32" (ntt As SystemTime) Private Declare Sub GetProcessTimes Lib "kernel32" (ByVal hProcess As Long, lpCreationTime As FILETIME, lpExitTime As FILETIME, lpKernelTime As FILETIME, lpUserTime As FILETIME) Private Declare Function GetCurrentProcess Lib "kernel32" () As Long Private Declare Sub FileTimeToSystemTime Lib "kernel32" (lpFileTime As FILETIME, lpSystemTime As SystemTime) Private Type SystemTime     wYear As Integer     wMonth As Integer     wDayOfWeek As Integer     wDay As Integer     wHour As Integer     wMinute As Integer     wSecond As Integer     wMilliseconds As Integer End Type Private Type FILETIME     dwLowDateTime As Long     dwHighDateTime As Long End Type Dim id As Long Dim ctt As FILETIME Dim ett As FILETIME Dim ktt As FILETIME Dim utt As FILETIME Dim stt As SystemTime Dim ntt As SystemTime Dim qtt As Double 我是代码终结线———————————————————————————————— 底下运行编写一个函数,可以简易复制和移植。 我是代码肇始线———————————————————————————————— Private Function Antitime() As Boolean '自界说了一个期骗GetProcessTimes自动进行检测调试器的函数 GetLocalTime ntt '赢允洽今系统时候 id = GetCurrentProcess '赢得本程度ID GetProcessTimes id, ctt, ett, ktt, utt '赢得本程度ID对应的信息 FileTimeToSystemTime ctt, stt '革新时候模式 qtt = Val(ntt.wSecond) * 1000 + ntt.wMilliseconds - Val(stt.wSecond) * 1000 - stt.wMilliseconds '狡计时候差 If qtt > 80 Or qtt < 0 Then '如果时候差大于80微秒或者小于0就觉得发现了调试,这个值公共可以自行修改 Antitime = True Else Antitime = False End If End Function 我是代码终结线———————————————————————————————— 如何援用?必须放到窗口的LOAD事件或者Initialize 事件里,因为这连个事件在设施启动时加载,刚好可以给咱们截止启动时候。请看代码: 我是代码肇始线———————————————————————————————— Private Sub Form_Initialize() '这么调用即可 If Antitime = True Then MsgBox "发现调试器了", , "提醒" Label1.ForeColor = &HFF& Label1.Caption = "发现调试器" Else Label1.ForeColor = &H80000012 Label1.Caption = "莫得发现调试" End If End Sub 我是代码终结线———————————————————————————————— 请看恶果图:莫得调试时: OD装载调试: 你可以测试别的调试器,摈弃基本一样,可靠性照旧相比高的。 请合理期骗,相比点等要遐想的相比躲避才可以。第十二、检测内存分派大小反调试有莫得发现?当设施被OD带HIDEOD插件调试的时候,其分派的内存底线和上线跟正常的情况是不一致的。期骗这点,咱们可以遐想一个反OD的函数。(其实其作用就是检测HIDEOD插件用的,只消开启该插件,就能被发现) 需要API: GetProcessWorkingSetSize 咱们通盘测试下: 掀开VB6.0 新建工程 添加COMMAND1 在通用部分添加: 我是代码肇始线———————————————————————————————— Private Declare Function GetCurrentProcess Lib "kernel32" () As Long Private Declare Function GetProcessWorkingSetSize Lib "kernel32" (ByVal hProcess As Long, lpMinimumWorkingSetSize As Long, lpMaximumWorkingSetSize As Long) As Long 我是代码终结线———————————————————————————————— 然后咱们编写函数 我是代码肇始线———————————————————————————————— Private Function JianNeicun(biggest As Long, smallest As Long) As Boolean '咱们这里的最大值是1413120,最小值是204800 Dim yx As Long Dim ax As Long Dim bx As Long Dim cx As Long yx = GetCurrentProcess '赢得ID ax = GetProcessWorkingSetSize(yx, bx, cx) '赢得内存分派信息 'MsgBox bx, , "min" '这里可以自行掀开,以细目你的设施实质最小内存分派 'MsgBox cx, , "max" '这里可以自行掀开,以细目你的设施实质最大内存分派 If bx <> smallest Or cx <> biggest Then JianNeicun = True '发现调试器OD Else JianNeicun = False End If End Function 我是代码终结线———————————————————————————————— 若何使用? 请看: 我是代码肇始线———————————————————————————————— Private Sub Command1_Click() If JianNeicun(1413120, 204800) = True Then '这个值可以修改为你的设施的实质内存请托 MsgBox "发现调试器OD", , "教唆" Else MsgBox "莫得发现调试器", , "恭喜" End If End Sub 我是代码终结线———————————————————————————————— 恶果图: 正常: 发现调试器OD(HIDEOD) 相通,每一个遐想的反调试都需要躲避些,否则不就等于告诉别东说念主“快来措置我”吗?第十三、窗口置顶反调试 这个仅仅些小技巧,拼凑低级破解者还好,拼凑有些训诫的破解者就容易过了。 简要旨趣:期骗API,将本设施窗口置顶,覆盖其他设施界面,使得破解者无法看到其他内容,也就无法看到调试器了。最佳在注册过程中使用,以免影响用户其他功课。而且在置顶后,不要用MSGBOX函数,否则会卡死掉,平直用LABEL或者TEXT炫耀摈弃和信息即可。注册收尾后不要忘了祛除置顶(平直关闭也可以) 需要使用API: SetWindowPos 代开VB6.0 新建工程 添加COMMAND1和两个LABEL 在通用里添加如下代码: 我是代码肇始线———————————————————————————————— Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long Private Const HWND_TOPMOST = -1 Private Const SWP_NOMOVE = &H2 Private Const SWP_NOSIZE = &H1 Private Const SWP_NOZORDER = &H8 我是代码终结线———————————————————————————————— 遐想以下两个过程 我是代码肇始线———————————————————————————————— Private Sub SetFormTopmost() '该过程是使窗口置顶 MAXme SetWindowPos Form1.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOZORDER + SWP_NOMOVE + SWP_NOSIZE End Sub Private Sub MAXme() '该过程是使窗口占满整个屏幕 Me.Left = 0 Me.Top = 0 Me.Width = Screen.Width Me.Height = Screen.Height End Sub 我是代码终结线———————————————————————————————— 调用如下: 我是代码肇始线———————————————————————————————— Private Sub Command1_Click() If Val(Text1.Text) = 123456 Then Label2.Caption = "注册奏效,您可以关闭注册窗口了" Text1.Enabled = False Else Label2.Caption = "授权码失实,请再行输入" End If End Sub Private Sub Command1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) '在鼠标涉及按钮的时候启动置顶 '实质应用中,你可以我方遴聘个躲避的地点来启动 SetFormTopmost End Sub 我是代码终结线———————————————————————————————— 编译即可 当用户注册的时候,鼠标涉及COMMAND后自动最大化窗口何况置顶,覆盖肤浅调试器。 如果用户强行断点COMMAND CLICK事件想追踪注册算法的话,会引发窗口锁死,OD的无法炫耀,本设施锁定无法链接操作。在一定程度上阻滞了调试。一般来说破解这个反调试妙技是爆破和修改相关CALL调用,因此需要咱们的CRC32等及反调试妙技相趋附。 该注册窗口可以作为你的设施的注册页面,其他页面没必要置顶。 咱们望望恶果: 第十四、检测按键,一般是F2(断点)、F7(单步步进)、F8(逐过程步过)、F9(运行)一般设施都是用不到F2、F7、F8、F9等,而OD刚好都需要,破解者破解过程中,会赓续的按这些键,这个恐怕公共都养成风俗了,用鼠方向话相比弯曲。期骗公共的风俗和不把稳,咱们可以检测这些按键,发现按键后立即警告等,疏忽你处理了。 这个很好玩,公共来实验下: 掀开VB6.0 新建工程,添加COMMAND1 和一个TIMER1(计时器) 成立为掀开,100微秒。 在通用添加: 我是代码肇始线———————————————————————————————— Option Explicit Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer '界说API调用 我是代码终结线———————————————————————————————— 接着遐想一个检测按键并作念相应的SUB 我是代码肇始线———————————————————————————————— Private Sub Anjian() If GetAsyncKeyState(vbKeyF2) Then MsgBox "你按了F2键,怀疑你在用OD断点", , "警告" End End If If GetAsyncKeyState(vbKeyF7) Then MsgBox "你按了F7键,怀疑你在用OD调试", , "警告" End End If If GetAsyncKeyState(vbKeyF8) Then MsgBox "你按了F8键,怀疑你在用OD调试", , "警告" End End If If GetAsyncKeyState(vbKeyF9) Then MsgBox "你按了F9键,怀疑你在用OD调试", , "警告" End End If End Sub 我是代码终结线———————————————————————————————— 调用如下: 我是代码肇始线———————————————————————————————— Private Sub Command1_Click() MsgBox "本按无对应算法注册,仅仅演示监视按键来反调试,假定破解者追踪本按钮事件", , "提醒" End Sub Private Sub Timer1_Timer() '用计时器来经常检测按键 Anjian End Sub 我是代码终结线———————————————————————————————— 望望恶果: 其他按钮也能检测出来,恶果还好的。在设施运行的时候,如果下F2断点,相通可以发出警告教唆。第十五、检测前台窗口反调试当你的设施的注册按钮被点击,或者其他互动事件发发生,设施窗体就调到前台位置了。 咱们可以据此检测是否有调试行径 期骗API:GetForegroundWindow 掀开VB6.0 新建工程,添加注册按钮 在通用部分添加: 我是代码肇始线———————————————————————————————— Private Declare Function GetForegroundWindow Lib "user32" () As Long 我是代码终结线———————————————————————————————— 编写函数: 我是代码肇始线———————————————————————————————— Private Function JianWindow() As Boolean Dim abcg As Long abcg = GetForegroundWindow If abcg = Me.hWnd Then JianWindow = False Else JianWindow = True End If End Function 我是代码终结线———————————————————————————————— 调用如下: 我是代码肇始线———————————————————————————————— Private Sub Command1_Click() '如松懈点在这里,那么就会被咱们发现调试 If JianWindow = True Then MsgBox "你在调试我", , "教唆" Else MsgBox "莫得发现调试", , "恭喜" End If End Sub 我是代码终结线———————————————————————————————— 恶果如图: 第十六、SeDebugPrivilege检测调试器简要旨趣:当调试器调试设施的时候,设施的赢得了对csrss.exe程度的读取权柄,而正常情况下,设施是莫得这个权限的,咱们来检测设施是否具备读取csrss.exe的能力来判断是否被调试。针对OD的话,如果HIDEOD插件开启注重的话,那就没用了。 掀开VB6.0 新建工程 添加COMMAND1 在通用部分加入代码: 我是代码肇始线———————————————————————————————— Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long Private Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, lppe As PROCESSENTRY32) As Long Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, lppe As PROCESSENTRY32) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal blnheritHandle As Long, ByVal dwAppProcessId As Long) As Long     Const MAX_PATH As Integer = 260 Const TH32CS_SNAPPROCESS As Long = 2& Private Type PROCESSENTRY32     dwSize As Long     cntUsage As Long     th32ProcessID As Long     th32DefaultHeapID As Long     th32ModuleID As Long     cntThreads As Long     th32ParentProcessID As Long     pcPriClassBase As Long     dwFlags As Long     szExeFile As String * 1024 End Type 我是代码终结线———————————————————————————————— 底下运行编写函数 我是代码肇始线———————————————————————————————— Private Function Opencsrss() As Boolean '发现调试器复返TRUE,莫得发现则复返FALSE On Error GoTo maple Dim Process As PROCESSENTRY32 Dim hSnapShot As Long Dim l1 As Long Dim flag As Boolean Dim mName As String Dim i As Integer Dim pid As Long, WOW As Long '把稳这2个变量就用来存放2个ID hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0&) '竖立程度快照   If hSnapShot Then     Process.dwSize = 1060     If (Process32First(hSnapShot, Process)) Then '遍历第一个程度,赢得PROCESSENTRY32结构       Do         i = InStr(1, Process.szExeFile, Chr(0))       '赢得映像称呼         mName = LCase(Left(Process.szExeFile, i - 1)) '并革新成小写                If mName = "csrss.exe" Then      '是不是WOW.exe              WOW = Process.th32ProcessID    '赢得程度ID         End If       Loop Until (Process32Next(hSnapShot, Process) < 1) '遍历所有程度直到复返值为False     End If     l1 = CloseHandle(hSnapShot)     End If        If WOW <> 0 Then        Dim jiejie As Long    jiejie = OpenProcess(1&, -1&, WOW)    '测试掀开能力    If jiejie <> 0 Then    Opencsrss = True    Else Opencsrss = False    End If              End If Exit Function maple: Opencsrss = False End Function我是代码终结线———————————————————————————————— 调用如下: 我是代码肇始线———————————————————————————————— Private Sub Command1_Click() If Opencsrss = True Then MsgBox "发现调试器,请关闭", , "警告" Else MsgBox "莫得发现调试", , "恭喜" End If End Sub 我是代码终结线———————————————————————————————— 恶果如图: 第十七、要道部分算法的时候锁定鼠标打扰调试分析这个是个示范,其实你也可以编写针对键盘的顽固,来抗调试。 掀开VB6.0 新建工程 添加一个TEXT1 添加一个COMMAND1 添加一个TIMER1 遴聘FORM1的BORDERSTYLE为NONE,然后在FORM1上画一个关闭叉叉,用IMAGE1来覆盖,事件放在IMAGE1 CLICK事件里来模拟关闭按钮。 TIMER1的频率成立为100微秒,默许掀开。革新FORM1的默许启动位置为屏幕中心。 在通用部分添加: 我是代码肇始线———————————————————————————————— Private Type RECT           left   As Long           top   As Long           right   As Long           bottom   As Long   End Type   Private Type POINT           x   As Long           y   As Long   End Type   Private Declare Sub ClipCursor Lib "user32" (lpRect As Any)   Private Declare Sub GetClientRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT)   Private Declare Sub ClientToScreen Lib "user32" (ByVal hWnd As Long, lpPoint As POINT)   Private Declare Sub OffsetRect Lib "user32" (lpRect As RECT, ByVal x As Long, ByVal y As Long) 我是代码终结线———————————————————————————————— 底下写成过程 我是代码肇始线———————————————————————————————— Private Sub Suoding() '锁定鼠标范围的过程 Dim client     As RECT Dim upperleft     As POINT GetClientRect Me.hWnd, client upperleft.x = client.left upperleft.y = client.top ClientToScreen Me.hWnd, upperleft OffsetRect client, upperleft.x, upperleft.y ClipCursor client End Sub 我是代码终结线———————————————————————————————— 其他调用和算法: 我是代码肇始线———————————————————————————————— Private Sub Timer1_Timer() Suoding '每过100微秒锁定一次,负责鼠标脱离 '遐想念念路是设施通盘动就自动锁定鼠标不离开设施范围,除非收尾掉设施,或者完成注册为止 End Sub Private Sub Image1_Click() '自界说关闭按钮,画出来的,哈哈哈 End End Sub Private Sub Command1_Click() If Val(Text1.Text) = 123456 Then MsgBox "恭喜你,注册奏效", , "恭喜": End Else MsgBox "注册码失实哦", , "失实" End If End Sub 我是代码终结线———————————————————————————————— 可见设施调用计时器每100微秒锁定一次鼠标范围到咱们设施我方身上,一启动设施的时候就阐扬作用,使得破解者来不足使用其他设施,包括调试器。 注册奏效或者单击关闭叉叉后就可以退出设施,具有一定的实质真义,要去用户注册时候不可动别的设施,平直注册或者就别注册。 破解者很可能会关闭咱们的计时器,或者修改设施以回避这个凡东说念主的锁定,是以咱们可以合营CRC32等自校验或者其他抗调试妙技趋附在通盘,使得这个锁定结巴易被去除。 恶果还可以。 请看图效: 第十八、GetStartupInfo反调试 今天看了看前东说念主的经典,发现可以在Vb里达成GetStartupInfo反调试 掀开VB6.0 新建工程 添加COMMAND1 在通用里: 我是代码肇始线———————————————————————————————— Private Declare Sub GetStartupInfo Lib "kernel32" Alias "GetStartupInfoA" (lpStartupInfo As STARTUPINFO) Private Type STARTUPINFO '(createprocess)     cb As Long     lpReserved As Long     lpDesktop As Long     lpTitle As Long     dwX As Long     dwY As Long     dwXSize As Long     dwYSize As Long     dwXCountChars As Long     dwYCountChars As Long     dwFillAttribute As Long     dwFlags As Long     wShowWindow As Integer     cbReserved2 As Integer     lpReserved2 As Long     hStdInput As Long     hStdOutput As Long     hStdError As Long End Type 我是代码终结线———————————————————————————————— 编写函数: 我是代码肇始线———————————————————————————————— Private Function StartAnti() As Boolean Dim Huanjing As STARTUPINFO GetStartupInfo Huanjing If Huanjing.dwX <> 0 Or Huanjing.dwY <> 0 Or Huanjing.dwXCountChars <> 0 Or Huanjing.dwYCountChars <> 0 Or Huanjing.dwFillAttribute <> 0 Or Huanjing.dwXSize <> 0 Or Huanjing.dwYSize <> 0 Then StartAnti = True Else StartAnti = False End If End Function 我是代码终结线———————————————————————————————— 调用如下: 我是代码肇始线———————————————————————————————— Private Sub Command1_Click() If StartAnti = True Then MsgBox "发现调试器,请关闭", , "警告" Else MsgBox "莫得发现调试器", , "通过" End If End Sub Private Sub Form_Load() If StartAnti = True Then MsgBox "发现调试器,请关闭", , "警告" Else MsgBox "莫得发现调试器", , "通过" End If End Sub 我是代码终结线———————————————————————————————— 恶果如图(遵循很高) 好累,第三章第一讲到此收尾,咱们追思下,主要讲了以下几个内容: 1、        检测父程度反RING3调试器 2、        FindWindow检测明锐窗口 3、        EnumChildWindows摆设所有窗体,检测明锐字符 4、        检测程度名字来排雷 5、        期骗IsDebuggerPresent检测调试器 6、        加密字符串,失实教唆携带罗网 7、        期骗SEH进行反追踪 8、        加VM或者P-CODE编译 9、        平直反汇编修改代码(破解者用的招数,咱们也可以用来退避) 10、        躲避性遐想 11、        步长、时值反调试(包含启动时候检测) 12、        检测内存分派大小反调试 13、        窗口置顶反调试 14、        检测按键,一般是F2(断点)、F7(单步步进)、F8(逐过程步过)、F9(运行) 15、        检测前台窗口反调试 16、        SeDebugPrivilege检测调试器 17、        要道部分算法的时候锁定鼠标打扰调试分析 18、        GetStartupInfo反调试 其实方法多种各样,远不单这些,奈何我涉及加密解密时候尚短,训诫太少,水平太差,暂时无法翔实给公共演示其他的反调试妙技,公共可以看下《加密解密第三版》,对你也会有启发。 这篇著作写了几天,主要是白日太忙,金工实习,压根没时候写著作,发表得有些晚。第三章        第二讲 防静态反汇编分析这一讲将是简短至极,敬佩公共也累了,我也写不了若干。 VB防静态反汇编,有以下阶梯: 1、        修改设施头,使得一些识别VB的反汇编用具无法识别 2、        加壳,最佳是保护壳中的猛壳,可以很有用得保护你的资源和代码 3、        造谣机保护要道过程和代码 4、        将设施作为子设施四肢数据模式储存在母设施里(借鸡生蛋),事前先经过XOR等的加密,运行母设施的时候XOR逆算回子设施数据,然后开释到某个地点现实。 5、        P-CODE神气编译,然后抑遏设施着手等位置,也有一定的恶果 6、        多量使用假信息,诱惑静态分析的破解者。 7、        按照高手的话说,似乎可以依靠VB内联汇编来添加花指示来抗静态分析。 应该还有更多方法,我知说念的太少了,^_^ 好了,《VB 分享软件防破解遐想技艺初探(三)》就写到这里吧,元气心灵差未几奢靡了。 下一篇《VB 分享软件防破解遐想技艺初探(四)》咱们将讲述:注册码系统(算法部分,中枢内容)和加壳防脱壳,预计那篇会相比短些。 照旧老规则,如若恐怕候,有元气心灵,有空,有能力,我将链接写下去,戮力完成整个系列,给VB软件的防破解边界加入催化剂。作家:爱琴海[SCG] 2008/09/10 (转载请保留该信息)

[培训]《安卓高档研修班(网课)》月薪三万策动cccc77,掌合手调试、分析还原ollvm、vmp的方法,定制art造谣机自动化脱壳的方法

巨屌twitter 上传的附件: image001.jpg (107.03kb,1285次下载) image003.jpg (30.08kb,1269次下载) image004.jpg (180.76kb,1286次下载) image006.jpg (161.50kb,1280次下载) image008.jpg (11.18kb,1259次下载) image009.jpg (180.89kb,1274次下载) image011.jpg (85.87kb,1260次下载) image013.jpg (98.53kb,1255次下载) image015.jpg (40.29kb,1241次下载) image017.jpg (65.08kb,1240次下载) image019.jpg (8.68kb,1223次下载) image020.jpg (9.92kb,1223次下载) image021.jpg (9.09kb,1225次下载) image022.jpg (8.79kb,1222次下载) image023.jpg (9.44kb,1216次下载) image024.jpg (6.90kb,1199次下载) image025.jpg (191.00kb,1210次下载) image027.jpg (164.09kb,1218次下载) image029.png (16.12kb,1195次下载) image031.jpg (22.20kb,1196次下载) image033.jpg (21.35kb,1189次下载) image034.jpg (169.22kb,1196次下载) image036.jpg (11.88kb,1184次下载) image037.jpg (11.97kb,1186次下载) image038.jpg (12.56kb,1179次下载) image039.jpg (11.88kb,1177次下载) image040.jpg (8.48kb,1175次下载) image041.jpg (162.10kb,1195次下载) image043.jpg (7.48kb,1176次下载) image044.jpg (164.56kb,1182次下载) image046.jpg (156.83kb,1187次下载) image048.jpg (8.83kb,1157次下载) image049.jpg (170.69kb,1177次下载) image051.jpg (38.84kb,1151次下载) image053.jpg (39.43kb,1156次下载) image055.jpg (151.56kb,1159次下载) image057.jpg (154.74kb,1150次下载) image059.jpg (138.50kb,1148次下载) image061.jpg (165.42kb,1138次下载) GetStartupInfo反调试.JPG (164.02kb,1087次下载) (已更新)VB 分享软件防破解遐想技艺初探(三)全部工程文献和代码.part1.rar (1.24MB,414次下载) (已更新)VB 分享软件防破解遐想技艺初探(三)全部工程文献和代码.part2.rar (1.14MB,530次下载)

上一篇:巨臀 porn 鹤壁飞鹤外贸业务员招聘

下一篇:女同 视频 NVIDIA运行方式下载不了何如办 NVIDIA运行方式下载不了的贬责法子【详解】

Powered by 洋萝莉系 @2013-2022 RSS地图 HTML地图

Copyright Powered by站群系统 © 2013-2024

创建或修改目录:/www/wwwroot/104.219.215.234/data 失败!
JzEngine Create File False