下载页面: http://www.skycn.com/soft/13222.html
软件大小: 782 KB
软件语言: 英文
软件类别: 国外软件 / 共享版 / 卸载清除
应用平台: Win9x/NT/2000/XP
加入时间: 2004-08-28 10:18:07
下载次数: 22173
推荐等级: ***
开 发 商: http://www.registry-clean.net/
软件介绍: 系统注册表清理工具,可以扫描注册表,找到并修复/删除那些错误或无用的数据,还可以备份/恢复注册表。
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
【调试环境】:WinXP、Ollydbg V1.10、PEiD、LordPE、ImportREC
―――――――――――――――――――――――――――――――――
【脱壳过程】:
又发现一个ASProtect V2.0加壳的程序,所以又捏了个保护没做好的软柿子。
这个东东脱壳后有自校验。脱壳时处理了一下Pre-Dip,使其显示注册名。
―――――――――――――――――――――――――――――――――
一、壳代码解压
首先设置Ollydbg忽略所有的异常选项。
老规矩:用IsDebug V1.4插件去掉Ollydbg的调试器标志。
00401000 68 01F04E00 push RegClean.004EF001
//进入OD后暂停在这
00401005 E8 01000000 call RegClean.0040100B
0040100A C3 retn
下断:HE GetModuleHandleA
Shift+F9,中断2次后,就可以取消断点,Alt+F9返回00A4A4AC。
Ctrl+F9 执行到返回。
00A4A4A6 FF95 EC314400 call dword ptr ss:[ebp+4431EC]
00A4A4AC 85C0 test eax,eax ; kernel32.77E40000
//返回这里
00A4A4AE 75 07 jnz short 00A4A4B7
00A4A4B0 53 push ebx
00A4A4B1 FF95 F0314400 call dword ptr ss:[ebp+4431F0]
00A4A4B7 8985 4D294400 mov dword ptr ss:[ebp+44294D],eax
00A4A4BD C785 51294400 00000>mov dword ptr ss:[ebp+442951],0
00A4A4C7 8B95 D8304400 mov edx,dword ptr ss:[ebp+4430D8]
00A4A4CD 8B06 mov eax,dword ptr ds:[esi]
00A4A4CF 85C0 test eax,eax
00A4A4D1 75 03 jnz short 00A4A4D6
00A4A4D3 8B46 10 mov eax,dword ptr ds:[esi+10]
00A4A4D6 03C2 add eax,edx
00A4A4D8 0385 51294400 add eax,dword ptr ss:[ebp+442951]
00A4A4DE 8B18 mov ebx,dword ptr ds:[eax]
00A4A4E0 8B7E 10 mov edi,dword ptr ds:[esi+10]
00A4A4E3 03FA add edi,edx
00A4A4E5 03BD 51294400 add edi,dword ptr ss:[ebp+442951]
00A4A4EB 85DB test ebx,ebx
00A4A4ED 0F84 A2000000 je 00A4A595
00A4A4F3 F7C3 00000080 test ebx,80000000
00A4A4F9 75 04 jnz short 00A4A4FF
00A4A4FB 03DA add ebx,edx
00A4A4FD 43 inc ebx
00A4A4FE 43 inc ebx
00A4A4FF 53 push ebx
00A4A500 81E3 FFFFFF7F and ebx,7FFFFFFF
00A4A506 53 push ebx
00A4A507 FFB5 4D294400 push dword ptr ss:[ebp+44294D]
00A4A50D FF95 E8314400 call dword ptr ss:[ebp+4431E8]
00A4A513 85C0 test eax,eax
00A4A515 5B pop ebx
00A4A516 75 6F jnz short 00A4A587
00A4A518 F7C3 00000080 test ebx,80000000
00A4A51E 75 19 jnz short 00A4A539
00A4A520 57 push edi
00A4A521 8B46 0C mov eax,dword ptr ds:[esi+C]
00A4A524 0385 D8304400 add eax,dword ptr ss:[ebp+4430D8]
00A4A52A 50 push eax
00A4A52B 53 push ebx
00A4A52C 8D85 53314400 lea eax,dword ptr ss:[ebp+443153]
00A4A532 50 push eax
00A4A533 57 push edi
00A4A534 E9 99000000 jmp 00A4A5D2
00A4A539 81E3 FFFFFF7F and ebx,7FFFFFFF
00A4A53F 8B85 DC304400 mov eax,dword ptr ss:[ebp+4430DC]
00A4A545 3985 4D294400 cmp dword ptr ss:[ebp+44294D],eax
00A4A54B 75 24 jnz short 00A4A571
00A4A54D 57 push edi
00A4A54E 8BD3 mov edx,ebx
00A4A550 4A dec edx
00A4A551 C1E2 02 shl edx,2
00A4A554 8B9D 4D294400 mov ebx,dword ptr ss:[ebp+44294D]
00A4A55A 8B7B 3C mov edi,dword ptr ds:[ebx+3C]
00A4A55D 8B7C3B 78 mov edi,dword ptr ds:[ebx+edi+78]
00A4A561 035C3B 1C add ebx,dword ptr ds:[ebx+edi+1C]
00A4A565 8B0413 mov eax,dword ptr ds:[ebx+edx]
00A4A568 0385 4D294400 add eax,dword ptr ss:[ebp+44294D]
00A4A56E 5F pop edi
00A4A56F EB 16 jmp short 00A4A587
00A4A571 57 push edi
00A4A572 8B46 0C mov eax,dword ptr ds:[esi+C]
00A4A575 0385 D8304400 add eax,dword ptr ss:[ebp+4430D8]
00A4A57B 50 push eax
00A4A57C 53 push ebx
00A4A57D 8D85 A4314400 lea eax,dword ptr ss:[ebp+4431A4]
00A4A583 50 push eax
00A4A584 57 push edi
00A4A585 EB 4B jmp short 00A4A5D2
00A4A587 8907 mov dword ptr ds:[edi],eax
00A4A589 8385 51294400 04 add dword ptr ss:[ebp+442951],4
00A4A590 E9 32FFFFFF jmp 00A4A4C7
00A4A595 8906 mov dword ptr ds:[esi],eax
00A4A597 8946 0C mov dword ptr ds:[esi+C],eax
00A4A59A 8946 10 mov dword ptr ds:[esi+10],eax
00A4A59D 83C6 14 add esi,14
00A4A5A0 8B95 D8304400 mov edx,dword ptr ss:[ebp+4430D8]
00A4A5A6 E9 EBFEFFFF jmp 00A4A496
00A4A5AB 8B85 652A4400 mov eax,dword ptr ss:[ebp+442A65]
00A4A5B1 50 push eax
00A4A5B2 0385 D8304400 add eax,dword ptr ss:[ebp+4430D8]
00A4A5B8 5B pop ebx
00A4A5B9 0BDB or ebx,ebx
00A4A5BB 8985 112F4400 mov dword ptr ss:[ebp+442F11],eax
00A4A5C1 61 popad
00A4A5C2 75 08 jnz short 00A4A5CC
00A4A5C4 B8 01000000 mov eax,1
00A4A5C9 C2 0C00 retn 0C
00A4A5CC 68 7828A400 push 0A42878
00A4A5D1 C3 retn
//执行到返回至这里
―――――――――――――――――――――――――――――――――
二、避开IAT加密
现在壳代码已经解压完毕了。
Ctrl+S 搜索命令序列:
mov edx,dword ptr ss:[ebp+C]
mov edx,dword ptr ds:[edx]
mov dword ptr ds:[edx],eax
共找到4处,全部下断。
00A358CF 8B55 0C mov edx,dword ptr ss:[ebp+C]
00A358D2 8B12 mov edx,dword ptr ds:[edx]
00A358D4 8902 mov dword ptr ds:[edx],eax
//①、需要修改
00A3593F 8B55 0C mov edx,dword ptr ss:[ebp+C]
00A35942 8B12 mov edx,dword ptr ds:[edx]
00A35944 8902 mov dword ptr ds:[edx],eax
//②、不需要修改
00A35953 8B55 0C mov edx,dword ptr ss:[ebp+C]
00A35956 8B12 mov edx,dword ptr ds:[edx]
00A35958 8902 mov dword ptr ds:[edx],eax
//③、不需要修改
00A35961 8B55 0C mov edx,dword ptr ss:[ebp+C]
00A35964 8B12 mov edx,dword ptr ds:[edx]
00A35966 8902 mov dword ptr ds:[edx],eax
//④、GetProcAddress函数加密
――――――――――――――――――――――――
1、第一个IAT处理:044858CF
Shift+F9,中断在044858CF处
00A358CA E8 FDF8FFFF call 00A351CC
00A358CF 8B55 0C mov edx,dword ptr ss:[ebp+C]
00A358D2 8B12 mov edx,dword ptr ds:[edx]
00A358D4 8902 mov dword ptr ds:[edx],eax
//修改为:mov dword ptr ds:[edx],ebx ★
//寄存器EBX中保存的就是正确的函数!
00A358D6 E9 90000000 jmp 00A3596B
00A359E7 8B75 FC mov esi,dword ptr ss:[ebp-4]
00A359EA AD lods dword ptr ds:[esi]
00A359EB 09C0 or eax,eax
00A359ED 74 4A je short 00A35A39
//输入表处理完毕则跳转 ★
00A359EF 89C7 mov edi,eax
00A359F1 037D F8 add edi,dword ptr ss:[ebp-8]
00A359F4 897D F4 mov dword ptr ss:[ebp-C],edi
00A359F7 89F3 mov ebx,esi
00A359F9 31C9 xor ecx,ecx
00A359FB 49 dec ecx
00A359FC 87FE xchg esi,edi
00A359FE 30C0 xor al,al
00A35A00 F2:AE repne scas byte ptr es:[edi]
00A35A02 87FE xchg esi,edi
00A35A04 AC lods byte ptr ds:[esi]
00A35A05 80F8 00 cmp al,0
00A35A08 74 E0 je short 00A359EA
00A35A0A 80F8 01 cmp al,1
00A35A0D 75 06 jnz short 00A35A15
00A35A0F 8345 F4 04 add dword ptr ss:[ebp-C],4
00A35A13 EB EF jmp short 00A35A04
00A35A15 53 push ebx
00A35A16 56 push esi
00A35A17 53 push ebx
00A35A18 8D5D F4 lea ebx,dword ptr ss:[ebp-C]
00A35A1B 53 push ebx
00A35A1C 80F8 05 cmp al,5
00A35A1F 74 06 je short 00A35A27
00A35A21 0FB60E movzx ecx,byte ptr ds:[esi]
00A35A24 41 inc ecx
00A35A25 EB 05 jmp short 00A35A2C
00A35A27 B9 04000000 mov ecx,4
00A35A2C 01CE add esi,ecx
00A35A2E FF75 F0 push dword ptr ss:[ebp-10]
00A35A31 E8 FAFDFFFF call 00A35830
//IAT 处理
00A35A36 5B pop ebx
00A35A37 EB CB jmp short 00A35A04
//循环处理输入表
00A35A39 5F pop edi
//这里下断 ★ 输入表处理完毕!
00A35A3A 5E pop esi
00A35A3B 5B pop ebx
00A35A3C 5A pop edx
00A35A3D 59 pop ecx
00A35A3E 8BC3 mov eax,ebx
00A35A40 5B pop ebx
00A35A41 8BE5 mov esp,ebp
00A35A43 5D pop ebp
00A35A44 C3 retn
――――――――――――――――――――――――
2、第四个IAT处理:04485961处
00A3595C B8 B846A300 mov eax,0A346B8
00A35961 8B55 0C mov edx,dword ptr ss:[ebp+C]
00A35964 8B12 mov edx,dword ptr ds:[edx]
00A35966 8902 mov dword ptr ds:[edx],eax
00A35968 EB 01 jmp short 00A3596B
当我们中断在00A35966处时,EAX=00A346B8
Ctrl+G:00A346B8
00A346B8 55 push ebp
00A346B9 8BEC mov ebp,esp
00A346BB 8B55 0C mov edx,dword ptr ss:[ebp+C]
00A346BE 8B45 08 mov eax,dword ptr ss:[ebp+8]
00A346C1 3B05 F833A400 cmp eax,dword ptr ds:[A433F8]
00A346C7 75 09 jnz short 00A346D2
00A346C9 8B0495 F833A400 mov eax,dword ptr ds:[edx*4+A433F8]
00A346D0 EB 07 jmp short 00A346D9
00A346D2 52 push edx
00A346D3 50 push eax
00A346D4 E8 2710FFFF call 00A25700; jmp to kernel32.GetProcAddress
00A346D9 5D pop ebp
00A346DA C2 0800 retn 8
所以这个函数是GetProcAddress,把EAX的值修改为GetProcAddress的地址,WinXP下这个地址是77E5A5FD
―――――――――――――――――――――――――――――――――
三、、Pre-Dip:用你自己的名字注册
输入表处理结束后中断在00A35A39处,现在我们来处理Pre-Dip完成注册。
取消以前的所有断点,现在设置Ollydbg忽略除了“内存访问异常”之外的所有其它异常选项。
Shift+F9运行,注意看堆栈,当第2次在堆栈中看见“8wh3JAAQjOI=”硬盘指纹时,可以处理了。
0012FF1C 0012FF2C 指针到下一个 SEH 记录
0012FF20 00A414EE SE 句柄
0012FF24 0012FF18
0012FF28 00A551B4 ASCII "8wh3JAAQjOI="//硬盘指纹
00A41615 C700 3FA00038 mov dword ptr ds:[eax],3800A03F
//第2次看见硬盘指纹时的异常处 ★
00A4161B 0D 6EFD44BA or eax,BA44FD6E
00A41620 B4 43 mov ah,43
00A41622 5D pop ebp
00A41623 1B67 64 sbb esp,dword ptr ds:[edi+64]
00A41626 8F06 pop dword ptr ds:[esi]
00A41628 0000 add byte ptr ds:[eax],al
00A4162A 83C4 04 add esp,4
00A4162D EB 02 jmp short 00A41631
Alt+M打开内存查看窗口,在00401000的第2个区段上设置内存访问断点。
Shift+F9 通过异常,断在00418E50处
00418E50 8B4424 04 mov eax,dword ptr ss:[esp+4]
00418E54 A3 A8604900 mov dword ptr ds:[4960A8],eax
//EAX=00A239BD 保存注册名的地方 ★
00418E59 C2 0400 retn 4
在程序中找块空地,如00475B00处,写下你的名字,如:fly [CUG]
然后修改EAX=00475B00。
OK,处理完毕。
―――――――――――――――――――――――――――――――――
四、Second段内存断点大法,直达OEP
我们Second段的内存断点当然还是有效的。再次设置Ollydbg忽略所有的异常选项。
Shift+F9 运行,中断几次后就直接来到OEP了!
0043EFE8 55 push ebp
//在这儿用LordPE纠正ImageSize后完全DUMP这个进程
0043EFE9 8BEC mov ebp,esp
0043EFEB 6A FF push -1
0043EFED 68 70F44700 push RegClean.0047F470
0043EFF2 68 D0444400 push RegClean.004444D0
0043EFF7 64:A1 00000000 mov eax,dword ptr fs:[0]
0043EFFD 50 push eax
0043EFFE 64:8925 00000000 mov dword ptr fs:[0],esp
0043F005 83EC 58 sub esp,58
0043F008 53 push ebx
0043F009 56 push esi
0043F00A 57 push edi
0043F00B 8965 E8 mov dword ptr ss:[ebp-18],esp
0043F00E FF15 E8634700 call dword ptr ds:[4763E8] ; kernel32.GetVersion
运行ImportREC,选择这个进程。
修改OEP=0003EFE8、RVA=00076000、Size=0000083C,获取输入表,所有的函数都是有效的。
FixDump,正常运行,脱壳成功!
启动时要求注册的NAG不见了, License To You
―――――――――――――――――――――――――――――――――
五、去除自检验失败后自动重启机子的暗桩
脱壳后运行一段时间居然让我的电脑自动重启了。
呵呵,作者还是比较善良的,只是检验失败后重启电脑,没有进行其他破坏行动。
并且检验的手段也是很善良的,只是检验大小。
可以BP ExitWindowsEx,拦截关机函数。
也可以运行1分钟后BP CreateFileA,就来到检验的地方了。
004288F3 FF15 4C624700 call dword ptr ds:[<&kernel32.CreateFileA>]
004288F9 8BE8 mov ebp,eax
004288FB 83FD FF cmp ebp,-1
004288FE 74 79 je short UnPacked.00428979
00428900 8D5424 10 lea edx,dword ptr ss:[esp+10]
00428904 52 push edx
00428905 55 push ebp
00428906 FF15 C4634700 call dword ptr ds:[<&kernel32.GetFileSize>]
//获取文件大小
0042890C 8BD8 mov ebx,eax
0042890E 83FB FF cmp ebx,-1
00428911 75 13 jnz short UnPacked.00428926
00428926 8B4424 10 mov eax,dword ptr ss:[esp+10]
0042892A 57 push edi
0042892B 3BC6 cmp eax,esi
0042892D 75 04 jnz short UnPacked.00428933
0042892F 8BFB mov edi,ebx
00428931 EB 14 jmp short UnPacked.00428947
00428947 55 push ebp
00428948 FF15 48624700 call dword ptr ds:[<&kernel32.CloseHandle>]
0042894E 85F6 test esi,esi
00428950 7F 18 jg short UnPacked.0042896A
00428952 7C 08 jl short UnPacked.0042895C
00428954 81FF 90230B00 cmp edi,0B2390
//比较啦
0042895A 77 0E ja short UnPacked.0042896A
//修改为:JMP 0042896F ★
0042895C 85F6 test esi,esi
0042895E 7F 0F jg short UnPacked.0042896F
00428960 7C 08 jl short UnPacked.0042896A
00428962 81FF F09C0900 cmp edi,99CF0
00428968 73 05 jnb short UnPacked.0042896F
0042896A E8 D103FFFF call UnPacked.00418D40
//这里面SeShutdownPrivilege然后ExitWindowsEx了 ★
0042896F 8B4C24 10 mov ecx,dword ptr ss:[esp+10]
00428973 E8 F7880200 call UnPacked.0045126F
00428978 5F pop edi
00428979 5E pop esi
0042897A 5D pop ebp
0042897B 5B pop ebx
0042897C 81C4 0C010000 add esp,10C
00428982 C2 0400 retn 4
OK,现在程序温柔了,不再自做主张帮偶重启了。
―――――――――――――――――――――――――――――――――
六、Bug修正
如果你发现程序执行扫描功能时出错,不要心急,原程序就有这个问题。作者和我们开个玩笑?
索性看看怎么回事。设置Ollydbg忽略除了“内存访问异常”之外的所有其它异常选项。
找到下面的地方。
004220B0 A1 60FB4800 mov eax,dword ptr ds:[48FB60]
004220B5 56 push esi
004220B6 85C0 test eax,eax
004220B8 8BF1 mov esi,ecx
004220BA 74 04 je short UnPacked.004220C0
//修改为:JMP 004220C0 ★
004220BC 33C0 xor eax,eax
004220BE FE00 inc byte ptr ds:[eax]
0041F400 E8 1B010000 call UnPacked.0041F520
0041F405 85C0 test eax,eax
0041F407 74 04 je short UnPacked.0041F40D
//修改为:JMP 0041F40D ★
0041F409 33C0 xor eax,eax
0041F40B FE00 inc byte ptr ds:[eax]
OK,现在可以正常执行扫描功能了。只是我不用这个东东。
―――――――――――――――――――――――――――――――――
, _/
/| _.-~/ \_ , 青春都一晌
( /~ / \~-._ |\
`\\ _/ \ ~\ ) 忍把浮名
_-~~~-.) )__/;;,. \_ //'
/'_,\ --~ \ ~~~- ,;;\___( (.-~~~-. 换了破解轻狂
`~ _( ,_..--\ ( ,;'' / ~-- /._`\
/~~//' /' `~\ ) /--.._, )_ `~
" `~" " `" /~'`\ `\\~~\
" " "~' ""
UnPacked By 巢水工作坊――fly [FCG][NUKE][DCM][BCG][CUG]
2004-09-01 04:00
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)