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

1、双击打开程序

记录一个简单的ASM程序破解过程_第1张图片

随意输入(333),点击check,弹出MessageBox

记录一个简单的ASM程序破解过程_第2张图片

2、将程序拖入PEid,查看编译器、链接器、PE区段、导入表等。
     导入表中函数如下:

记录一个简单的ASM程序破解过程_第3张图片

3、将程序拖入OD中,根据以上信息,搜索MessageBoxA,双击进入,下断

记录一个简单的ASM程序破解过程_第4张图片

F9运行,断在MessageBoxA处,输入任意值,点击check

记录一个简单的ASM程序破解过程_第5张图片

鼠标选中 返回到......
栈回溯到上层堆栈
此时可以看到我们的输入与其中 fubar 进行比较,似乎没这么容易吧
暂时在GetDlgItemTextA函数处下断,单步

记录一个简单的ASM程序破解过程_第6张图片

程序无法继续单步,而是停在断点的下一行

记录一个简单的ASM程序破解过程_第7张图片

初步分析:该语句将EAX寄存器中的内容赋值给 DS:[401113],我们查看一下这块内存
点击 M 查看内存,可以看到 401113处为代码段,内存访问权限为 RE,即可读可执行,不可写

记录一个简单的ASM程序破解过程_第8张图片

还可右键,数据窗口跟随,查看内存地址,右键选择反汇编,根据上下文判断该地址处于代码段,而代码段的内存访问权限一般为可读可执行,不可写

记录一个简单的ASM程序破解过程_第9张图片

既然该内存地址处不可写,那么合理的推测就是触发了内存访问异常
我们能想到的应该就是寻找程序的异常处理函数,这时似乎OD已经无能为力了,我们求助于强大的 IDA

4、将程序拖入IDA

  打开导入函数表,查找异常处理函数,此时合理的猜测是.....

记录一个简单的ASM程序破解过程_第10张图片

双击函数名,进入函数原型

记录一个简单的ASM程序破解过程_第11张图片

我们在函数名下面,DATA XREF处,右键选择Ctrl+X (查看何处引用了此函数),进入引入异常函数处

记录一个简单的ASM程序破解过程_第12张图片

此时,在CODE CREF处,右键选择Ctrl+X,进入代码区

记录一个简单的ASM程序破解过程_第13张图片

此时发现,该函数唯一的一个参数是一个函数指针,这个函数可能就是我们最终要找的,双击进入

记录一个简单的ASM程序破解过程_第14张图片

发现是一片数据,此时我们点击函数名(命名为顶层异常处理函数),键下 C,将数据转换为代码,接着键下 P,创建一个函数 ,再键下N,修改函数名为TopLevelExceptionFilter

记录一个简单的ASM程序破解过程_第15张图片

至此,关键函数已找到,接下来该着重分析这个函数了

记录一个简单的ASM程序破解过程_第16张图片
记录一个简单的ASM程序破解过程_第17张图片

得到3个重要的值,EDI=[40304E],ESI=[40332A],EIP=[40107F]
在IDA中,打开16进制窗口查找这几个地址,发现EDI所指向地址的值为magic
ESI中为0,EIP中为无意义值
那么,回到OD中进行分析

5、回归OD中进行分析
从IDA中分析得到的EIP,即下一条指令执行地址为[40107F];
而我们从前面的OD分析中知道了程序在40106B处发生内存访问异常,
经过异常处理函数处理异常之后,我们已经知道程序将会跳到EIP=[40107F]处执行

记录一个简单的ASM程序破解过程_第18张图片

到这一步,就好办了
首先,mov ecx,6 ;设置循环次数为6
然后是逐字节比较ESI 与EDI中的字符串,上面提到EDI中所指向地址的值为magic,与循环次数切合
那么,ESI中所指向的值是什么呢?
我们由上下文可以进行合理的判断,即ESI所指向的是我们自己输入的字符串
废话少说,验证一下

    记录一个简单的ASM程序破解过程_第19张图片

记录一个简单的ASM程序破解过程_第20张图片

是的,就是这样!

你可能感兴趣的:(逆向破解,ASM,OllyDbg,IDA,软件逆向)