逆向破解第一课之易语言注册程序破解
<p>破解注册程序流程</p><div class="aplayer aplayer-withlrc" data-id="1455315449" data-server="netease" data-type="song" data-auth="297e206867929b93efa0d3e0f05c4b57" data-theme="#000000" data-preload="auto" data-autoplay="true" data-listmaxheight="340px" data-order="list">
<div class="aplayer-body">
<div class="aplayer-pic"> </div>
<div class="aplayer-info">
<div class="aplayer-music"><span class="aplayer-title"> </span></div>
<div class="aplayer-controller">
<div class="aplayer-time">
<div class="aplayer-volume-wrap"> </div>
<span class="aplayer-time-inner"><span class="aplayer-ptime"><span class="aplayer-dtime"> <button class="aplayer-icon aplayer-icon-loop" type="button"></button></span></span></span></div>
</div>
</div>
<div class="aplayer-notice"> </div>
</div>
</div>
<p> </p>
<p>========</p>
<h2>写的不好大佬勿喷!!!!</h2>
<pre class="highlight-wrap line-numbers"><code id="hljs-0" class="hljs" data-lang="CODE"> 首先写个小易语言,易语言写起来方便就写了易语言的注册程序,c语言调用winapi写窗口类有点麻烦就采用易语言<br>按钮源码</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/2314218/202103/2314218-20210314101532871-181781967.png" alt="" loading="lazy"></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<table class="hljs-ln">
<tbody>
<tr>
<td class="hljs-ln-numbers"> </td>
<td class="hljs-ln-code">
<div class="hljs-ln-line">在这个位置我们看一个我们写的注册程序的验证流程:</div>
</td>
</tr>
<tr>
<td class="hljs-ln-numbers"> </td>
<td class="hljs-ln-code">
<div class="hljs-ln-line">1.点击注册按钮</div>
</td>
</tr>
<tr>
<td class="hljs-ln-numbers"> </td>
<td class="hljs-ln-code">
<div class="hljs-ln-line">2.读取注册码</div>
</td>
</tr>
<tr>
<td class="hljs-ln-numbers"> </td>
<td class="hljs-ln-code">
<div class="hljs-ln-line">3.判断注册码合法性</div>
</td>
</tr>
<tr>
<td class="hljs-ln-numbers"> </td>
<td class="hljs-ln-code">
<div class="hljs-ln-line">4.返回结果</div>
</td>
</tr>
</tbody>
</table>
<p>我们把程序放入OD</p>
<p><br>首先我们现收悉一下OD的界面(因为我也刚入门逆向不久,我只能用我的理解去写可能不太权威,大佬勿喷)</p>
<p><img src="https://img2020.cnblogs.com/blog/2314218/202103/2314218-20210314101713684-1539085316.png" alt="" loading="lazy"></p>
<p> </p>
<p> </p>
<p><br>我们看注册码的验证流程,我们先更读注册码的函数在易语言中常回调GETwindowTextA函数进行读取<br>CTRL+G输入我们跟踪的表达式</p>
<p><img src="https://img2020.cnblogs.com/blog/2314218/202103/2314218-20210314101735129-1104912755.png" alt="" loading="lazy"></p>
<p> </p>
<p> </p>
<p><br>这个是我们汇编指令的函数头也就是GETWindowTextA函数的函数头<br>我们在这下个断点,让程序跑起来</p>
<p><img src="https://img2020.cnblogs.com/blog/2314218/202103/2314218-20210314101840746-1674359839.png" alt="" loading="lazy"></p>
<p> </p>
<p> </p>
<p><br>ok我们看到在这里我们点击一下程序,程序就崩溃了,我们最终要的是在他读取的时候断下来而不是让他一直断在这,那这时我们怎么办呢我们就需要下个条件断点,那我们该怎么下呢,我们先看堆栈,我们定位到函数GETWindowTextA这个函数我们看一下它的几个参数<br>这个001A186C就是它的句柄号,它是读取的注册的这个标签的内容显然不是我们要的效果,我们要的效果是读取编辑框的内容后停下,那我们可以这么下,我们看esp寄存器,我们每次保存的位置都是栈顶esp这个位置,下面的位置为esp+4也就是它的第一个参数<br>我们就可以下这样的条件断点我们要让他不等于这个句柄号的时候停下来因为我们每次断的时候都是句柄为这个值的时候断下来,所以我们让他不等于这个的时候再段我们下的条件断点就为esp+4不等于这个句柄号的时候才断,shlft+f2下条件断点</p>
<p><img src="https://img2020.cnblogs.com/blog/2314218/202103/2314218-20210314101920953-1228992480.png" alt="" loading="lazy"></p>
<p> </p>
<p><img src="https://img2020.cnblogs.com/blog/2314218/202103/2314218-20210314101949229-2082152960.png" alt="" loading="lazy"></p>
<p> </p>
<p> </p>
<p> </p>
<p><br>下完条件断点的时候我们再跑一下是不是没有断的现象了,可以正常输入了我们点一下注册就正常断下了,这个位置就是在读取编辑框内容的时候断下,我们接下去走,走到我们的弹窗位置,因为我们走到弹窗位置我们网上跟就能看到它的验证那一块<br>,我们用自动步过,ctrl+f8</p>
<p><img src="https://img2020.cnblogs.com/blog/2314218/202103/2314218-20210314102025007-1496589809.png" alt="" loading="lazy"></p>
<p> </p>
<p><img src="https://img2020.cnblogs.com/blog/2314218/202103/2314218-20210314102214069-954872463.png" alt="" loading="lazy"></p>
<p> </p>
<p> </p>
<p> </p>
<p><br>在这个位置又进行了读取这个我们不管,我们接着跑</p>
<p><br>ok我们到这个位置程序弹出了注册失败我们网上跟上去看断点,我们发现一个call这个call可能是成功信息call,我们接下来往上定位看到函数头下个断点,把条件断点去掉,然后我们跑一遍,我们在函数头断下,f8单步跳,发现一个大跳转,这个位置是个关键跳我们在这下个断点,跑一编,断的这个位置就是jcc指令也就是我们的if判断语句,我们在这个位置有两个方法进行破解<br>第一个我们使用二进制nop填充也就是不执行if语句,直接往下走</p>
<p> </p>
<p> </p>
<p><img src="https://img2020.cnblogs.com/blog/2314218/202103/2314218-20210314102305775-786992620.png" alt="" loading="lazy"></p>
<p> </p>
<p> </p>
<p><img src="https://img2020.cnblogs.com/blog/2314218/202103/2314218-20210314102347213-1810759705.png" alt="" loading="lazy"></p>
<p> </p>
<p> <img src="https://img2020.cnblogs.com/blog/2314218/202103/2314218-20210314102403250-533048743.png" alt="" loading="lazy"></p>
<p> </p>
<p> <img src="https://img2020.cnblogs.com/blog/2314218/202103/2314218-20210314102431655-1275551330.png" alt="" loading="lazy"></p>
<p> </p>
<p> <img src="https://img2020.cnblogs.com/blog/2314218/202103/2314218-20210314102508895-1865553142.png" alt="" loading="lazy"></p>
<p> </p>
<p> <img src="https://img2020.cnblogs.com/blog/2314218/202103/2314218-20210314102523744-268266754.png" alt="" loading="lazy"></p>
<p> </p>
<p> </p>
<p><br>第二个<br>我们就是在寄存器上操作,因为我们的jcc指令是在我们的efl寄存器je跳转是看zf标志位我们把zf标志位强行修改,修改之后它就不进行跳转让他强行往下执行</p>
<p><img src="https://img2020.cnblogs.com/blog/2314218/202103/2314218-20210314102633643-1627712681.png" alt="" loading="lazy"></p>
<p> </p>
<p> </p>
<p><br>最简单的爆破就实现了</p><br><br>
来源:https://www.cnblogs.com/zmcbk/p/14531655.html
頁:
[1]