记录一个简单的ASM程序破解过程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/brunomarss/article/details/50720990
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所指向的是我们自己输入的字符串
废话少说,验证一下

   



是的,就是这样!

猜你喜欢

转载自blog.csdn.net/brunomarss/article/details/50720990