逆向游乐园第二关

编程知识 更新时间:2023-04-17 10:53:20

目录

  • 预备知识
    • 1.关于调试器和反编译工具简介
    • 2.PE查壳工具
    • 3.汇编指令
    • 4.寄存器
    • 5.Little-endian(小端序)
  • 实验目的
  • 实验环境
  • 实验步骤一
  • 实验步骤二
  • 实验步骤三

预备知识

1.关于调试器和反编译工具简介

OLLYDBG是一个新的动态追踪工具,将IDA与SoftICE结合起来的思想,Ring 3级32位调试器,非常容易上手,己代替SoftICE成为当今最为流行的调试解密工具了。同时还支持插件扩展功能,是目前最强大的调试工具。
IDA PRO简称IDA(Interactive Disassembler),是一个世界顶级的交互式反汇编工具,有两种可用版本。标准版(Standard)支持二十多种处理器。高级版(Advanced)支持50多种处理器。
UPX(the Ultimate Packer for eXecutables)是一款先进的可执行程序文件压缩器,压缩过的可执行文件体积缩小50%-70%,这样减少了磁盘占用空间、网络上传下载的时间和其它分布以及存储费用。通过UPX压缩过的程序和程序库完全没有功能损失和压缩之前一样可正常地运行,对于支持的大多数格式没有运行时间或内存的不利后果。UPX支持许多不同的可执行文件格式包含Windows 95/98/ME/NT/2000/XP/CE程序和动态链接库、DOS程序、Linux可执行文件和核心。
Delphi Decompiler是一个用来反编译Delphi编写的程序的工具。Delphi Decompiler反编译成功后,能够查看函数过程等,是一款Delphi反编译利器!
WinHex是一个专门用来对付各种日常紧急情况的小工具。它可以用来检查和修复各种文件、恢复删除文件、硬盘损坏造成的数据丢失等。同时它还可以让你看到其他程序隐藏起来的文件和数据。总体来说是一款非常不错的16进制编辑器。得到ZDNetSoftwareLibrary五星级最高评价,拥有强大的系统效用。

2.PE查壳工具

PEiD(PE Identifier)是一款著名的查壳工具,其功能强大,几乎可以侦测出所有的壳,其数量已超过470种PE文档的加壳类型和签名。
ExEinfo PE是一款免费的Win32可执行程序检查器,它可以检查程序的打包方式,exe保护等,可以帮助开发人员对程序进行编译。

3.汇编指令

4.寄存器

EAX是“累加器”(accumulator),它是很多加法乘法指令的缺省寄存器。
EBX是“基地址”(base)寄存器,在内存寻址时存放基地址。
ECX是计数器(counter),是重复(REP)前缀指令和LOOP指令的内定计数器。
EDX则总是被用来放整数除法产生的余数。
ESI/EDI分别叫做“源/目标索引寄存器”(source/destination index),因为在很多字符串操作指令中,DS:ESI指向源串,而ES:EDI指向目标串。
EBP是“基址指针”(BASE POINTER),它最经常被用作高级语言函数调用的“框架指针”(frame pointer)。

5.Little-endian(小端序)

数据的高位字节存放在地址的高端,低位字节存放在地址低端。

实验目的

通过该实验了解调试工具和反编译工具的使用方法,能够通过分析样本中的详细信息,进行程序的爆破或者算法的还原突破程序的限制,本次实验主要针对Delphi编写的程序。

实验环境


服务器:Windows XP SP3,IP地址:随机分配
辅助工具:Ollydbg、PEiD 0.95、ExeinfoPE、IDA Pro v6.8、Delphi Decompiler、UPX UnPacker、WinHex
破解程序:CKme、CKme002、aLoNg3x.1(位于桌面CrackMe文件夹)

实验步骤一

首先利用侦壳子、工具对样本(三个CrackMe)进行侦测分析,判断是否存在保护,然后对于存在暗桩的程序进行一部处理,最后对算法过程等分析回溯。
任务描述:对第一个CrackMe,CKme进行外壳分析,然后对其暗桩处理,算法回溯,以达到分析学习的目的。
在本次CrackMe中,作者给予了一定的说明,一定要阅读一下,对我们后期的分析有启发式帮助,一定不能放过任何一点别人给予的看似无用的资料。

感觉比较重点的提示,已标出。
那么,我们现在打开ExeInfo对其先做一步分析识别。

作者确实没有欺骗我们,确实Delphi写的程序,并且得知我们的CM(以下CM代指CrackMe)没有加密。下一步是运行看看,有没有什么值得我们利用的关键点,说白了,还是继续搜集信息(你可以理解为踩点~~)。

确实没有确定钮,鼠标放上面有提示说,如果用户名,和注册码正确,会出现“朱茵”小姐的照片,话说朱茵是谁?麻烦告诉我一下,我真不知道。跑题了,嗯,我猜这个灰色的框可能是用来显示图片的,也可能是个图片按钮,只是单击后,用户名和注册码不正确不提示而已,何况正确也不提示你,只是出来一个妹纸的照片。对于本次并不是C语言类型的那种非封装性的,好下断点,何况此次没有任何提示,bp MessageBox*就不考虑了。
打开OD,将我们程序拖进去,看看作者有没有留给我们可参考的字符串信息呢。

卧槽,这是什么鬼,好像发现了一个切入点哎~

那么跟进去看看~

0045803B  |. /75 76         jnz short CKme.004580B3
0045803D  |. |33DB          xor ebx,ebx
0045803F  |> |8D55 E4       /lea edx,[local.7]
00458042  |. |8B86 D4020000 |mov eax,dword ptr ds:[esi+0x2D4]
00458048  |. |E8 FBB2FCFF   |call CKme.00423348
0045804D  |. |8B45 E4       |mov eax,[local.7]
00458050  |. |E8 27BBFAFF   |call CKme.00403B7C
00458055  |. |83C0 03       |add eax,0x3
00458058  |. |8D55 E8       |lea edx,[local.6]
0045805B  |. |E8 A4FAFAFF   |call CKme.00407B04
00458060  |. |FF75 E8       |push [local.6]
00458063  |. |8D55 E0       |lea edx,[local.8]
00458066  |. |8B86 D4020000 |mov eax,dword ptr ds:[esi+0x2D4]
0045806C  |. |E8 D7B2FCFF   |call CKme.00423348
00458071  |. |FF75 E0       |push [local.8]
00458074  |. |8D55 DC       |lea edx,[local.9]
00458077  |. |8BC3          |mov eax,ebx
00458079  |. |E8 86FAFAFF   |call CKme.00407B04
0045807E  |. |FF75 DC       |push [local.9]
00458081  |. |8D45 FC       |lea eax,[local.1]
00458084  |. |BA 03000000   |mov edx,0x3
00458089  |. |E8 AEBBFAFF   |call CKme.00403C3C
0045808E  |. |43            |inc ebx
0045808F  |. |83FB 13       |cmp ebx,0x13
00458092  |.^|75 AB         \jnz short CKme.0045803F
00458094  |. |33D2          xor edx,edx                              ;  CKme.<ModuleEntryPoint>
00458096  |. |8B86 F0020000 mov eax,dword ptr ds:[esi+0x2F0]
0045809C  |. |E8 BFB1FCFF   call CKme.00423260
004580A1  |. |A1 20B84500   mov eax,dword ptr ds:[0x45B820]
004580A6  |. |83C0 70       add eax,0x70
004580A9  |. |BA 14814500   mov edx,CKme.00458114                    ;  恭喜恭喜!注册成功
004580AE  |. |E8 9DB8FAFF   call CKme.00403950
004580B3  |> \33C0          xor eax,eax

呦呵!0045803B有一处jnz跳转,如果不符就直接跳过正确的注册信息。那么凭借我们男生,不,男人的第八感,这是一个可爆破用的关键跳转。
那么我们翻到该函数头部,下个断点跑跑看,他是怎么处理的。

注:重新载入,F2下的断点,不会消失,直接运行(F9)不起来的可以重载一次试试。

四处点点,发现点了灰色的,跳到我们下断点的位置了。
猜测男人的第八感是蛮准的,这是一个图片Button。
单步分析走起。
此处貌似有个没用的循环,可以使用运行到指定位置跳过,可以理解为先F2下断,F9运行到下断位置。

开始拿出来我们的用户名了:

正如上文所说的0045803B处,JNZ确实能爆破,但是看到了关键比较的位置,上面的运算,并没有涉及到用户名、注册码的生成。

00457EF3  |.^\75 AB         \jnz short CKme.00457EA0
00457EF5  |.  83BE 0C030000>cmp dword ptr ds:[esi+0x30C],0x3E
00457EFC  |.  75 0A         jnz short CKme.00457F08
00457EFE  |.  C786 0C030000>mov dword ptr ds:[esi+0x30C],0x85
00457F08  |>  33DB          xor ebx,ebx

但是此处对标志,0x85进行判断的。

上我们的神器Delphi Decompiler(后简称DP),打开载入我们要调试的程序看看。

我们可以看到一个很奇怪的消息事件,chkcode。感觉我离真理又近了一步。
在OD中:

写入我们的checkcode地址457c40,下断,去掉之前的断点,我们运行起来,在填写第二个编辑框(注册码)的时候,发现刚填入第一个字符就断掉了。心理不禁大喊F***,好猥琐的思路,给Edit绑定了按键消息……此处进行比较,而那个button起到的作用仅仅是根据checkcode判断是否显示图片。

那我们单步走着:

此处取了一下用户名长度然后加了5保存到下面用:

取出来一节数据,他想干嘛,继续走:

又读了一段:

读取name(合天的GG、MM们不要打我,我真的不是故意打错成hetiam的)
将两串固定的值和name拼合到一起:

OK,猜测此处是我们的注册码。
算法就是:黑头Sun Bird+(Name长度+5)+dseloffc-012-OK+Name。
我们向下单步,会看到:

F7进入457D2F处的:

开始比较。如果相同:

设置0x3E标志位。

两个消息函数,一个是Panel的单击,一个是Panle1的双击。分别跟进去看看。咦,单击不是我们之前用字符串跟踪到的那个函数么,那么看看双击,DbClick。好坑的感觉……因为这样的,等不到双击的时候,单击一下OD就给你断下来了。
进入单击函数,会发现正是我们通过字符串找到那个函数,仅仅检测:

0x85,那么我们看看双击呢。
进入后,单步分析到此处,就一切明了了。

总结一下就是在键入注册码的时候就进行判断是否输入正确,如果正确就设置0x3E标志,在点击图片的时候,我单击没有反应,于是我们多次点击会激发双击事件,判断是否设置了0x3E,如果设置了那么设置0x85。再次单击的时候就会显示出传说中的女神的头像了,那么问题来了朱茵是谁?告诉我。

实验步骤二

任务描述:上一次ajj对Sun Bird兄的考验很快被Sun Bird兄搞定,ajj不服又展开一轮攻势。而我们本次就应该利用查壳工具和Delphi Decompiler、OllyDbg相辅,破解难关分析出来其算法或者爆破掉它。
此次ajj又附给了Sun Bird一端话,我们来看看里面有什么提示吧。

给人有多次防护的感觉,所谓层层设防。对于注册问题,那么我们就得多注意细节了,万一注册成功了,我们什么都没有看到,岂不是醉了~
好,我们先对其进行外围侦测,扫壳。

咦,有一个压缩壳UPX -> Markus & Laszlo ver. [ 0.99 ] <- from file. ( sign like UPX packer )。下方还有提示告诉你怎么解决这个壳子unpack “upx.exe -d” from http://upx.sf or any UPX/Generic unpacker。简单说这是一个运行时解压器,你可以理解成咱们常用的压缩包,不过这个压缩包是双击自解压自运行,没有环境的依赖性。给这个打包的程序,也可以还原打包的程序,也就是上文提到的用upx.exe –d。本次不讲解脱壳,使用简单的脱壳器对其处理即可(脱壳问题可以等以后专题或者私下交流)。
是用的是skylly123的UPX静态脱壳器(UPX UnPacker),打开将我们的要脱壳的程序拖入该程序界面即可,同时会生成原来文件的备份文件*.exe.bak。


细心的人会发现软件大了许多,这就是UPX的压缩作用,当年带宽很贵也很小,所以发明了这种神奇的东西。
脱壳后运行一下,正常,说明脱壳成功,然后我们瞎点点,看看这个东西怎么玩。

会发现注册按钮并没有什么卵用,也可能是无提示注册,但是发现写着人之初,性本善这样的滚动式按钮被点击后会出现注册不成功的样子,既然有这么好的字符串,我们就用OD的字符串参考功能试试看吧!

嗯,真的有,我们跟进去看看,跟成功的那串字符串,双击进入。

会看到:

我们向上翻翻,在这个函数的头部下一个断点,F9跑跑看。
What?我还没点呢,程序怎么就断在这里了?(手速快的同学当我没说——)那么我们大胆的猜测一下,这是利用时间函数(Timer,定时器,即根据用户设定的毫秒数,实现每多少毫秒回调一次用户写的自定义的函数)实现的。
往下跟,会发现有四次标志判断,有一次不符合就跳转到程序的尾部,越过注册正确的信息。那么,我们把这些比较后的跳转指令,nop掉即可实现爆破。

那么问题来了。这三次比较的标志0xC34、0x230D、0xF94、0x3E7是怎么来的呢?
这个时候该我们的神器Delphi Decompiler上场了。

好多事件,我们竟然看到了Timer1Timer和Timer2Timer,那么猜测大概是我们所想定时器问题应该是对的。

是Timer2的事件。
看到了这些事件,我蛋疼了,但是做逆向就是蛋疼的事情,我们来一个一个的分析吧。
首先我们在4473E4这个第一次判断上:

可以看到两个修改该处的地址很近,跟进去:

往上翻会发现:

446C1C可以参考Delphi Decompiler中的Frome Create事件,地址是一样的。我们回到修改0xC34的地方。

00446D49  |.  BA EC6D4400   mov edx,CKme002.00446DEC                 ;  X:\ajj.126.c0m\j\o\j\o\ok.txt
00446D4E  |.  8D85 30FEFFFF lea eax,[local.116]
00446D54  |.  E8 EDE7FBFF   call CKme002.00405546
00446D59  |.  8D85 30FEFFFF lea eax,[local.116]
00446D5F  |.  E8 07EAFBFF   call CKme002.0040576B
00446D64  |.  E8 8BBAFBFF   call CKme002.004027F4
00446D69  |.  85C0          test eax,eax
00446D6B  |.  75 4B         jnz short CKme002.00446DB8
00446D6D  |.  8D55 FC       lea edx,[local.1]
00446D70  |.  8D85 30FEFFFF lea eax,[local.116]
00446D76  |.  E8 5DD1FBFF   call CKme002.00403ED8
00446D7B  |.  E8 44BAFBFF   call CKme002.004027C4
00446D80  |.  8B45 FC       mov eax,[local.1]
00446D83  |.  BA 146E4400   mov edx,CKme002.00446E14
00446D88  |.  E8 0BCFFBFF   call CKme002.00403C98
00446D8D  |.  74 0A         je short CKme002.00446D99                ;  此处赋值,怎能跳转?
00446D8F  |.  C783 04030000>mov dword ptr ds:[ebx+0x304],0xC34
00446D99  |>  8D85 30FEFFFF lea eax,[local.116]
00446D9F  |.  E8 44E8FBFF   call CKme002.004055E8
00446DA4  |.  E8 1BBAFBFF   call CKme002.004027C4
00446DA9  |.  B2 01         mov dl,0x1
00446DAB  |.  8B83 F0020000 mov eax,dword ptr ds:[ebx+0x2F0]
00446DB1  |.  E8 EED1FDFF   call CKme002.00423FA4
00446DB6  |.  EB 0A         jmp short CKme002.00446DC2
00446DB8  |>  C783 04030000>mov dword ptr ds:[ebx+0x304],0xC34       ;  此处也赋值了0xC34

向上看我们可以看到,他打开了X:\ajj.126.c0m\j\o\j\o\ok.txt这个文本文档,在00446D49处获得打开文档的地址,下面的call是对该值检测是否为空,紧接着该call的00446D5F处是打开文件,打开失败就跳飞了,那么我们去创建一下这个文件。What?你告诉我没有X这个盘,其实我也没有,两个方案,你可以找一个非系统盘修改他的盘符,而我懒了path了一下程序,将X改成了D(改成C也可以的)。
打开WinHex,将程序拖进去:

搜索关键字ajj.126,点击OK。

将X改成D(或者你喜欢的)。直接选中X按下D键就行。我们另存为一下path过的程序。

我保存为了名为CKme002_change.exe。
那么这是个文本文档,里面必然有内容,载入我们Ptah后的程序,来到之前位置。我们重点看00446D83处:

可以看到CALL之前给了一值61 6A 6A D0 B4 B5 C4 43 4B 6D 65 D5 E6 C0 C3 21 FF FF(ajj写的CKme真烂!),对于文本内容进行比较,我们可以跟进去00446D88的CALL:

清晰的比较。我们用WinHex 16进制的形式,将值写入到ok.txt。为什么用16进制写入?注意到没,我们字符串是以00结尾的,而在00前面有FF这个不可见字符,只能用16进制写入了。

写好后我们打开path过的文件,会发现多出来一个Edit。

那么我们得输点什么吧,我点,我点。X!竟然还是不能输入,ajj大真是煞费苦心啊。看看窗口启动函数,再看看DD(Delphi Decompiler)。细心的还注意到了Edit2的双击事件,我一开始也没有注意到这个问题。但是注意界面,只有一个Eidt,这个2课不是无缘无故的来的。由Delphi Decompiler可知:

Edit2的ID是0x2F0。
在OD看其创建函数,会注意到:

创建的Edit2禁用了。通过遍历所有函数,发现在Panel1的双击事件中发现:

对其进行了赋值操作,很明显dex的dl是决定Edit2是否被禁用的关键。那么Panel1被双击的时候0x29D怎么来的呢?我们还是:


00446D23给了该地址处的初始值0x28E,而我们需要0x29D。在00446FCB处有add可以对它进行增值,其他地方没有合适的得到29D的东西。我看看该地址处是什么鬼。


咦~按钮并不是平白无用的啊,但是注意,莫要左键点击,会响应Click事件,巧不巧会坏事:


修改了一下31c处值为0x3E7。为了得到0x29我们计算一下(0x29D-0x28E)\0x3=

可以得知右键五次,双击一次panel1即可解锁游戏关卡(就是没图的时候双击)。

我们看下一个:

通过参考我们再次回到MovesDown消息函数上面,在此说明一个cl寄存器的作用,已经被其坑了一晚上。cl=0x1的时候,响应右键,cl=0x0响应左键。

左键点一次button1,就会设置0x308处为230D。
对于注册码的验证在Edit2的双击事件上,我们利用DB下断在Edit2上进行跟踪分析。

我们先输入以下我们的注册码。

双击Edit2,断掉。

单步跟踪分析。到此处读入注册码:

比较注册码是否等于0x8长度:

这里肯定不行了,那么我们输入12345678:

比较第二位是否为0x5F(‘’),改成1_2345678,继续试。

比较第六位是否为0x2C(‘,’),那么我们再试1_345,78:

然后该处调用了GetDiskFreeSpaceEx获取磁盘剩余空间:

你可以跟进去此call,再进入一次call即可看到。

此处是一个较为复杂算法,有兴趣的朋友可以跟踪看看,辅以IDA的F5分析。
对0x30C处赋值,此处虽然认为对于我们爆破没有丝毫用:

但是下文中的关键点比较会参照该值。
目前已经解决了前两个了。我们继续看后两关。0x310处通过DB和OD分析可以定位到鼠标的移动到窗口响应的消息上。



可以看到他对0x310进行了赋值,根据鼠标切入窗口的X,Y坐标以及当前滚动到的图片进行判断,然后解决赋值0xF94。但是在解决赋值问题之前,根据Edit2双击事件生成的0x30C结构进行了判断,接着进入了一个Switch语句中,有四个路径,均对314进行赋值(314处的作用是最终与318处比较相等),他的根据也就是我们在0x30C处生成的四种结构。

为了使314和318结果相同,我们可以看一下318处的运算方法,因为每个人电脑磁盘剩余空间不同,产生314结果不同。我们可以右键,查找参考其地址常量。

这些值的增加都在四个图片按钮之上。我们可以分别看一下。

按钮1,左键加0x2右键加0x11。

按钮2左键加0x3,而其右键加0x13。

同理,按钮3的左键加的是0x5右键加的是0x17。

按钮4的左键加的是0x7右键加的是0x18。但是此处,你会迷茫,0x318的初始值是多少?细心的盆友会注意到,我们之前查找所有参考的时候318在第一行有一个赋值语句。

他就是我们初始值的设定。

Xor eax。eax对eax进行了清零操作,然后给了318,也就是说起初始值等于0。那么我们按钮点击对其进行加值减值,等于你电脑上的0x41,0x3D,0x34,0xDF其中一个值即可。
相对于最后一个0x31C,你会记得我们有一个按钮事件没有用,Button1的Click。也就是注册。

点击注册后,注册会变成注册了。对于这个变化稍有延迟,应当注意!因为是用时间函数进行正确判断的。

总结一下就是:
第一步:path程序把,X变成D,新建一个路径为D:\ajj.126.c0m\j\o\j\o\ok.txt的文本文件,文件内容的二进制为20 61 6A 6A D0 B4 B5 C4 43 4B 6D 65D5 E6 C0 C3 21 FF FF,(ajj写的CKme真烂!)这个文件的作用就是会在界面中多显示出一个输入框(下面记为Edit2),但是初始是禁用的,输不了东西。
第二步:打开程序,初始化完成之后,鼠标右键点击“注册”按钮5次。记住一定是鼠标右键,而且必须是点击5次,如果点错不要找我哦;
第三步:在显示图片的图片框中双击没有图片显示的地方,这一步完成之后,输入框Edit2就可以输入内容了。
第四步:输入注册名和Edit2。这两个输入的内容也是有要求的,注册名长度必须是3的倍数,Edit2输入的内容长度必须为8,且第2个字符为‘
’,第6个字符为‘,’。
第五步:输入完成之后,双击Edit2。
第六步:在图片3(“性相近”)出现时,移动鼠标从界面的右下角外部进入程序界面;
第七步:在图片2(“性本善”)出现时,移动鼠标从界面的左下角外部进入程序界面;
第八步:这个根据个人电脑的最终得值进行点击运算。
(ajj大神,是在下输给了delphi)

实验步骤三

任务描述:对CrackeMe进行侦壳分析,然后根据其About-help提示,分析Cancella按钮和OK(被禁用按钮)中算法,输入Name和Codice后,会出现隐藏两个按钮,算是爆破成功。
我们先对其进行查壳分析。

相信我们都熟悉这个工具了,根据提示仍是Delphi写的程序,没有保护或者压缩壳。那么我们载入DB,找到OK按钮的响应和Cancella按钮的响应,由于OK按钮目前不可用(灰色按钮可以考虑EnableWindow()该API下断),我们把重点关注对象放在Cancella上,先记录二者的函数的地址位置。

别着急,别忘了OD的字符串参考,看看有没有懒的办法,不通过分析两个按钮消息。像上两个已经分析哭了—但愿这个不会这么坑。

并没有找到有效的字符串。我们老老实实的对Cancella按钮进行分析。

下断,填参,点击按钮,断住,单步分析。

读入注册码。

读入name。

很明显的爆破点,je变Nop,该即可爆破该处。

我们向上找一个Call,分析其算法。重载,F7单步步入。

比较Name:

检测Name是不是为空。

核心算法,我们可以看到调用了一个递归(其实是个阶乘),F7进去可以一看。

通过eax传递参数,给ebx,先判断ebx是否为0。不为0就开始阶乘了。
我们改成C语言可以改成这样。

有兴趣的朋友可以在自己的机器上编译一下,一开始利用递归求阶乘没看出来,也是罪过。留下一个编译运行结果图。

我们输入注册码,25491223。

输入完OK自动接触封印,Cancella消失,干掉一个。我们来看看OK事件,点一点,我戳,我戳。咦,没反应。DB找Ok的Click消息事件看看,在00442D64。我们F2下断,写如上图之前算出来的第一步算法,点击Cancella(勿忘取消Cancella按钮的消息断点!),消失OK启用。再点OK。断住。

我们单步(F8)走着。

可以看到此处对Cancella的检测,如果爆破此处jnz变为jmp,不管Cancella是否消失都跳过置零。

获取注册码。并转换int型:

获取noma。

再加上此处不跳,可以彻底爆破了整个程序(je变nop)。
我们跟一下算法00442DC1处调用的0042BA0,下面是比较返回值,那么这个必然就是关键算法了。

上图获取注册码和名字。

判断注册码长度。

注意,此处是根据注册码算Name的,取的是注册码的最后一位。

核心算法:

第一次的hetiam修改为ASMVFAAI,点OK。

完美解决!

注册机运行结果。

更多推荐

逆向游乐园第二关

本文发布于:2023-04-13 22:29:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/d8960bf0e2662864ede8fe70a0051661.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:游乐园

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 73788文章数
  • 14阅读数
  • 0评论数