一个通过异常处理进行验证的crackme分析
2010-03-18 15:08
232 查看
crackme2
同样是看雪上的一个小crackme,同样是MFC做的,分析的思路:1.查看OnInit函数中是否有用户自定义的初始化代码。2.查看OnInitDialog函数中是否用用户自定义的初始化代码。3.查看确定按钮的响应函数都做了什么。OK,let's go!
1.加载程序,查看OnInit函数中是否有用户自定义代码。OnInit函数的位置可以用上篇文章中提到的找DoModal函数的方法,这个exe中竟然会调用两次DoModal,不管他,在相应的位置下断,F9运行,断下来的那一个就是咱们要找的那个,这段函数断下来是这个样子滴
代码
00401A63 /. 55 push ebp ; 这里是确定按钮的响应函数
00401A64 |. 8BEC mov ebp, esp
00401A66 |. 83EC 0C sub esp, 0C
00401A69 |. 53 push ebx
00401A6A |. 56 push esi
00401A6B |. 57 push edi
00401A6C |. 894D F4 mov dword ptr [ebp-C], ecx
00401A6F |. 6A 01 push 1
00401A71 |. 8B4D F4 mov ecx, dword ptr [ebp-C]
00401A74 |. E8 F3050000 call <jmp.&MFC42.#6334_CWnd::UpdateData>
00401A79 |. 8B45 F4 mov eax, dword ptr [ebp-C]
00401A7C |. 83C0 60 add eax, 60
00401A7F |. 50 push eax
00401A80 |. B9 78414000 mov ecx, 00404178
00401A85 |. E8 DC050000 call <jmp.&MFC42.#858_CString::operator=>
00401A8A |. 8B4D F4 mov ecx, dword ptr [ebp-C]
00401A8D |. 83C1 64 add ecx, 64
00401A90 |. 51 push ecx
00401A91 |. B9 74414000 mov ecx, 00404174
00401A96 |. E8 CB050000 call <jmp.&MFC42.#858_CString::operator=>
00401A9B |. C745 F8 64000>mov dword ptr [ebp-8], 64
00401AA2 |. F4 hlt ; 这里产生一个异常
00401AA3 |. 5F pop edi
00401AA4 |. 5E pop esi
00401AA5 |. 5B pop ebx
00401AA6 |. 8BE5 mov esp, ebp
00401AA8 |. 5D pop ebp
00401AA9 \. C3 retn
在401AA2处,一个很奇怪的命令,hlt,百度一下,表示的是处理器暂停指令,普通程序应该是不能调用这个指令的,因此这里肯定会产生一个异常,异常的响应函数上面已经给出了。
到此为止,整个crackme的流程基本分析完毕,分析的过程还是有缺憾的,没法跟踪异常处理响应函数中的程序,还要再继续研究一下
补:(怎么样才能让异常处理部分程序执行起来?很简单,在hlt处把程序改成jmp 00401564就好了,囧,因为hlt以后的代码本来就不会被执行到)
同样是看雪上的一个小crackme,同样是MFC做的,分析的思路:1.查看OnInit函数中是否有用户自定义的初始化代码。2.查看OnInitDialog函数中是否用用户自定义的初始化代码。3.查看确定按钮的响应函数都做了什么。OK,let's go!
1.加载程序,查看OnInit函数中是否有用户自定义代码。OnInit函数的位置可以用上篇文章中提到的找DoModal函数的方法,这个exe中竟然会调用两次DoModal,不管他,在相应的位置下断,F9运行,断下来的那一个就是咱们要找的那个,这段函数断下来是这个样子滴
代码
00401A63 /. 55 push ebp ; 这里是确定按钮的响应函数
00401A64 |. 8BEC mov ebp, esp
00401A66 |. 83EC 0C sub esp, 0C
00401A69 |. 53 push ebx
00401A6A |. 56 push esi
00401A6B |. 57 push edi
00401A6C |. 894D F4 mov dword ptr [ebp-C], ecx
00401A6F |. 6A 01 push 1
00401A71 |. 8B4D F4 mov ecx, dword ptr [ebp-C]
00401A74 |. E8 F3050000 call <jmp.&MFC42.#6334_CWnd::UpdateData>
00401A79 |. 8B45 F4 mov eax, dword ptr [ebp-C]
00401A7C |. 83C0 60 add eax, 60
00401A7F |. 50 push eax
00401A80 |. B9 78414000 mov ecx, 00404178
00401A85 |. E8 DC050000 call <jmp.&MFC42.#858_CString::operator=>
00401A8A |. 8B4D F4 mov ecx, dword ptr [ebp-C]
00401A8D |. 83C1 64 add ecx, 64
00401A90 |. 51 push ecx
00401A91 |. B9 74414000 mov ecx, 00404174
00401A96 |. E8 CB050000 call <jmp.&MFC42.#858_CString::operator=>
00401A9B |. C745 F8 64000>mov dword ptr [ebp-8], 64
00401AA2 |. F4 hlt ; 这里产生一个异常
00401AA3 |. 5F pop edi
00401AA4 |. 5E pop esi
00401AA5 |. 5B pop ebx
00401AA6 |. 8BE5 mov esp, ebp
00401AA8 |. 5D pop ebp
00401AA9 \. C3 retn
在401AA2处,一个很奇怪的命令,hlt,百度一下,表示的是处理器暂停指令,普通程序应该是不能调用这个指令的,因此这里肯定会产生一个异常,异常的响应函数上面已经给出了。
到此为止,整个crackme的流程基本分析完毕,分析的过程还是有缺憾的,没法跟踪异常处理响应函数中的程序,还要再继续研究一下
补:(怎么样才能让异常处理部分程序执行起来?很简单,在hlt处把程序改成jmp 00401564就好了,囧,因为hlt以后的代码本来就不会被执行到)
相关文章推荐
- 一个简单的表单提交页面,通过js进行验证
- 未能加载文件或程序集“XXXXX”或它的某一个依赖项。未能验证强名称签名。此程序集可能已被篡改,或者已被延迟签名,但没有用正确的私钥进行完全签名。 (异常来自 HRESULT:0x80131045)
- DetailsView中如何进行数据验证,如何处理数据库的异常
- 一个完整的通过encoding/json信息传递格式,采用http.POST利用进行与服务器通信,并对返回结果进行解析处理的典型案例
- Android Handler机制 (一个Thead中可以建立多个Hander,通过msg.target保证MessageQueue中的每个msg交由发送message的handler进行处理 ,但是 每个线程中最多只有一个Looper,肯定也就一个MessageQuque)
- 两个结构相同的表通过union连接称为一个表,然后在对新的表进行处理
- Laravel中使用FormRequest进行表单验证及对验证异常进行自定义处理
- 一天一个Java基础——通过异常处理错误
- #菜鸟新手EclipseJavaEE&MySQL&Tomcat#关于一个Eclipse中登陆界面通过连接MySQL数据库进行验证的小体验(感谢qq群友引燃的解答让我解决这个小问题)
- 实现一个数值加法函数,返回两个数字的和。要求能进行参数验证,若参数不是数字或为空则抛出异常。
- catch和throw同时使用---通过多个方法协作处理同一个异常
- 简单分析一个通过 js 劫持进行案例
- 通过分析exevc系统调用处理过程来理解Linux内核如何装载和启动一个可执行程序
- Android Handler机制 (一个Thead中可以建立多个Hander,通过msg.target保证MessageQueue中的每个msg交由发送message的handler进行处理 ,但是
- 用Java实现的一个密码验证 以及Java异常处理流程和runtime异常以及checked异常之间的区别
- Ambari-Server Rest API处理2(Ambari-Server通过Rest API进行服务安装、部署、操作流程+操作源码分析)
- 在通过hibernate进行删除操作时遇到的一个异常
- VB.Net 2003 “应用程序生成了一个无法处理的异常”故障分析与解决
- 异常不管咋样,只要抛出了,不管是方法级别抛出,还是类级别抛出。终究有一个地方要对异常进行处理
- 未能加载文件或程序集“Enyim.Caching”或它的某一个依赖项。未能验证强名称签名。此程序集可能已被篡改,或者已被延迟签名,但没有用正确的私钥进行完全签名。 (异常来自 HRESULT:0x80