这是我的入门级脱壳笔记,贴出来供大家分享
脱壳软件:加壳的记事本
PIED查壳:Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks
Armadillo_Find_Protected_v1.3检查
★ 目标为Armadillo保护
★ 特征识别 = FC30D8FC
保护系统级别为 (标准版)
◆所用到的保护模式有◆
屏蔽调试器
双进程模式
【备份密钥设置】
固定的备份密钥
【程序压缩设置】
较好/较慢地压缩方式
【其它保护设置】
★分离子进程★
子进程标识号为 : 00000EAC
入口点为 : 00433999
原始字节为 : 558B
OD载入,忽略所有异常,隐藏OD。记住入口两个字节55 8B,后面要用到的
00433999 > 55 push ebp
0043399A 8BEC mov ebp,esp
0043399C 6A FF push -1
0043399E 68 503C4500 push NOTEPAD.00453C50
004339A3 68 80334300 push NOTEPAD.00433380
004339A8 64:A1 00000000 mov eax,dword ptr fs:[0]
004339AE 50 push eax
004339AF 64:8925 00000000 mov dword ptr fs:[0],esp
004339B6 83EC 58 sub esp,58
004339B9 53 push ebx
在命令行下断 bp WaitForDebugEvent F9运行
7C85A480 > 8BFF mov edi,edi
7C85A482 55 push ebp
7C85A483 8BEC mov ebp,esp
7C85A485 83EC 68 sub esp,68
7C85A488 56 push esi
7C85A489 FF75 0C push dword ptr ss:[ebp+C]
7C85A48C 8D45 F8 lea eax,dword ptr ss:[ebp-8]
7C85A48F 50 push eax
中断在这里,注意看堆栈窗口
0013DAC0 00423D67 /CALL 到 WaitForDebugEvent 来自 NOTEPAD.00423D61
0013DAC4 0013EB84 |pDebugEvent = 0013EB84 在这里右键——在数据窗口跟随
0013DAC8 000003E8 \Timeout = 1000. ms
取消断点,在命令行下断 bp WriteProcessMemory F9运行,中断后取消断点。注意看数据窗口
0013EB98 00000000
0013EB9C 004010CC NOTEPAD.004010CC 这个地址就是OEP的地址(记录)
0013EBA0 00000002
0013EBA4 00000008
0013EBA8 004010CC NOTEPAD.004010CC
0013EBAC 004010CC NOTEPAD.004010CC
记录号OEP地址后,关闭程序。
重新载入程序,忽略所有异常,隐藏OD,在命令行下断 he WaitForDebugEvent F9运行
7C85A480 > 8BFF mov edi,edi 中断在这里
7C85A482 55 push ebp
7C85A483 8BEC mov ebp,esp
中断后,取消断点,ALT+F9返回
00423D67 85C0 test eax,eax 返回到这里
00423D69 0F84 9A260000 je NOTEPAD.00426409
00423D6F 60 pushad
00423D70 33C0 xor eax,eax
在这里右键——搜索——全部常数——输入FFFFFFF8——确定
一共搜索到8个
在第一个上面双击
004243D6 83C8 F8 or eax,FFFFFFF8 来到这里,向上翻在反汇编栏找到2个cmp
分别在上面加上注释
0042438A 83BD D0F5FFFF 00 cmp dword ptr ss:[ebp-A30],0 ; 1CMP(加的注释)
00424391 0F8C A9020000 jl NOTEPAD.00424640
00424397 8B8D D0F5FFFF mov ecx,dword ptr ss:[ebp-A30]
0042439D 3B0D E4454500 cmp ecx,dword ptr ds:[4545E4] ; 2CMP(加的注释)
004243A3 0F8D 97020000 jge NOTEPAD.00424640
004243A9 8B95 44F6FFFF mov edx,dword ptr ss:[ebp-9BC]
004243AF 81E2 FF000000 and edx,0FF
004243B5 85D2 test edx,edx
004243B7 0F84 AD000000 je NOTEPAD.0042446A
004243BD 6A 00 push 0
004243BF 8BB5 D0F5FFFF mov esi,dword ptr ss:[ebp-A30]
004243C5 C1E6 04 shl esi,4
004243C8 8B85 D0F5FFFF mov eax,dword ptr ss:[ebp-A30]
004243CE 25 07000080 and eax,80000007
004243D3 79 05 jns short NOTEPAD.004243DA
004243D5 48 dec eax
004243D6 83C8 F8 or eax,FFFFFFF8
在1CMP处下硬件执行断点,SHIFT+F9运行到这里,运行到这里之后删除断点。此时注
意提示窗口 堆栈 ss:[0013EB70]=00000000
这里的0013EB70就是1CMP处[ebp-A30]的值。
注意:[0013EB70]=00000000 等号后面必须等于00000000,如果有些程序这里不是00000000,那么就要修改成00000000(修改方法,在这一行右键——修改数据——将十六进制一栏中改成00000000——确定)
接下来需要记录几项数据,后面要用到
1. ICMP处的地址值,即 :0042438A
2. [ebp-A30]的值,即:提示窗口中的0013EB70
3. ICMP下一行JL的跳转地址值,即:00424640
4. 2 CMP处 ds:[4545E4]的值
记录好以后,向下翻,经过3个FFFFFFF8之后有一行 test eax,eax
0042445D 25 FF000000 and eax,0FF 在这一行添加代码
00424462 85C0 test eax,eax 就是这一行
代码
1:inc dword ptr ds:[********] ********表示的数值是上面记录的第2条
inc dword ptr ds:[ 0013EB70]
2:mov dword ptr ds:[****** +4],1 *******表示上面记录的第4条
mov dword ptr ds:[4545E4+4],1
3. jmp ******** ********表示上面记录的第1条
jmp 0042438A
在0042445D一行双击,汇编以上3行代码
0042445D FF05 70EB1300 inc dword ptr ds:[13EB70]
00424463 C705 E8454500 010000>mov dword ptr ds:[4545E8],1
0042446D ^ E9 18FFFFFF jmp NOTEPAD.0042438A
00424472 90 nop
00424473 90 nop
00424474 90 nop
00424475 90 nop
回到1CMP处,在下一行顺着跳转线向下找到它跳转地址即00424640处(记录的第3条)
00424640 /E9 E00F0000 jmp NOTEPAD.00425625
找到这里,在这里下硬件执行断点,SHIFT+F9运行,运行到这里后取消断点。此时代码已经解压完毕,就在这里脱壳。进程中有2个进程,选择第二个脱壳。
接下来要手动查找IAT,
用LordPE编辑器将脱壳的文件入口点改称10CC (用刚开始找到的OEP值减去基址的值
004010CC-00400000=10CC)然后点保存——确定
OD载入脱壳的文件
004010CC > 55 push ebp 入口
004010CD 8BEC mov ebp,esp
004010CF 83EC 44 sub esp,44
004010D2 56 push esi
004010D3 FF15 F4734000 call dword ptr ds:[4073F4] 注意这里的4073F4
在数据窗口CTRL+G——输入4073F4——确定
(在数据窗口右键——Hex——Hex/ASCII(8字节))然后向上和向下翻找到IAT的起始位置和结束位置
这里的起始位置是004072EC
IAT的结束位置是00407536
RAV=004072EC-00400000=72EC
RAV的大小:00407536-004072EC=24A
OD再如加壳的程序,在命令行下断bp DebugActiveProcess F9运行
7C85A123 > 8BFF mov edi,edi 中断在这里
7C85A125 55 push ebp
7C85A126 8BEC mov ebp,esp
7C85A128 E8 52570200 call <jmp.&ntdll.DbgUiConnectTo>
此时注意看堆栈窗口
0013DAC4 00423BDB /CALL 到 DebugActiveProcess 来自 NOTEPAD.00423BD5
0013DAC8 00000F6C \ProcessId = F6C (这个值每次载入会变的)
再打开一个OD 点OD的文件-附加——附加F6C这个进程
附加完后 ALT+F9 返回
00433999 >- EB FE jmp short NOTEPAD.<ModuleEntryP> 返回到这里
0043399B EC in al,dx
0043399C 6A FF push -1
0043399E 68 503C4500 push NOTEPAD.00453C50
004339A3 68 80334300 push NOTEPAD.00433380
004339A8 64:A1 00000000 mov eax,dword ptr fs:[0]
返回到这里后,将入口处的头两个字节还原成最初记录的EP头两个字节(55 8B)
00433999 > 55 push ebp
0043399A 8BEC mov ebp,esp
0043399C 6A FF push -1
0043399E 68 503C4500 push NOTEPAD.00453C50
004339A3 68 80334300 push NOTEPAD.00433380
在命令行下断 BP OpenMutexA F9运行
7C80EA1B > 8BFF mov edi,edi 断在这里
7C80EA1D 55 push ebp
7C80EA1E 8BEC mov ebp,esp
7C80EA20 51 push ecx
7C80EA21 51 push ecx
7C80EA22 837D 10 00 cmp dword ptr ss:[ebp+10],0
断下来注意堆栈窗口
0013F59C 004155F1 /CALL 到 OpenMutexA 来自 NOTEPAD.004155EB
0013F5A0 001F0001 |Access = 1F0001
0013F5A4 00000000 |Inheritable = FALSE
0013F5A8 0013FBDC \MutexName = "7A4::DA447D465C" 记住0013FBDC
CTRL+G 输入00401000——确定
00401000 0000 add byte ptr ds:[eax],al
00401002 0000 add byte ptr ds:[eax],al
00401004 0000 add byte ptr ds:[eax],al
00401006 0000 add byte ptr ds:[eax],al
00401008 0000 add byte ptr ds:[eax],al
0040100A 0000 add byte ptr ds:[eax],al
0040100C 0000 add byte ptr ds:[eax],al
0040100E 0000 add byte ptr ds:[eax],al
在这里汇编代码
00401000 60 pushad
00401001 9C pushfd
00401002 68 DCFB1300 push 13FBDC ; ASCII "7A4::DA447D465C"
00401007 33C0 xor eax,eax
00401009 50 push eax
0040100A 50 push eax
0040100B E8 2FD9407C call kernel32.CreateMutexA
00401010 9D popfd
00401011 61 popad
00401012 - E9 04DA407C jmp kernel32.OpenMutexA
注意00401002行push后面的值就是刚才堆栈窗口记录的值
汇编完毕后在这里右键——此处新建EIP——确定——F9运行
7C80EA1B > 8BFF mov edi,edi
7C80EA1D 55 push ebp
7C80EA1E 8BEC mov ebp,esp
7C80EA20 51 push ecx
7C80EA21 51 push ecx
来到刚才的中断点,取消断点。再次CTRL+G 输入00401000——确定
将刚才汇编的代码撤销,然后在命令行下断he GetModuleHandleA SHIFT+F9运行数次,注意看堆栈寻找适当的返回时机
0013F540 004147ED /CALL 到 GetModuleHandleA 来自 NOTEPAD.004147E7
0013F544 00000000 \pModule = NULL
0013BF20 00B8C807 /CALL 到 GetModuleHandleA 来自 00B8C801
0013BF24 00B9D6C8 \pModule = "kernel32.dll"
0013BF28 00B9E67C ASCII "VirtualAlloc"
0013BF20 00B8C824 /CALL 到 GetModuleHandleA 来自 00B8C81E
0013BF24 00B9D6C8 \pModule = "kernel32.dll"
0013BF28 00B9E670 ASCII "VirtualFree"
0013BC98 00B7799B /CALL 到 GetModuleHandleA 来自 00B77995
0013BC9C 0013BDD4 \pModule = "kernel32.dll" 这一次就是最佳返回时机
取消断点,ALT+F9返回
00B7799B 8B0D E011BA00 mov ecx,dword ptr ds:[BA11E0] 返回到这里
00B779A1 89040E mov dword ptr ds:[esi+ecx],eax
00B779A4 A1 E011BA00 mov eax,dword ptr ds:[BA11E0]
00B779A9 393C06 cmp dword ptr ds:[esi+eax],edi
00B779AC 75 16 jnz short 00B779C4
00B779AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
00B779B4 50 push eax
00B779B5 FF15 CC80B900 call dword ptr ds:[B980CC] ; kernel32.LoadLibraryA
00B779BB 8B0D E011BA00 mov ecx,dword ptr ds:[BA11E0]
00B779C1 89040E mov dword ptr ds:[esi+ecx],eax
00B779C4 A1 E011BA00 mov eax,dword ptr ds:[BA11E0]
00B779C9 393C06 cmp dword ptr ds:[esi+eax],edi
00B779CC 0F84 AD000000 je 00B77A7F 这里就是Magic Jump 将JE改成JMP
改完后顺着这里的跳转线向下来到这里
00B77A7F 83C3 0C add ebx,0C
00B77A82 83C6 04 add esi,4
00B77A85 397B FC cmp dword ptr ds:[ebx-4],edi
00B77A88 ^ 0F85 CCFEFFFF jnz 00B7795A
00B77A8E EB 03 jmp short 00B77A93 在这里F2下断F9运行到这里
00B77A90 D6 salc
00B77A91 D6 salc
运行到这里后取消断点,然后在向上到刚才修改的Magic Jump处将修改撤销
打开内存窗口,在00401000断F2下断,F9运行
004010CC 61 popad 这里就是OEP
004010CD 80E1 2B and cl,2B
004010D0 D84F 5B fmul dword ptr ds:[edi+5B]
004010D3 57 push edi
004010D4 21FF and edi,edi
004010D6 ^ 7E E8 jle short NOTEPAD.004010C0
004010D8 34 80 xor al,80
004010DA FD std
在这里打开ImportREC选择子进程进行修复
OEP=10CC RAV=72EC 大小=24A
剪切无效指针,修复转存文件 OK
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!