逆向工程核心原理学习笔记(二十七):abex'crackme #2 破解算法

来源:互联网 发布:openwrt 域名白名单 编辑:程序博客网 时间:2024/06/06 18:21

这次我们来看一下这个程序是如何加密的,我们重新开始我们的调试


然后我们在win7中调试的时候利用查找所有参考字符串并没有我们之前的信息框字符串信息:






我们这一次使用中文搜索引擎-智能搜索:








双击倒数第二个,然后我们知道这是一个信息框的提示信息,所以这应该处于一个按钮的处理函数之中,我们往上翻:







看到了栈桢,这就应该是按钮处理函数的开始,也就是函数头部,我们下一个断点,然后执行程序:






程序果真断在了这里,再往下一步一步执行,第一个call没什么卵用,第二第三个call都没有返回,我们就继续往下走:






我们看到了vbaobjset

它有一个含义就是__vbaObjSet用于将 对象变量 指向内 存中的对象

所以我们猜测这里开始存东西了,具体存什么,我们现在还不知道,我们继续单步调试:






 

当程序执行到如下代码时:

00402F98   .  FF91 A0000000 CALL    DWORD PTR DS:[ECX+0xA0]                      ;  获取name

 

我们看到堆栈中存储的数据是字符串Rever,也就是我们输入的东西:







所哟所以我们现在已经可以明确知道两个地址的功能:

 

1. 保存name的字符串对象

00402F8E   .  8D95 78FFFFFF LEA     EDX, DWORD PTR SS:[EBP-0x88]                 ;  

保存的地址:0x18F3D8

 

2.获取name字符串

00402F98   .  FF91 A0000000 CALL    DWORD PTR DS:[ECX+0xA0]                      ;  

 

存储的地址:0x18F3D8

 

 

然后呢,我们继续往下调试,这个时候需要注意下有些call我们完全不需要步入,因为那是vb的一些封装的函数,例如:






我们不需要跟进,慢慢往下调试,并不断观察数据:

 

走到这的时候:






发现




所以我们确定:

函数功能:获取name第一个字符

004031F0   .  FF15 80104000 CALL    DWORD PTR DS:[<&MSVBVM60.__vbaStrVarVal>]    ; \__vbaStrVarVal

 

继续往下走:








我们发现String 注释变成了52,所以我们确定:

函数功能:将字符转换成ACSII

 

004031F7   .  FF15 1C104000 CALL    DWORD PTR DS:[<&MSVBVM60.#516>]              ; \rtcAnsiValueBstr

 

当我们走到地址如下:



发现一个参数0x64,这个参数可能是一个线索,记录一下

 

继续往下走:





ECXcount)计数。可以作为通用寄存器使用。常用来保存计数值,如在循环、位移和串处理指令中作隐含计数器。

执行完如下的函数之后,看到ECX寄存器数据下面两个,即18F300,这个是ECX寄存器的缓冲区,看到里面的数据变成了B6

 

我们得知52 + 64 =B664位)

由此知道了算法

 

继续往下走:



发现下面有个函数

 

0040327B   .  FF15 84104000 CALL    DWORD PTR DS:[<&MSVBVM60.__vbaVarCat>]       ;  msvbvm60.__vbaVarCat

 

这个函数是个字符串连接的函数,那么肯定有参数的,我们猜测ECX,EDX就是参数,EAX就是结果

 

我们继续执行胰腺癌,看看,并且注意数据区域的变化:





此时我们发现,B6数据已经变成了字符串B6,由此我们知道上面的代码是连接并转换字符串的函数

 

继续:














发现是一个循环:














经过我们的验证程序的确是这样的

 

 

算法就是 EAX = (EDX + ECX) 循环,最终得到EAX

 

最终得到结果:




结果B6C9DAC9

 

打开源程序试一下:







算法到此为止.










我#,。。。。累死了

阅读全文
0 0
原创粉丝点击