////////////////////////////////////////////////////////////////////////////////////////////
文件名称:手脱加双层壳的病毒(未知壳+UPX壳)
目标程序:双层壳、未知壳名、未知壳版本
操作环境:Windows XP-SP2
使用工具:Ollydbg 1.10版
编写作者:Coderui
编写时间:2007-10-31
联系方式:coderui@163.com
作者博客:
14eK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3S2A6i4K6u0W2j5X3q4A6k6s2g2Q4x3X3g2U0L8$3#2Q4x3V1k6U0L8$3c8W2M7Y4g2A6
---------------------------------------------------------------------------------------------
前言:
本次脱壳的样本程序是一个盗QQ号的木马(QQPass)程序,这个木马所加的壳计较常见,但遗憾的是我不知道这个壳的名字,有些可惜,哎!因为在分析病毒时偶尔常常总会遇见这个壳,所以产生了些兴趣,今天就脱出来写个笔记和大家分享下。
分析:
脱壳前,使用PEID V0.93查壳,显示壳名为:“Nothing found *”。看了下这个程序有6个段,EP区段名分别为:“UPX0、UPX1、.rsrc、女人、.vmp0、.reloc”,初步判断该程序加了至少两层壳,里边有层UPX加密壳,最外边也许是加密壳、也许是压缩壳。
注意:
如果大家分析的是应用软件加的壳,跑飞几次没什么关系。但如果分析的是病毒,那么就要千万小心了,因为有些未知病毒可能破坏力非常大的(比如PE感染型病毒)。不过最好还是养成仔细分析、细心调试的好习惯比较好(我喜欢真实环境,不太喜欢虚拟机,因为感觉不方便)。今天很幸运,只跟了一次,壳直接就脱掉了,哈哈!(^_^).
---------------------------------------------------------------------------------------------
手脱记录:
(OD设置为不忽略任何异常。[F2]:下软断点、[F4]:执行到当前代码处、[F7]:单步步入、[F8]单步步过、[F9]运行。)
---------------------------------------------------------------------------------------------
手脱第一层壳(最外边的未知名壳):
00416000 > 68 77774100 PUSH B64_372_.00417777 ;病毒载入后停在这里,也就是“壳中壳”外边压缩壳的入口点,单步[F8]向下走。
00416005 E8 CE160000 CALL B64_372_.004176D8 ;[F7]:单步步入。
0041600A 8B6D 00 MOV EBP,DWORD PTR SS:[EBP]
0041600D - E9 F90F0000 JMP B64_372_.0041700B
00416012 90 NOP
00416013 90 NOP
00416014 90 NOP
00416015 90 NOP
00416016 90 NOP
00416017 90 NOP
00416018 8A06 MOV AL,BYTE PTR DS:[ESI]
0041601A 46 INC ESI
0041601B 8807 MOV BYTE PTR DS:[EDI],AL
0041601D 47 INC EDI
0041601E 90 NOP
0041601F 90 NOP
00416020 90 NOP
00416021 90 NOP
00416022 B8 004A4100 MOV EAX,B64_372_.00414A00
00416027 FFD0 CALL EAX
00416029 0000 ADD BYTE PTR DS:[EAX],AL
0041602B 0000 ADD BYTE PTR DS:[EAX],AL
.
.
.
004176D8 51 PUSH ECX ;进入后来到这里,单步[F8]向下走。
004176D9 50 PUSH EAX
004176DA 53 PUSH EBX
004176DB 54 PUSH ESP
004176DC 56 PUSH ESI
004176DD 9C PUSHFD
004176DE 52 PUSH EDX
004176DF 57 PUSH EDI
004176E0 55 PUSH EBP
004176E1 68 00000000 PUSH 0
004176E6 8B7424 2C MOV ESI,DWORD PTR SS:[ESP+2C]
004176EA 89E5 MOV EBP,ESP
004176EC 81EC C0000000 SUB ESP,0C0
004176F2 89E7 MOV EDI,ESP
004176F4 0375 00 ADD ESI,DWORD PTR SS:[EBP]
004176F7 8A06 MOV AL,BYTE PTR DS:[ESI]
004176F9 0FB6C0 MOVZX EAX,AL
004176FC 8D76 01 LEA ESI,DWORD PTR DS:[ESI+1]
004176FF ^ FF2485 9C724100 JMP DWORD PTR DS:[EAX*4+41729C] ;单步[F8]到这里后不要跳。
;我们脱壳时的习惯是“遇到回跳要先分析,争取不在循环里绕圈子”。
;这个回跳所跨的代码很长,从004176FF到00417099,而且里边还有N多的跳转,有些朋友可能看起来会头痛,呵呵。
;不过还好,我已经习惯了,不感觉头痛。如果头痛,谁来写脱文呢?嘿嘿。
;经过细致静态分析(用眼睛去看OD中的代码)回跳这一个段的代码,找到了一个需要下断点的可以地址。
;下边是从004176FF到0041700B的代码(因为从004176FF到00417099段里还有小回跳,所以扩充到了0041700B)。
;我做些大概的注解,有经验的一看就懂。大家要先从下边代码段中的004176FF处开始看,因为这里的起始点。
.
.
.
0041700B 8D47 50 LEA EAX,DWORD PTR DS:[EDI+50]
0041700E 39C5 CMP EBP,EAX
00417010 0F87 E1060000 JA B64_372_.004176F7
00417016 89E2 MOV EDX,ESP
00417018 8D4F 40 LEA ECX,DWORD PTR DS:[EDI+40]
0041701B 29D1 SUB ECX,EDX
0041701D 8D45 80 LEA EAX,DWORD PTR SS:[EBP-80]
00417020 29C8 SUB EAX,ECX
00417022 89C4 MOV ESP,EAX
00417024 9C PUSHFD
00417025 56 PUSH ESI
00417026 89D6 MOV ESI,EDX
00417028 8D7C08 C0 LEA EDI,DWORD PTR DS:[EAX+ECX-40]
0041702C 57 PUSH EDI
0041702D 89C7 MOV EDI,EAX
0041702F FC CLD
00417030 F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>
00417032 5F POP EDI
00417033 5E POP ESI
00417034 9D POPFD
00417035 E9 BD060000 JMP B64_372_.004176F7
0041703A 66:8B6D 00 MOV BP,WORD PTR SS:[EBP]
0041703E ^ E9 C8FFFFFF JMP B64_372_.0041700B
00417043 8B45 00 MOV EAX,DWORD PTR SS:[EBP]
00417046 83C5 02 ADD EBP,2
00417049 66:8B00 MOV AX,WORD PTR DS:[EAX]
0041704C 66:8945 00 MOV WORD PTR SS:[EBP],AX
00417050 E9 A2060000 JMP B64_372_.004176F7
00417055 8B45 00 MOV EAX,DWORD PTR SS:[EBP]
00417058 8A55 04 MOV DL,BYTE PTR SS:[EBP+4]
0041705B 83C5 06 ADD EBP,6
0041705E 8810 MOV BYTE PTR DS:[EAX],DL
00417060 E9 92060000 JMP B64_372_.004176F7
00417065 8B45 00 MOV EAX,DWORD PTR SS:[EBP]
00417068 8B00 MOV EAX,DWORD PTR DS:[EAX]
0041706A 8945 00 MOV DWORD PTR SS:[EBP],EAX
0041706D E9 85060000 JMP B64_372_.004176F7
00417072 8B45 00 MOV EAX,DWORD PTR SS:[EBP]
00417075 8A4D 04 MOV CL,BYTE PTR SS:[EBP+4]
00417078 83ED 02 SUB EBP,2
0041707B D3E0 SHL EAX,CL
0041707D 8945 04 MOV DWORD PTR SS:[EBP+4],EAX
00417080 9C PUSHFD
00417081 8F45 00 POP DWORD PTR SS:[EBP]
00417084 ^ E9 82FFFFFF JMP B64_372_.0041700B
00417089 8B45 00 MOV EAX,DWORD PTR SS:[EBP]
0041708C 8B55 04 MOV EDX,DWORD PTR SS:[EBP+4]
0041708F 83C5 08 ADD EBP,8
00417092 8910 MOV DWORD PTR DS:[EAX],EDX
00417094 E9 5E060000 JMP B64_372_.004176F7
00417099 80E0 3C AND AL,3C ;004176FF除的JMP会大回跳到这里,但我们没跳。
0041709C 8B55 00 MOV EDX,DWORD PTR SS:[EBP]
0041709F 83C5 04 ADD EBP,4
.
.
.
00417207 98 CWDE
00417208 83ED 04 SUB EBP,4
0041720B 8945 00 MOV DWORD PTR SS:[EBP],EAX
0041720E ^ E9 F8FDFFFF JMP B64_372_.0041700B
00417213 89EC MOV ESP,EBP
00417215 5A POP EDX
00417216 5D POP EBP
00417217 5F POP EDI
00417218 5A POP EDX
00417219 9D POPFD
0041721A 5E POP ESI
0041721B 59 POP ECX
0041721C 5B POP EBX
0041721D 58 POP EAX
0041721E 59 POP ECX
0041721F C3 RETN ;上次按完[F4]后停在这里。现在我们按[F8]单步步过。
00417220 8B45 00 MOV EAX,DWORD PTR SS:[EBP]
00417223 8B55 04 MOV EDX,DWORD PTR SS:[EBP+4]
00417226 F7D0 NOT EAX
00417228 F7D2 NOT EDX
0041722A 21D0 AND EAX,EDX
0041722C 8945 04 MOV DWORD PTR SS:[EBP+4],EAX
0041722F 9C PUSHFD
00417230 8F45 00 POP DWORD PTR SS:[EBP]
00417233 E9 BF040000 JMP B64_372_.004176F7
00417238 0FB606 MOVZX EAX,BYTE PTR DS:[ESI]
.
.
.
004176A1 83ED 04 SUB EBP,4
004176A4 8945 00 MOV DWORD PTR SS:[EBP],EAX
004176A7 ^ E9 5FF9FFFF JMP B64_372_.0041700B
004176AC 8B45 00 MOV EAX,DWORD PTR SS:[EBP]
004176AF 8B55 04 MOV EDX,DWORD PTR SS:[EBP+4]
004176B2 8A4D 08 MOV CL,BYTE PTR SS:[EBP+8]
004176B5 83C5 02 ADD EBP,2
004176B8 0FADD0 SHRD EAX,EDX,CL
004176BB 8945 04 MOV DWORD PTR SS:[EBP+4],EAX
004176BE 9C PUSHFD
004176BF 8F45 00 POP DWORD PTR SS:[EBP]
004176C2 E9 30000000 JMP B64_372_.004176F7
004176C7 8A06 MOV AL,BYTE PTR DS:[ESI]
004176C9 83ED 02 SUB EBP,2
004176CC 83EE FF SUB ESI,-1
004176CF 66:8945 00 MOV WORD PTR SS:[EBP],AX
004176D3 ^ E9 33F9FFFF JMP B64_372_.0041700B
004176D8 51 PUSH ECX
004176D9 50 PUSH EAX
004176DA 53 PUSH EBX
004176DB 54 PUSH ESP
004176DC 56 PUSH ESI
004176DD 9C PUSHFD
004176DE 52 PUSH EDX
004176DF 57 PUSH EDI
004176E0 55 PUSH EBP
004176E1 68 00000000 PUSH 0
004176E6 8B7424 2C MOV ESI,DWORD PTR SS:[ESP+2C]
004176EA 89E5 MOV EBP,ESP
004176EC 81EC C0000000 SUB ESP,0C0
004176F2 89E7 MOV EDI,ESP
004176F4 0375 00 ADD ESI,DWORD PTR SS:[EBP]
004176F7 8A06 MOV AL,BYTE PTR DS:[ESI]
004176F9 0FB6C0 MOVZX EAX,AL
004176FC 8D76 01 LEA ESI,DWORD PTR DS:[ESI+1]
004176FF ^ FF2485 9C724100 JMP DWORD PTR DS:[EAX*4+41729C] ;这里是起始点,这里会回跳到00417099处,我们不要跳,分析后知道需要在“0041721F”处下断点。
;不明白的可以看看上边的代码,我把一整段都复制上来了。
;本想做些简单注解的,但放弃了,注解会累死我的。
;大家不好意思了哦,在这里我就用一句话简单概括下吧。
;“经过分析,段内的N多跳转都是在这个段内部的,没有跳出段外,没也关键代码,只有‘0041721F’处的返回跳不知道到哪里,所以我们把它下段就OK了”。
;下完断点了,我们现在继续开始跟代码往下走,在00417706处按[F4]:执行到当前代码处。
00417706 8B45 00 MOV EAX,DWORD PTR SS:[EBP] ;也就是这里按[F4]:执行到当前代码处。
;但程序并没有执行到这里,而是在上边的“0041721F”断点处停下了,过去看看。
.
.
.
00416022 B8 004A4100 MOV EAX,B64_372_.00414A00 ;程序会从0041721F处飞到这里。继续按[F8]单步向下走。
00416027 FFD0 CALL EAX ;这里是个函数,再看看下边代码像是数据段。没办法,只能先按[F7]:单步步入。因为要进去看看怎么回事。
00416029 0000 ADD BYTE PTR DS:[EAX],AL
0041602B 0000 ADD BYTE PTR DS:[EAX],AL
0041602D 0000 ADD BYTE PTR DS:[EAX],AL
0041602F 0000 ADD BYTE PTR DS:[EAX],AL
00416031 0000 ADD BYTE PTR DS:[EAX],AL
00416033 0000 ADD BYTE PTR DS:[EAX],AL
.
.
.
00414A00 . 60 PUSHAD ;近来后一看,好熟悉啊。后边的代码不就是UPX壳的入口嘛。
;在这里DUMP一次吧,外边的未知名壳已经被脱掉了,这里就是新壳的入口,也叫壳间的分界线。
00414A01 . BE 00C04000 MOV ESI,B64_372_.0040C000
00414A06 . 8DBE 0050FFFF LEA EDI,DWORD PTR DS:[ESI+FFFF5000]
00414A0C . 57 PUSH EDI
00414A0D . 83CD FF OR EBP,FFFFFFFF
00414A10 . EB 10 JMP SHORT B64_372_.00414A22
00414A12 90 NOP
00414A13 90 NOP
00414A14 90 NOP
00414A15 90 NOP
00414A16 90 NOP
00414A17 90 NOP
00414A18 > 8A06 MOV AL,BYTE PTR DS:[ESI]
00414A1A . 46 INC ESI
00414A1B . 8807 MOV BYTE PTR DS:[EDI],AL
00414A1D . 47 INC EDI
00414A1E > 01DB ADD EBX,EBX
总结:
最外边的未知名壳现在已经成功脱掉了,脱壳前程序大小为:,脱壳后程序大小为:,比较后可以知道这个未知名壳为压缩壳。
因为我们在这里DUMP了一次,是为了用PEID查壳(这个是我的习惯),查后显示壳名为:“UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo [Overlay]”,分析正确。
现在不要关闭OD,因为我们还要继续去脱里边的UPX壳,那么我们就从00414A00地址处的UPX壳入口开始脱吧。
---------------------------------------------------------------------------------------------
手脱第二层壳(UPX壳):
00414A00 . 60 PUSHAD ;UPX壳入口,按[F8]单步一次。
00414A01 . BE 00C04000 MOV ESI,B64_372_.0040C000 ;在这里为了省事用ESP定律脱吧,因为快。
;当前ESP:0012FF7C,我们下硬断点“hr 0012FF7C”,[F9]运行。
00414A06 . 8DBE 0050FFFF LEA EDI,DWORD PTR DS:[ESI+FFFF5000]
00414A0C . 57 PUSH EDI
00414A0D . 83CD FF OR EBP,FFFFFFFF
00414A10 . EB 10 JMP SHORT B64_372_.00414A22
00414A12 90 NOP
00414A13 90 NOP
00414A14 90 NOP
00414A15 90 NOP
00414A16 90 NOP
00414A17 90 NOP
00414A18 > 8A06 MOV AL,BYTE PTR DS:[ESI]
00414A1A . 46 INC ESI
00414A1B . 8807 MOV BYTE PTR DS:[EDI],AL
00414A1D . 47 INC EDI
00414A1E > 01DB ADD EBX,EBX
.
.
.
00414B4B . 8D4424 80 LEA EAX,DWORD PTR SS:[ESP-80] ;运行后,停在这里。按[F8]单步向下走。
00414B4F > 6A 00 PUSH 0
00414B51 . 39C4 CMP ESP,EAX
00414B53 .^ 75 FA JNZ SHORT B64_372_.00414B4F ;到这里有个小回跳,我们不跳。
00414B55 . 83EC 80 SUB ESP,-80 ;我们在这里按[F4]执行到当前代码处,继续[F8]单步向下走。
00414B58 .^ E9 C8D4FFFF JMP B64_372_.00412025 ;这里是个跨段的大回跳,是飞出壳段,到程序真正入口的关键跳。[F8]跳。
00414B5D 00 DB 00
00414B5E 00 DB 00
00414B5F 00 DB 00
00414B60 784B4100 DD B64_372_.00414B78
00414B64 804B4100 DD B64_372_.00414B80
00414B68 84604000 DD B64_372_.00406084
.
.
.
00412025 > /60 PUSHAD ;跨段的大回跳会跳到这里,这里就是新程序的入口地址了。
;下边代码有些乱,因为这里是数据段嘛,OD没自动分析,那我们使用[CTRL+A]来使OD识别下吧。
00412026 ? |2BDA SUB EBX,EDX
00412028 ? |85DA TEST EDX,EBX
0041202A . |03CA ADD ECX,EDX
0041202C |33 DB 33 ; CHAR '3'
0041202D |C8 DB C8
0041202E |52 DB 52 ; CHAR 'R'
0041202F |1B DB 1B
00412030 |D8 DB D8
00412031 |85 DB 85
00412032 |DB DB DB
00412033 |8B DB 8B
00412034 |D2 DB D2
00412035 |11 DB 11
00412036 |DA DB DA
00412037 |52 DB 52 ; CHAR 'R'
00412038 |51 DB 51 ; CHAR 'Q'
.
.
.
00412025 > /60 PUSHAD ;识别后变成这个样子,一看就知道不是真正的程序入口,一定是后边还有壳或UPX壳没脱完。
;我们在这里再DUMP一次,使用PEID查查剩下的又是什么壳。
00412026 . |2BDA SUB EBX,EDX
00412028 . |85DA TEST EDX,EBX
0041202A . |03CA ADD ECX,EDX
0041202C . |33C8 XOR ECX,EAX
0041202E . |52 PUSH EDX
0041202F . |1BD8 SBB EBX,EAX
00412031 . |85DB TEST EBX,EBX
00412033 . |8BD2 MOV EDX,EDX
00412035 . |11DA ADC EDX,EBX
00412037 . |52 PUSH EDX
00412038 . |51 PUSH ECX
00412039 . |8BCB MOV ECX,EBX
0041203B . |52 PUSH EDX
0041203C . |21D8 AND EAX,EBX
0041203E . |51 PUSH ECX
0041203F . |53 PUSH EBX
00412040 . |51 PUSH ECX
00412041 . |52 PUSH EDX
00412042 . |50 PUSH EAX
00412043 . |52 PUSH EDX
00412044 . |50 PUSH EAX
00412045 . |50 PUSH EAX
00412046 . |52 PUSH EDX
00412047 . |09C2 OR EDX,EAX
总结:
我比较喜欢写总结,呵呵。找到每个壳的分界线,并把他们DUMP出来是件很兴奋的事。
因为我也忘记了剩下壳的部分是不是属于UPX的壳了,反正以前版本的UPX都没后边部分。
那我这里就把它拉出来做另一个壳去脱了,谁叫它分界线这么清晰呢。
也可能后边这部分是一个新壳,叫什么“混迂入口点壳”吧?
反正我是忘记了,大家不要笑话我哦!只要到最后能把壳都脱掉就行,呵呵。
这里DUMP出来的程序使用PEID查壳为:“Nothing found [Overlay] *”。
现在不要关闭OD,因为我们还要继续去脱里边的混迂入口点壳,那么我们就从入口00412025地址处开始脱吧。
---------------------------------------------------------------------------------------------
手脱第三层壳(起混迂入口点作用的壳):
00412025 > /60 PUSHAD ;这里是新入口,按[F8]单步向下走。
00412026 . |2BDA SUB EBX,EDX
00412028 . |85DA TEST EDX,EBX
0041202A . |03CA ADD ECX,EDX
0041202C . |33C8 XOR ECX,EAX
0041202E . |52 PUSH EDX
0041202F . |1BD8 SBB EBX,EAX
00412031 . |85DB TEST EBX,EBX
00412033 . |8BD2 MOV EDX,EDX
00412035 . |11DA ADC EDX,EBX
00412037 . |52 PUSH EDX
00412038 . |51 PUSH ECX
.
.
.
004120D3 . 5A POP EDX ; ntdll.KiFastSystemCallRet
004120D4 . 61 POPAD
004120D5 . 60 PUSHAD
004120D6 . E8 2BFFFFFF CALL B64_372_.00412006 ;会走很远,来到这第一个CALL的位置。[F7]跟进去。
004120DB . 8BC3 MOV EAX,EBX
004120DD . 3E:8B00 MOV EAX,DWORD PTR DS:[EAX]
004120E0 . 40 INC EAX
004120E1 . E8 2CFFFFFF CALL B64_372_.00412012
.
.
.
00412006 /$ B8 18000000 MOV EAX,18 ;进去后到这里,按[F8]单步向下走。
0041200B |. 64:8B18 MOV EBX,DWORD PTR FS:[EAX]
0041200E |. 83C3 30 ADD EBX,30
00412011 \. C3 RETN ;到这里[F8]返回。
.
.
.
004120DB . 8BC3 MOV EAX,EBX ;返回到这里,继续按[F8]单步向下走。
004120DD . 3E:8B00 MOV EAX,DWORD PTR DS:[EAX]
004120E0 . 40 INC EAX
004120E1 . E8 2CFFFFFF CALL B64_372_.00412012 ;到这里[F7]跟进去。千万别按[F8]单步步过,那么会把病毒跑起来的。
004120E6 . 45 INC EBP
004120E7 . 3F AAS
004120E8 . 25 FFB999B9 AND EAX,B999B9FF
004120ED . 0A8B 6261E965 OR CL,BYTE PTR DS:[EBX+65E96162]
004120F3 . 31FF XOR EDI,EDI
004120F5 . FF00 INC DWORD PTR DS:[EAX]
004120F7 . 0000 ADD BYTE PTR DS:[EAX],AL
.
.
.
00412012 /$ 40 INC EAX ;进去后到这里,按[F8]单步向下走。
00412013 |. 3E:0FB600 MOVZX EAX,BYTE PTR DS:[EAX]
00412017 |. C1E0 03 SHL EAX,3
0041201A |. 83C0 0A ADD EAX,0A
0041201D |. 36:010424 ADD DWORD PTR SS:[ESP],EAX
00412021 \. C3 RETN ;到这里[F8]返回。
00412022 F4 DB F4
.
.
.
004120F0 ? 61 POPAD ;返回到这里,继续按[F8]单步向下走。
004120F1 ?- E9 6531FFFF JMP B64_372_.0040525B ;又是一个跨段的大跳,是飞出壳段,到程序真正入口的关键跳。[F8]跳。
004120F6 ? 0000 ADD BYTE PTR DS:[EAX],AL
004120F8 ? 0000 ADD BYTE PTR DS:[EAX],AL
004120FA ? 0000 ADD BYTE PTR DS:[EAX],AL
.
.
.
0040525B 55 PUSH EBP ;程序飞到了这里,后边一看就知道是真正的程序了,这就是趁许真正的入口点了。
;我们剩下的就是DUMP、修复和优化了。由于是病毒不用运行,所以就不修复和优化,OK完毕。
0040525C 8BEC MOV EBP,ESP
0040525E B9 17000000 MOV ECX,17
00405263 6A 00 PUSH 0
00405265 6A 00 PUSH 0
00405267 49 DEC ECX
00405268 ^ 75 F9 JNZ SHORT B64_372_.00405263
0040526A 51 PUSH ECX
0040526B 53 PUSH EBX
0040526C 56 PUSH ESI
0040526D 57 PUSH EDI
0040526E B8 F3514000 MOV EAX,B64_372_.004051F3
00405273 E8 BBE9FFFF CALL B64_372_.00403C33
00405278 33C0 XOR EAX,EAX
总结:
我们DUMP出来的程序使用PEID查壳,显示为“Borland Delphi 6.0 - 7.0 [Overlay]”。
这样说明我们把壳都脱掉了,由于是病毒不用运行,所以就不修复和优化,OK完毕。
////////////////////////////////////////////////////////////////////////////////////////////
[培训]科锐逆向工程师培训第53期2025年7月8日开班!