32位的程序
但是die并没有识别出这个程序的语言
Exeinfo识别为汇编语言
就这样
随便输入一下,看看程序的逻辑
Od载入,查找字符串
发现了提示错误的语句
定位到
发现如果要破解软件的话,可以直接修改标志位或者修改jcc指令,也可以修改上面的比较
这样暴力破解这个软件我们就可以解决了,现在我们思考如何还原这个软件的验证算法
我们复习一下je这个指令
在零标志位为0时跳转
而这个取决于上一条指令
Cmp eax,0x0
这个比较指令将eax寄存器里面的值和0对比,如果eax为0就设标志位为0
首先找到这个函数的开头位置分析
发现函数的开头有两个跳转
第二个跳转的位置就是直接结束程序了,所以我们不需要管第二个分支
那我们就在0x40106C的位置下个断点看看好了
发现直接调用了程序的文本框
我们输入12345678然后点击check
程序断在了断点处
GetDlgItemTextA函数可以读取文本框的内容
我们输入的字符已经被存入到了堆栈空间
数据窗口跟随一下
一直运行到0x401099
发现调用了GetVolumeInformation函数
这个函数是window函数里面检索指定卷的信息的函数,它可以获取卷的文件系统名称、卷序列号、最大文件名长度等信息
获得磁盘驱动卷编号
即这个
这样我们就可以看到我们输入的字符串了
看一下我们把这个软件放到哪里了
然后继续f8
发现这里直接被读取了
同时在内存窗口也可以看到
上面的那个4562-ABEX就是常量字符串,编写程序的时候写入的(需要根据情况判断)
然后再下面调用的函数就是IstrcatA函数
将两个字符串合并
继续分析下面的指令
给前两个汉字的每个字节加一
如果是数字就是给数字的二进制加1
然后执行到了dec这条指令
Dec就是对目标操作数-1
然后我们发现来到了jnz的跳转
由此
我们知道了这个加密是循环的
循环的次数就是dl寄存器被赋予的值
当dl寄存器不为0就一直执行这个循环
所以这里也就是循环2次
变为
修改后的名字还挺像回事
下面的函数又是一段字符串合并
看了这两个合并的函数发现合并后的字符串放到了第二个字符串的地址
然后再继续发现把这俩字符串合并了
然后就是重头戏了
比较函数
所以如果这俩字符串相等就可以成功通过验证
也就是
我们输入的字符串
和
两个常量字符串1和2,以及我们的磁盘名加密后的结果对比
相等就可以注册成功
所以我们可以直接输入加密后的结果
004010F2 |. 68 00204000 push abexcm5.00402000 ; |String1 = "L2C-5781夷菊卷4562-ABEX"
Ok