作 者:
wynney
时 间: 2006-11-09,18:40
链 接: http://bbs.pediy.com/showthread.php?t=34659
【文章标题】: ASPr带壳调试+内存校验完整分析+Inline Loader[Delphi开源]+语音使用录象
【文章作者】: wynney
【作者主页】: http://ReverserCracker.Spaces.Live.Com
【软件名称】: Tail4win 2.7
【软件大小】: 765K
【使用工具】: Delphi 7、OD
【下载地址】: http://74530.cn/3800hk/Files.rar
【加壳方式】: ASProtect 2.3 SKE build 05.14 Beta
【作者声明】: Dup2、KeyMake、Inline Loader对比
--------------------------------------------------------------------------------
【详细过程】
一、前言
呵呵,昨天才发现有这么个活动,参加玩玩吧,重在参与嘛:)文章中既有调试又有壳的分析又有编程又有工具,还真不知道应该发到哪个区去
像ASPr一类猛壳加壳的软件会有内存校验,一般的补丁工具制作的内存补丁,一是表现得很不稳定,导致补丁无效,二是被ASPr
检测到,提示Protection Error:45之类的错误
当然你若想用Dup2、KeyMake来做ASPr的内存补丁,也可以!那就还需要填上躲避校验值的补丁数据,比较麻烦,但是这个相对于一些老鸟而言是很简单的事了。于是,本人就写了个补丁制作工具,只需填写补丁数据[不需要原始数据,不需要设置跳过校验]即可,也不会被内存校验到。不足的是开有杀毒软件会导致补丁不够稳定[在某些机器上测试有此情况,我的机器上却没有]。
二、带壳调试
带壳动态调试最起码的要求是目标程序能够在OD下正常的跑得起来。
1、未注册启动就有个注册框
2、注册框上提示“You have 30 day(s) left”
3、看注册方式是重启验证
4、假注册试试,提示“Serial is not valid, please input again”
既然如此,我们就从注册框入手
5、忽略除了INT3和指定异常之外的所有异常、OD载入
6、F9两次中断在INT3异常,Alt+M在Code段F9中断在OEP
7、搜索所有参考文本字符串
文本字符串参考位于 Tail4win:
地址 反汇编 文本字符串
004D843C mov edx,Tail4win.004D858 ASCII "Trial expired, please register."
004D8448 push Tail4win.004D85A8 ASCII "You have "
004D845E push Tail4win.004D85BC ASCII " day(s) left"
004D84B5 mov edx,Tail4win.004D85D ASCII "This copy is licensed to "
004D84DB push Tail4win.004D85F8 ASCII "You hava not register. This copy left "
004D84F8 push Tail4win.004D8628 ASCII " days to use."
004D86FD push Tail4win.004D8724 ASCII "System Error"
004D8702 push Tail4win.004D8734 ASCII "Form create error, please send mail to support@withdata.com!"
004D88DA mov edx,Tail4win.004D8A0 ASCII "can not open "
004D8A24 push Tail4win.004D8A98 ASCII "OutputDebugString"
004D8B82 mov edx,Tail4win.004D8C1 ASCII "/Software/withdata/tail4win/recent"
004D8B92 mov edx,Tail4win.004D8C4 ASCII "loadlines"
004D8B97 mov eax,Tail4win.004D8C5 ASCII "Software/withdata/tail4win"
004D8BBA mov edx,Tail4win.004D8C8 ASCII "editor"
004D8BBF mov eax,Tail4win.004D8C5 ASCII "Software/withdata/tail4win"
004D8BE6 mov edx,Tail4win.004D8C9 ASCII "notepad"
004D8D0D mov edx,Tail4win.004D8D7 ASCII "This copy is licensed to "
文本字符串参考位于 Tail4win:
地址 反汇编 文本字符串
004D2ADF push Tail4win.004D2B40 ASCII "Registration"
004D2AE4 push Tail4win.004D2B50 ASCII "Thank you for your registration!"
004D2B01 push Tail4win.004D2B40 ASCII "Registration"
004D2B06 push Tail4win.004D2B74 ASCII "Serial is not valid, please input again!"
从上面的信息可以看出,一是通过注册表实现重启验证[Software/withdata/tail4win],二是我们找到了2中的提示
8、双击004D8448来到这里,因为是带壳调试,所有我们要下的断点必须都是硬件断点。
004D841D E8 F6A5FFFF call Tail4win.004D2A18 ; 这里是关键Call,下硬件执行断点
004D8422 84C0 test al,al ; 跳转是受al的限制的,al为1才可以实现跳转
004D8424 75 66 jnz short Tail4win.004D848C
004D8426 8B45 F8 mov eax,dword ptr ss:[ebp-8]
004D8429 8BB0 34030000 mov esi,dword ptr ds:[eax+334]
004D842F 85F6 test esi,esi
004D8431 75 15 jnz short Tail4win.004D8448
004D8433 8B45 F8 mov eax,dword ptr ss:[ebp-8]
004D8436 8B80 14030000 mov eax,dword ptr ds:[eax+314]
004D843C BA 80854D00 mov edx,Tail4win.004D8580 ; ASCII "Trial expired, please register."
004D8441 E8 D69AF8FF call Tail4win.00461F1C
004D8446 EB 39 jmp short Tail4win.004D8481
004D8448 68 A8854D00 push Tail4win.004D85A8 ; ASCII "You have "
004D844D 8BC6 mov eax,esi
004D844F 33D2 xor edx,edx
004D8451 52 push edx
004D8452 50 push eax
004D8453 8D45 F0 lea eax,dword ptr ss:[ebp-10]
004D8456 E8 910CF3FF call Tail4win.004090EC
004D845B FF75 F0 push dword ptr ss:[ebp-10]
004D845E 68 BC854D00 push Tail4win.004D85BC ; ASCII " day(s) left"
004D8463 8D45 F4 lea eax,dword ptr ss:[ebp-C]
9、忽略所有异常,重新加载,F9中断在004D841D,F7进入
004D2A18 53 push ebx
004D2A19 56 push esi
004D2A1A 57 push edi
004D2A1B 83C4 F8 add esp,-8
004D2A1E 8BF0 mov esi,eax
004D2A20 33DB xor ebx,ebx
004D2A22 8D86 28030000 lea eax,dword ptr ds:[esi+328]
004D2A28 50 push eax
004D2A29 8D86 24030000 lea eax,dword ptr ds:[esi+324]
004D2A2F 50 push eax
004D2A30 6A 00 push 0
004D2A32 E8 25FDFFFF call Tail4win.004D275C
004D2A37 8BBE 24030000 mov edi,dword ptr ds:[esi+324]
004D2A3D 85FF test edi,edi
004D2A3F 74 1E je short Tail4win.004D2A5F
004D2A41 8BC7 mov eax,edi
004D2A43 E8 806EF3FF call Tail4win.004098C8
004D2A48 85C0 test eax,eax
004D2A4A 76 13 jbe short Tail4win.004D2A5F
004D2A4C 54 push esp
004D2A4D 8D86 2C030000 lea eax,dword ptr ds:[esi+32C]
004D2A53 50 push eax
004D2A54 6A 00 push 0
004D2A56 E8 19FDFFFF call Tail4win.004D2774
004D2A5B B3 01 mov bl,1 ; 如果这里实现,bl就是1
004D2A5D EB 1B jmp short Tail4win.004D2A7A
004D2A5F 8D86 34030000 lea eax,dword ptr ds:[esi+334]
004D2A65 50 push eax
004D2A66 8D86 30030000 lea eax,dword ptr ds:[esi+330]
004D2A6C 50 push eax
004D2A6D 6A 00 push 0
004D2A6F E8 F8FCFFFF call Tail4win.004D276C
004D2A74 84C0 test al,al
004D2A76 74 02 je short Tail4win.004D2A7A
004D2A78 33DB xor ebx,ebx ; 如果这里实现,ebx被清0
004D2A7A 8BC3 mov eax,ebx ; 赋值给eax
004D2A7C 59 pop ecx
004D2A7D 5A pop edx
004D2A7E 5F pop edi
004D2A7F 5E pop esi
004D2A80 5B pop ebx
004D2A81 C3 retn
很明显这上面的代码就相当于一个if条件语句。跟踪发现004D2A78被实现,也就是说eax会被赋值为0,即al=0,自然就要求注册了。
10、OK,我们来检测下,看这里是否是重启验证的关键,删除硬件执行断点和所有断点,在004D2A7A下硬件执行断点,重载,F9
中断第1次
ebx=00000000
eax=00000001
手动更改ebx为1
继续F9
中断第2次
ebx=00000000
eax=00000001
手动更改ebx为1
继续F9
程序运行,注册框没有出现,OK,点Help-->About Tail4win,显示“This copy is licensed to” [注册表里没有注册名]
11、看来这个地方是关键改之
004D2A7A B0 01 mov al,1 ; 赋值1给al,eax摆脱ebx的控制
如果想让其显示注册名,自己就伪造个注册表吧:)
12、使用Dup2和KeyMak制作补丁发现
补丁不是无效就是提示Error,于是便有了下文:)
三、ASPr内存校验完整分析
既然上面我们提到了ASPr内存校验的问题,那么我们就一并分析了吧。
第一部分前言,我们说过被检测到会提示Protection Error:45,那就OK
1、设置忽略除了内存访问和指定异常之外的所有异常。F9运行,中断在第1次内存异常处,别管了
2、搜索所有参考文本字符串
文本字符串参考位于 00F70000..00FC1FFF
地址 反汇编 文本字符串
00FAC9CB push 0FAC9F0 ASCII "Protection Error"
00FACA9F mov edx,0FACAFC ASCII "90"
00FACDEF push 0FACE14 ASCII "103"
00FAD289 push 0FAD330 ASCII "42"
00FAD4EB push 0FAD520 ASCII "151"
00FADAED push 0FADD50 ASCII "85"
时 间: 2006-11-09,18:40
链 接: http://bbs.pediy.com/showthread.php?t=34659
【文章标题】: ASPr带壳调试+内存校验完整分析+Inline Loader[Delphi开源]+语音使用录象
【文章作者】: wynney
【作者主页】: http://ReverserCracker.Spaces.Live.Com
【软件名称】: Tail4win 2.7
【软件大小】: 765K
【使用工具】: Delphi 7、OD
【下载地址】: http://74530.cn/3800hk/Files.rar
【加壳方式】: ASProtect 2.3 SKE build 05.14 Beta
【作者声明】: Dup2、KeyMake、Inline Loader对比
--------------------------------------------------------------------------------
【详细过程】
一、前言
呵呵,昨天才发现有这么个活动,参加玩玩吧,重在参与嘛:)文章中既有调试又有壳的分析又有编程又有工具,还真不知道应该发到哪个区去
像ASPr一类猛壳加壳的软件会有内存校验,一般的补丁工具制作的内存补丁,一是表现得很不稳定,导致补丁无效,二是被ASPr
检测到,提示Protection Error:45之类的错误
当然你若想用Dup2、KeyMake来做ASPr的内存补丁,也可以!那就还需要填上躲避校验值的补丁数据,比较麻烦,但是这个相对于一些老鸟而言是很简单的事了。于是,本人就写了个补丁制作工具,只需填写补丁数据[不需要原始数据,不需要设置跳过校验]即可,也不会被内存校验到。不足的是开有杀毒软件会导致补丁不够稳定[在某些机器上测试有此情况,我的机器上却没有]。
二、带壳调试
带壳动态调试最起码的要求是目标程序能够在OD下正常的跑得起来。
1、未注册启动就有个注册框
2、注册框上提示“You have 30 day(s) left”
3、看注册方式是重启验证
4、假注册试试,提示“Serial is not valid, please input again”
既然如此,我们就从注册框入手
5、忽略除了INT3和指定异常之外的所有异常、OD载入
6、F9两次中断在INT3异常,Alt+M在Code段F9中断在OEP
7、搜索所有参考文本字符串
文本字符串参考位于 Tail4win:
地址 反汇编 文本字符串
004D843C mov edx,Tail4win.004D858 ASCII "Trial expired, please register."
004D8448 push Tail4win.004D85A8 ASCII "You have "
004D845E push Tail4win.004D85BC ASCII " day(s) left"
004D84B5 mov edx,Tail4win.004D85D ASCII "This copy is licensed to "
004D84DB push Tail4win.004D85F8 ASCII "You hava not register. This copy left "
004D84F8 push Tail4win.004D8628 ASCII " days to use."
004D86FD push Tail4win.004D8724 ASCII "System Error"
004D8702 push Tail4win.004D8734 ASCII "Form create error, please send mail to support@withdata.com!"
004D88DA mov edx,Tail4win.004D8A0 ASCII "can not open "
004D8A24 push Tail4win.004D8A98 ASCII "OutputDebugString"
004D8B82 mov edx,Tail4win.004D8C1 ASCII "/Software/withdata/tail4win/recent"
004D8B92 mov edx,Tail4win.004D8C4 ASCII "loadlines"
004D8B97 mov eax,Tail4win.004D8C5 ASCII "Software/withdata/tail4win"
004D8BBA mov edx,Tail4win.004D8C8 ASCII "editor"
004D8BBF mov eax,Tail4win.004D8C5 ASCII "Software/withdata/tail4win"
004D8BE6 mov edx,Tail4win.004D8C9 ASCII "notepad"
004D8D0D mov edx,Tail4win.004D8D7 ASCII "This copy is licensed to "
文本字符串参考位于 Tail4win:
地址 反汇编 文本字符串
004D2ADF push Tail4win.004D2B40 ASCII "Registration"
004D2AE4 push Tail4win.004D2B50 ASCII "Thank you for your registration!"
004D2B01 push Tail4win.004D2B40 ASCII "Registration"
004D2B06 push Tail4win.004D2B74 ASCII "Serial is not valid, please input again!"
从上面的信息可以看出,一是通过注册表实现重启验证[Software/withdata/tail4win],二是我们找到了2中的提示
8、双击004D8448来到这里,因为是带壳调试,所有我们要下的断点必须都是硬件断点。
004D841D E8 F6A5FFFF call Tail4win.004D2A18 ; 这里是关键Call,下硬件执行断点
004D8422 84C0 test al,al ; 跳转是受al的限制的,al为1才可以实现跳转
004D8424 75 66 jnz short Tail4win.004D848C
004D8426 8B45 F8 mov eax,dword ptr ss:[ebp-8]
004D8429 8BB0 34030000 mov esi,dword ptr ds:[eax+334]
004D842F 85F6 test esi,esi
004D8431 75 15 jnz short Tail4win.004D8448
004D8433 8B45 F8 mov eax,dword ptr ss:[ebp-8]
004D8436 8B80 14030000 mov eax,dword ptr ds:[eax+314]
004D843C BA 80854D00 mov edx,Tail4win.004D8580 ; ASCII "Trial expired, please register."
004D8441 E8 D69AF8FF call Tail4win.00461F1C
004D8446 EB 39 jmp short Tail4win.004D8481
004D8448 68 A8854D00 push Tail4win.004D85A8 ; ASCII "You have "
004D844D 8BC6 mov eax,esi
004D844F 33D2 xor edx,edx
004D8451 52 push edx
004D8452 50 push eax
004D8453 8D45 F0 lea eax,dword ptr ss:[ebp-10]
004D8456 E8 910CF3FF call Tail4win.004090EC
004D845B FF75 F0 push dword ptr ss:[ebp-10]
004D845E 68 BC854D00 push Tail4win.004D85BC ; ASCII " day(s) left"
004D8463 8D45 F4 lea eax,dword ptr ss:[ebp-C]
9、忽略所有异常,重新加载,F9中断在004D841D,F7进入
004D2A18 53 push ebx
004D2A19 56 push esi
004D2A1A 57 push edi
004D2A1B 83C4 F8 add esp,-8
004D2A1E 8BF0 mov esi,eax
004D2A20 33DB xor ebx,ebx
004D2A22 8D86 28030000 lea eax,dword ptr ds:[esi+328]
004D2A28 50 push eax
004D2A29 8D86 24030000 lea eax,dword ptr ds:[esi+324]
004D2A2F 50 push eax
004D2A30 6A 00 push 0
004D2A32 E8 25FDFFFF call Tail4win.004D275C
004D2A37 8BBE 24030000 mov edi,dword ptr ds:[esi+324]
004D2A3D 85FF test edi,edi
004D2A3F 74 1E je short Tail4win.004D2A5F
004D2A41 8BC7 mov eax,edi
004D2A43 E8 806EF3FF call Tail4win.004098C8
004D2A48 85C0 test eax,eax
004D2A4A 76 13 jbe short Tail4win.004D2A5F
004D2A4C 54 push esp
004D2A4D 8D86 2C030000 lea eax,dword ptr ds:[esi+32C]
004D2A53 50 push eax
004D2A54 6A 00 push 0
004D2A56 E8 19FDFFFF call Tail4win.004D2774
004D2A5B B3 01 mov bl,1 ; 如果这里实现,bl就是1
004D2A5D EB 1B jmp short Tail4win.004D2A7A
004D2A5F 8D86 34030000 lea eax,dword ptr ds:[esi+334]
004D2A65 50 push eax
004D2A66 8D86 30030000 lea eax,dword ptr ds:[esi+330]
004D2A6C 50 push eax
004D2A6D 6A 00 push 0
004D2A6F E8 F8FCFFFF call Tail4win.004D276C
004D2A74 84C0 test al,al
004D2A76 74 02 je short Tail4win.004D2A7A
004D2A78 33DB xor ebx,ebx ; 如果这里实现,ebx被清0
004D2A7A 8BC3 mov eax,ebx ; 赋值给eax
004D2A7C 59 pop ecx
004D2A7D 5A pop edx
004D2A7E 5F pop edi
004D2A7F 5E pop esi
004D2A80 5B pop ebx
004D2A81 C3 retn
很明显这上面的代码就相当于一个if条件语句。跟踪发现004D2A78被实现,也就是说eax会被赋值为0,即al=0,自然就要求注册了。
10、OK,我们来检测下,看这里是否是重启验证的关键,删除硬件执行断点和所有断点,在004D2A7A下硬件执行断点,重载,F9
中断第1次
ebx=00000000
eax=00000001
手动更改ebx为1
继续F9
中断第2次
ebx=00000000
eax=00000001
手动更改ebx为1
继续F9
程序运行,注册框没有出现,OK,点Help-->About Tail4win,显示“This copy is licensed to” [注册表里没有注册名]
11、看来这个地方是关键改之
004D2A7A B0 01 mov al,1 ; 赋值1给al,eax摆脱ebx的控制
如果想让其显示注册名,自己就伪造个注册表吧:)
12、使用Dup2和KeyMak制作补丁发现
补丁不是无效就是提示Error,于是便有了下文:)
三、ASPr内存校验完整分析
既然上面我们提到了ASPr内存校验的问题,那么我们就一并分析了吧。
第一部分前言,我们说过被检测到会提示Protection Error:45,那就OK
1、设置忽略除了内存访问和指定异常之外的所有异常。F9运行,中断在第1次内存异常处,别管了
2、搜索所有参考文本字符串
文本字符串参考位于 00F70000..00FC1FFF
地址 反汇编 文本字符串
00FAC9CB push 0FAC9F0 ASCII "Protection Error"
00FACA9F mov edx,0FACAFC ASCII "90"
00FACDEF push 0FACE14 ASCII "103"
00FAD289 push 0FAD330 ASCII "42"
00FAD4EB push 0FAD520 ASCII "151"
00FADAED push 0FADD50 ASCII "85"