采用FSG v1.10 (Eng) -> dulek/xt [Overlay] 花花伪壳器进行加壳,因此红伞不杀,但是壳运行完以后在内存中释放关键恶意文件的时候红伞会报
手脱【FSG(压缩壳)】方法步骤 【当然也可以直接去看雪下载unfsg来脱,不过是2.0版本,本威胁是1.10版本】
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
文件名称:脱壳记录
目标程序:FSG加壳程序
操作环境:Windows XP-SP2
使用工具:Ollydbg 1.10版、ImportREC
编写作者:Coderui
编写时间:2007-6-14
--------------------------------------------------------------------------------------------------------------
手动脱壳之快速技巧
**************************************************************************
FSG1.33:(有时这个技巧不行,上面紧接的不是转跳)
OD载入,CTRL+B搜索5655,上面紧接的转跳(JN)地址就是OEP了
CTRL+G直接到OEP,F4,然后DUMP并修复
最后就是优化一下大小
**************************************************************************
FSG2.0:
OD载入,两次F8,看右下角堆栈窗口
紧接LoadLibraryA上面的就是OEP值
CTRL+G直接到OEP,F4,然后DUMP并修复
最后就是优化一下大小
**************************************************************************
手动脱壳之单步跟踪
(1):FSG v2.0版
**************************************************************************
OD设置:不忽略任何异常。(如果程序用OD运行不起来,自动就退出了,那么就设置忽略所有异常)。
00400154 > 8725 74A24100 XCHG DWORD PTR DS:[41A274],ESP -->载入后到这里,F8单步进入。
0040015A 61 POPAD
0040015B 94 XCHG EAX,ESP
0040015C 55 PUSH EBP
0040015D A4 MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
0040015E B6 80 MOV DH,80
00400160 FF13 CALL DWORD PTR DS:[EBX]
00400162 ^ 73 F9 JNB SHORT FSG2_0.0040015D -->没有回跳,按F8
00400164 33C9 XOR ECX,ECX
00400166 FF13 CALL DWORD PTR DS:[EBX]
00400168 73 16 JNB SHORT FSG2_0.00400180 -->没有回跳,按F8
0040016A 33C0 XOR EAX,EAX
0040016C FF13 CALL DWORD PTR DS:[EBX]
0040016E 73 1F JNB SHORT FSG2_0.0040018F -->跳到0040018F
F8来到了0040018F处:
0040018F AC LODS BYTE PTR DS:[ESI]
00400190 D1E8 SHR EAX,1
00400192 74 2D JE SHORT FSG2_0.004001C1 -->没有回跳,按F8
00400194 13C9 ADC ECX,ECX
00400196 EB 18 JMP SHORT FSG2_0.004001B0 -->跳到004001B0处
00400198 91 XCHG EAX,ECX
00400199 48 DEC EAX
0040019A C1E0 08 SHL EAX,8
0040019D AC LODS BYTE PTR DS:[ESI]
0040019E FF53 04 CALL DWORD PTR DS:[EBX+4]
004001A1 3B43 F8 CMP EAX,DWORD PTR DS:[EBX-8]
004001A4 73 0A JNB SHORT FSG2_0.004001B0
004001A6 80FC 05 CMP AH,5
004001A9 73 06 JNB SHORT FSG2_0.004001B1
004001AB 83F8 7F CMP EAX,7F
004001AE 77 02 JA SHORT FSG2_0.004001B2
004001B0 41 INC ECX -->到这里了
004001B1 41 INC ECX
004001B2 95 XCHG EAX,EBP
004001B3 8BC5 MOV EAX,EBP
004001B5 B6 00 MOV DH,0
004001B7 56 PUSH ESI ; FSG2_0.00416393
004001B8 8BF7 MOV ESI,EDI
004001BA 2BF0 SUB ESI,EAX
004001BC F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>
004001BE 5E POP ESI
004001BF ^ EB 9F JMP SHORT FSG2_0.00400160 -->回跳到00400160处,用F4跳试到下一行
004001C1 5E POP ESI -->F8继续
004001C2 AD LODS DWORD PTR DS:[ESI]
004001C3 97 XCHG EAX,EDI
004001C4 AD LODS DWORD PTR DS:[ESI]
004001C5 50 PUSH EAX
004001C6 FF53 10 CALL DWORD PTR DS:[EBX+10]
004001C9 95 XCHG EAX,EBP
004001CA 8B07 MOV EAX,DWORD PTR DS:[EDI]
004001CC 40 INC EAX
004001CD ^ 78 F3 JS SHORT FSG2_0.004001C2 -->没有回跳,按F8
004001CF 75 03 JNZ SHORT FSG2_0.004001D4 -->这里千万不要再F8了,不信自己试一下。用F4跳试到下一行
004001D1 - FF63 0C JMP DWORD PTR DS:[EBX+C] ; FSG2_0.004010CC这是Win98记事本程序的入口点F8进入
004001D4 50 PUSH EAX
到这里来了:
004010CC 55 DB 55 ; CHAR 'U'
004010CD 8B DB 8B
004010CE EC DB EC
004010CF 83 DB 83
窗口中右击“Analysis”-->“Analysis Code”或者Ctrl+A,分析代码:
004010CC /. 55 PUSH EBP -->就是OEP,好了,转存一下,就OK了
004010CD |. 8BEC MOV EBP,ESP
004010CF |. 83EC 44 SUB ESP,44
004010D2 |. 56 PUSH ESI
004010D3 |. FF15 E4634000 CALL DWORD PTR DS:[4063E4] ; [GetCommandLineA
004010D9 |. 8BF0 MOV ESI,EAX
004010DB |. 8A00 MOV AL,BYTE PTR DS:[EAX]
004010DD |. 3C 22 CMP AL,22
004010DF |. 75 1B JNZ SHORT FSG2_0.004010FC
现在不要关闭OD,接着修复一下,因为脱壳后我发现不能运行它:
选中004010D3这一行,右击“Follow in Dump”-->“Memory address”或者Ctrl+A:
004010D3 |. FF15 E4634000 CALL DWORD PTR DS:[4063E4] ; [GetCommandLineA
注意数据窗口中变化:(忘了说了数据窗口中要处于反汇编状态,在里边用滚动条上下翻找就可以看到)
004062E4 . 8378DA77 DD ADVAPI32.RegQueryValueExA -->输入表的开头,RVA值
004062E8 . F06BDA77 DD ADVAPI32.RegCloseKey
004062EC . E7EBDA77 DD ADVAPI32.RegSetValueExA
004062F0 . 1BC4DC77 DD ADVAPI32.RegOpenKeyA
.
.
.
004064F8 . 27BED177 DD USER32.IsIconic
004064FC . 1112D277 DD USER32.PostQuitMessage
00406500 . 9CFAD277 DD USER32.TranslateAcceleratorA -->有人修复大小时在这里计算,是错的。
00406504 FF DB FF 程序虽然可以运行,但在使用时程序会崩溃。
00406505 FF DB FF
00406506 FF DB FF
00406507 7F DB 7F
00406508 . 1E313276 DD 7632311E
0040650C . 89C23376 DD 7633C289
00406510 . 7C863376 DD 7633867C
00406514 . B1473476 DD 763447B1
00406518 . D87C3376 DD 76337CD8
0040651C . CE003376 DD 763300CE
00406520 . 33253276 DD 76322533 -->大小应该在这里计算,“DD”表示调用的函数。
00406524 FF DB FF 这里函数的功能是(打开、保存对话框的功能),如果不取到这里,使用他们功能时,程序自然会崩溃。
修复时填:
OEP=000010CC
RVA=000062E4
SIZE=00406520-004062E4=23C
先用OD把壳脱掉,再用ImportREC修复文件时所选择的文件应该是OD脱完壳的文件。
说明:(有些程序脱出来不需要修复,也可以正常运行)。
**************************************************************************
(2):FSG v1.31版
**************************************************************************
OD设置:不忽略任何异常。(如果程序用OD运行不起来,自动就退出了,那么就设置忽略所有异常)。
00410304 > BB D0014000 MOV EBX,NOTEPAD_.004001D0 ;载入后停在这里,我们下硬件断点HR 0012FFA4,然后F9运行。
00410309 BF 00104000 MOV EDI,NOTEPAD_.00401000
0041030E BE 0CC94000 MOV ESI,NOTEPAD_.0040C90C
00410313 53 PUSH EBX
.
.
.
这时反汇编窗口变为空白,如果按[F8]会提示"不知如何单步,程序异常"。
我们要做的就是不停的按[SHIFT+F9],其中如果出现提示"不知如何单步,程序异常"对话框,就关闭继续,直到反汇编窗口显示出代码为止。(一般需要按5-10次)
.
.
.
7C801D77 /$ 8BFF MOV EDI,EDI ;我们会来到这里,然后按[F9]运行
7C801D79 |. 55 PUSH EBP
7C801D7A |. 8BEC MOV EBP,ESP
7C801D7C |. 837D 08 00 CMP DWORD PTR SS:[EBP+8],0
.
.
.
这时反汇编窗口变为空白,如果按[F8]会提示"不知如何单步,程序异常"。
我们要做的就是不停的按[SHIFT+F9],其中如果出现提示"不知如何单步,程序异常"对话框,就关闭继续,直到反汇编窗口显示出代码为止。(一般需要按1-3次)
.
.
.
7C80FC2F > $ 6A 18 PUSH 18 ;我们会来到这里,然后按[F9]运行
7C80FC31 . 68 D8FC807C PUSH kernel32.7C80FCD8
7C80FC36 . E8 8B28FFFF CALL kernel32.7C8024C6
7C80FC3B . 8365 FC 00 AND DWORD PTR SS:[EBP-4],0
.
.
.
这时反汇编窗口变为空白,如果按[F8]会提示"不知如何单步,程序异常"。
我们要做的就是不停的按[SHIFT+F9],其中如果出现提示"不知如何单步,程序异常"对话框,就关闭继续,直到反汇编窗口显示出代码为止。(一般需要按0-1次)
.
.
.
7C80ADA9 . 8B7D 0C MOV EDI,DWORD PTR SS:[EBP+C] ;我们会来到这里,这次要单步[F8]一直向下执行
7C80ADAC . BB FFFF0000 MOV EBX,0FFFF
7C80ADB1 . 3BFB CMP EDI,EBX
7C80ADB3 .^ 0F86 D1F2FFFF JBE kernel32.7C80A08A
7C80ADB9 . 57 PUSH EDI
7C80ADBA . 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
7C80ADBD . 50 PUSH EAX
7C80ADBE . FF15 8812807C CALL DWORD PTR DS:[<&ntdll.RtlInitString>
7C80ADC4 . 8D45 0C LEA EAX,DWORD PTR SS:[EBP+C]
7C80ADC7 . 50 PUSH EAX
7C80ADC8 . 6A 00 PUSH 0
7C80ADCA . 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
7C80ADCD . 50 PUSH EAX
7C80ADCE > 6A 00 PUSH 0
7C80ADD0 . FF75 08 PUSH DWORD PTR SS:[EBP+8]
7C80ADD3 . E8 1CEBFFFF CALL kernel32.7C8098F4
7C80ADD8 . 50 PUSH EAX
7C80ADD9 . E8 B7FFFFFF CALL <JMP.&ntdll.LdrGetProcedureAddress>
7C80ADDE . 85C0 TEST EAX,EAX
7C80ADE0 . 0F8C F6840000 JL kernel32.7C8132DC
7C80ADE6 . 6A 00 PUSH 0
7C80ADE8 . FF75 08 PUSH DWORD PTR SS:[EBP+8]
7C80ADEB . E8 04EBFFFF CALL kernel32.7C8098F4
7C80ADF0 . 3945 0C CMP DWORD PTR SS:[EBP+C],EAX
7C80ADF3 . 0F84 5E5F0300 JE kernel32.7C840D57
7C80ADF9 . 8B45 0C MOV EAX,DWORD PTR SS:[EBP+C]
7C80ADFC > 5F POP EDI
7C80ADFD . 5B POP EBX
7C80ADFE . C9 LEAVE
7C80ADFF . C2 0800 RETN 8 ;执行到这里,再[F8]一次会返回到别的地方。
7C80AE02 > 837D 10 00 CMP DWORD PTR SS:[EBP+10],0
.
.
.
004103D7 FF37 PUSH DWORD PTR DS:[EDI]
004103D9 AF SCAS DWORD PTR ES:[EDI]
004103DA EB 09 JMP SHORT NOTEPAD_.004103E5
004103DC FE0F DEC BYTE PTR DS:[EDI]
004103DE - 0F84 E80CFFFF JE NOTEPAD_.004010CC ;看到了吧,JE所指向(跳向)的地址就是真正的程序入口点。
004103E4 57 PUSH EDI
004103E5 55 PUSH EBP
004103E6 FF53 04 CALL DWORD PTR DS:[EBX+4]
004103E9 8906 MOV DWORD PTR DS:[ESI],EAX ;这次我们来到了这里,开始向上找OEP。
004103EB AD LODS DWORD PTR DS:[ESI]
004103EC 85C0 TEST EAX,EAX
004103EE ^ 75 D9 JNZ SHORT NOTEPAD_.004103C9
004103F0 8BEC MOV EBP,ESP
004103F2 C3 RETN
004103F3 1B0401 SBB EAX,DWORD PTR DS:[ECX+EAX]
004103F6 0000 ADD BYTE PTR DS:[EAX],AL
004103F8 0000 ADD BYTE PTR DS:[EAX],AL
004103FA 0000 ADD BYTE PTR DS:[EAX],AL
004103FC 0000 ADD BYTE PTR DS:[EAX],AL
004103FE 0088 0100001B ADD BYTE PTR DS:[EAX+1B000001],CL
.
.
.
插曲:(当我们看到那个真正的程序入口点后,就无法再跟下去了,反正我是跟不进去,呵呵。)
插曲:(网上都没找到关于FSG v1.31版的任何脱文,很奇怪。这种找法是我自己摸索的,试了下脱别的程序加这个版的壳找法也一样,所以放心使用。)
正题:我们记下来OEP地址[004010CC],[SHIFT+F2]重新载入本程序。
输入命令[HD],把所有硬件断点清楚掉。
按[SHIFT+G]后填上跟随的表达式[004010CC](也就是转到的地址)。再[F4]运行到当前代码处。
OK,运行到真正入口停下来了,使用OD脱壳保存吧。保存后的程序无法运行,需要修复输入表(有些程序脱出来不需要修复)。
使用ImportREC修复时填:
OEP=000010CC
RVA=000062E4
SIZE=00406520-004062E4=23C
一切完成后,先用OD把壳脱掉,再用ImportREC修复文件时所选择的文件应该是OD脱完壳的文件。
**************************************************************************
(4):FSG v1.33版
**************************************************************************
脱这个版的记录就不写了,和上边脱FSG v1.31和FSG v1.2版的一模一样。
**************************************************************************
注意:如果在数据窗口中看不到输入表的调用时,我们要使用以下方法去修复。
1:在OD中使程序处于运行状态。
2:在ImportREC显示输入表函数的窗口中右键,选择[高级命令]->[获取API调用]->[两个启发式全部选中]->[确定]。
然后点显示无效按钮,把无效的指针剪切掉,而不是删除掉。这样就可以[修复转存文件]了。
想看到明文输入表的方法:
先在数据窗口中Ctrl+G,转到OEP地址处。然后在反汇编窗口中也Ctrl+G,转到OEP地址处,F4执行到入口。
这样下边数据窗口中就可以找到明文的输入表了。其中数据窗口中要处于反汇编状态。
【以下是运行截图,没用EQ】
[ 本帖最后由 ranguangning 于 2008-8-11 21:19 编辑 ] |