1、双击打开程序
随意输入(333),点击check,弹出MessageBox
2、将程序拖入PEid,查看编译器、链接器、PE区段、导入表等。
     导入表中函数如下:
3、将程序拖入OD中,根据以上信息,搜索MessageBoxA,双击进入,下断
F9运行,断在MessageBoxA处,输入任意值,点击check
鼠标选中 返回到......
栈回溯到上层堆栈
此时可以看到我们的输入与其中 fubar 进行比较,似乎没这么容易吧
暂时在GetDlgItemTextA函数处下断,单步
程序无法继续单步,而是停在断点的下一行
初步分析:该语句将EAX寄存器中的内容赋值给 DS:[401113],我们查看一下这块内存
点击 M 查看内存,可以看到 401113处为代码段,内存访问权限为 RE,即可读可执行,不可写
还可右键,数据窗口跟随,查看内存地址,右键选择反汇编,根据上下文判断该地址处于代码段,而代码段的内存访问权限一般为可读可执行,不可写
既然该内存地址处不可写,那么合理的推测就是触发了内存访问异常
我们能想到的应该就是寻找程序的异常处理函数,这时似乎OD已经无能为力了,我们求助于强大的 IDA
4、将程序拖入IDA
打开导入函数表,查找异常处理函数,此时合理的猜测是.....
双击函数名,进入函数原型
我们在函数名下面,DATA XREF处,右键选择Ctrl+X (查看何处引用了此函数),进入引入异常函数处
此时,在CODE CREF处,右键选择Ctrl+X,进入代码区
此时发现,该函数唯一的一个参数是一个函数指针,这个函数可能就是我们最终要找的,双击进入
发现是一片数据,此时我们点击函数名(命名为顶层异常处理函数),键下 C,将数据转换为代码,接着键下 P,创建一个函数 ,再键下N,修改函数名为TopLevelExceptionFilter
至此,关键函数已找到,接下来该着重分析这个函数了
得到3个重要的值,EDI=[40304E],ESI=[40332A],EIP=[40107F]
在IDA中,打开16进制窗口查找这几个地址,发现EDI所指向地址的值为magic
ESI中为0,EIP中为无意义值
那么,回到OD中进行分析
5、回归OD中进行分析
从IDA中分析得到的EIP,即下一条指令执行地址为[40107F];
而我们从前面的OD分析中知道了程序在40106B处发生内存访问异常,
经过异常处理函数处理异常之后,我们已经知道程序将会跳到EIP=[40107F]处执行
到这一步,就好办了
首先,mov ecx,6 ;设置循环次数为6
然后是逐字节比较ESI 与EDI中的字符串,上面提到EDI中所指向地址的值为magic,与循环次数切合
那么,ESI中所指向的值是什么呢?
我们由上下文可以进行合理的判断,即ESI所指向的是我们自己输入的字符串
废话少说,验证一下
是的,就是这样!

记录一个简单的ASM程序破解过程相关推荐

  1. 使用Hprose制作一个简单的分布式应用程序

    2019独角兽企业重金招聘Python工程师标准>>> 使用Hprose制作一个简单的分布式应用程序只需要几分钟的时间.本文将用一个简单的实例来带您快速浏览使用Hprose for ...

  2. 第一章 开始 |编写一个简单的C++程序

    学习目标: 编写一个简答的C++程序 学习内容: 1.一个简单的c++程序 2.输入和输出 3.关于注释 4.控制流 5.类简介 6.书店程序 1.1 编写一个简单的c++程序 每个C++程序都包含一 ...

  3. 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

    实验目的: 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 实验过程: 通过vi程序进行编程: int g(int x) { return x + 3; } int f(int x) ...

  4. 使用timer控件创建一个简单的报警程序

    简介: 当我使用计算机工作时,我总是如此的专心致志,以至于每当我过了"一会儿"去看时间时,发现已经过了三个小时,而我却完全没有意识到!所以我决定使用我从Code Project学来 ...

  5. c理c利用计算机怎么弹,通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的...

    通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 计算机的工作方式: 现代计算机的基本体系结构都是采用冯诺依曼结构,冯诺依曼的设计思想最重要之处是"存储程序"的这个概念 ...

  6. 3.2 Lucene实战:一个简单的小程序

    在讲解Lucene索引和检索的原理之前,我们先来实战Lucene:一个简单的小程序! 一.索引小程序 首先,new一个java project,名字叫做LuceneIndex. 然后,在project ...

  7. 编写一个java_Java入门篇(一)——如何编写一个简单的Java程序

    最近准备花费很长一段时间写一些关于Java的从入门到进阶再到项目开发的教程,希望对初学Java的朋友们有所帮助,更快的融入Java的学习之中. 主要内容包括JavaSE.JavaEE的基础知识以及如何 ...

  8. Java入门篇(一)——如何编写一个简单的Java程序

    最近准备花费很长一段时间写一些关于Java的从入门到进阶再到项目开发的教程,希望对初学Java的朋友们有所帮助,更快的融入Java的学习之中. 主要内容包括JavaSE.JavaEE的基础知识以及如何 ...

  9. python编写一个简单的程序验证码_Python实现一个简单的验证码程序

    老师讲完random函数,自己写的,虽然和老师示例的不那么美观,智能,但是也自己想出来的,所以记录一下,代码就需要自己不断的自己练习,实战,才能提高啊!不然就像我们这些大部分靠自学的人,何时能学会.还 ...

最新文章

  1. ViewPager+Fragment基本使用方法(转自网络)
  2. 腾讯扩招3000人,产品硬核技能被曝光,看完我跪了!
  3. 你能想象吗?几年后数据科学家纷纷下岗再就业
  4. 基于IPV6数据包分析(GNS3)
  5. ax的范数最大_矩阵方程ax=b的范数约束最小二乘解.pdf
  6. MVC发布后项目存在于根目录中的子目录中时的css与js、图片路径问题
  7. 如何清除tomcat缓存
  8. 【JAVA SE】第十四章 集合框架、语法糖和泛型
  9. 【思维题 单调栈】loj#2430. 「POI2014」沙拉餐厅 Salad Bar
  10. 怎样设置计算机默认字体及语言,电脑win10系统怎么将paint 3D的语言设置为中文...
  11. 三、Serializer序列化器
  12. Sophix及热修复原理介绍
  13. 【H5】 svg的 defs用法 渐变
  14. 当你对未来迷茫的时候,请打开这个锦囊
  15. 各宽带接入服务商简称整理
  16. 三星手机S8曝光 新机发布或推迟
  17. 7-38 寻找大富翁 (25 分)
  18. 配置Web DashBoard
  19. 用java输出出生日期,生成随机出生日期
  20. Fata erro:Kinetis (connect):Timeout while halting CPU.CPU dones not stop. Sesion aborted!

热门文章

  1. Bluetooth Framework2022更新,新的错误代码
  2. 详解如何在Ubuntu 16.04上增加Swap分区
  3. 腾讯财经股票免费接口
  4. C++ 求Pell数列
  5. 配置xshell文本突出
  6. 物流查询 并将查询到的退回件导出保存在表格里面
  7. 英语日常用语(短句)
  8. 高龄白菜java学习第九十二、三天(java数据结构和算法(13))
  9. JavaScript之BOM和DOM入门
  10. POLYCOM视频会议系统应用