易语言破解之绕VM思路
<h1 id="0x1追踪ebp-4">0x1追踪</h1><h2 id="介绍">介绍</h2>
<p>找到按钮事件特征码的位置,可以发现call调用的是<code></code>的值的位置,若找到<code></code>的值是从哪里来的,就算别人把按钮事件特征码整个给vm掉了,也能追踪到按钮事件特征码</p>
<h2 id="实例">实例</h2>
<p>在按钮事件特征码附近有个<code>beginprocessevent</code>函数,在它下面有一个汇编是给将<code>eax</code>的值赋值给<code></code>,而<code>eax</code>的值是从<code>beginprocessevent</code>函数返回的,当触发按钮操作后,<code>eax</code>的值是不等于0的,所以在下个条件断点</p>
<p><img src="https://img-blog.csdnimg.cn/fcf83c5880bd4067a5d179ff118cdc39.png" alt="请添加图片描述" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/152cfd45e26b4b879873fe8305957968.png" alt="请添加图片描述" loading="lazy"></p>
<p>运行程序点击按钮,断点断下来后按enter进入<code>call test.krnln_?BeginProcessEvent@CKrnl></code>,里面有许多个retn,在每个retn处都下断</p>
<p><img src="https://img-blog.csdnimg.cn/61997838849f4443af578b68fb47bd64.png" alt="请添加图片描述" loading="lazy"></p>
<p>点击运行程序,如果不触发按钮事件还能断下来的断点我们直接取消掉,直至找到按钮触发的断点</p>
<p><img src="https://img-blog.csdnimg.cn/e80797c60be8454188746032d2134e56.png" alt="请添加图片描述" loading="lazy"></p>
<p>程序在retn处断下来后查看OD右边的寄存器窗口的eax值,此处eax的值为<code>4010D8</code></p>
<p><img src="https://img-blog.csdnimg.cn/39e2ea674e1648dcb4d1f6871417dcd8.png" alt="请添加图片描述" loading="lazy"></p>
<p>eax的值就是的值,ctrl+G搜eax的值跳转到按钮事件特征码的函数头位置</p>
<p><img src="https://img-blog.csdnimg.cn/99c4845a3b384b6bbc062540649c5e29.png" alt="请添加图片描述" loading="lazy"></p>
<p></p>
<p>提取retn断点处的特征码用于以后可直接追踪按钮事件特征码</p>
<pre><code>8B 70 04 85 F6 74 4C 8B 54 24 18 85 ED 89 93 E4 01 00 00 74 12 8B C5 5F 89 83 E8 01 00 00 8B C6
5E 5D 5B 59 C2 10 00
</code></pre>
<p><img src="https://img-blog.csdnimg.cn/df0630bb03044a5780a190f53089424b.png" alt="请添加图片描述" loading="lazy"></p>
<h1 id="0x2重载内核dll">0X2重载内核Dll</h1>
<h2 id="介绍-1">介绍</h2>
<p>通常写易语言软件的作者都会将按钮事件特征码整段都给vm掉,但是他们忽略了一个点, 没有把按钮事件特征码其外层的call进行vm, 而这个外层call走的是易语言的内核函数</p>
<p>在按钮事件特征码的call下断点,查看右下角的堆栈窗口可找到外层call</p>
<p><img src="https://img-blog.csdnimg.cn/ca1586aaa1934caabcf21d444c460bf4.png" alt="请添加图片描述" loading="lazy"></p>
<p>鼠标右键反汇编窗口跟随,找到外层<code>call test.krnln_?Notify@CKrnlApp@@QAEHHK></code></p>
<p><img src="https://img-blog.csdnimg.cn/6d198a47fdba40ababc79e95b357b426.png" alt="请添加图片描述" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/5cb4ae81b1154bfdbafec2d4dc2d5469.png" alt="请添加图片描述" loading="lazy"></p>
<p>进入这个call找到函数头部并提取特征码:<code>64 A1 00 00 00 00 6A FF 68 ?? ?? ?? ?? 50 64 89 25 00 00 00 00 83 EC 10 53 55 8B 6C 24 28</code></p>
<p><img src="https://img-blog.csdnimg.cn/de7f719b8bf74a7bb4bc4bb83327c754.png" alt="请添加图片描述" loading="lazy"></p>
<h2 id="实例-1">实例</h2>
<p>首先准备好易语言的dll文件来用作后续的dll注入,为了识别是否注入成功,这里写了一个信息框</p>
<p><img src="https://img-blog.csdnimg.cn/ad89b06b4e314db0af47ab086e5278e1.png" alt="请添加图片描述" loading="lazy"></p>
<p>将要破解的软件的按钮事件特征码给vm掉</p>
<p><img src="https://img-blog.csdnimg.cn/89f38e3357b14a4bb0d4b3a572e32710.png" alt="请添加图片描述" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/a10cc1683dfc44f49147404d63d8ff36.png" alt="请添加图片描述" loading="lazy"></p>
<p></p>
<p>将加完vm后的软件拖入OD,使用StrongOD插件注入dll,这里选择远程注入</p>
<p><img src="https://img-blog.csdnimg.cn/c28766fa790f4ae7878f9022c34a66f1.png" alt="请添加图片描述" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/5ecaa592772f449899f0bac851f5a3cc.png" alt="请添加图片描述" loading="lazy"></p>
<p>在代码节搜索前面所记述的特征码,发现有两处,第一个地址为<code>40ee20</code>,第二个地址为<code>9c19a40</code> ,<code>40ee20</code>是程序本身的,<code>9c19a40</code>是注入的dll的</p>
<p><img src="https://img-blog.csdnimg.cn/59aa4e3357a54e0a97e7b0ab69369447.png" alt="请添加图片描述" loading="lazy"></p>
<p>ctrl+G转到对应的地址,修改其汇编代码,将<code>call 40ee20</code>修改为<code>call 9c19a40</code></p>
<p><img src="https://img-blog.csdnimg.cn/7dd5d588f2934c2aa7b31e64490cc677.png" alt="请添加图片描述" loading="lazy"></p>
<p>通过查询模块窗口,发现这个<code>9c19a40</code>是在注入的dll的代码段的范围之内,然后双击这个dll进入它的代码段</p>
<p><img src="https://img-blog.csdnimg.cn/8d807910ebff4970941af9f3a5acb84b.png" alt="请添加图片描述" loading="lazy"></p>
<p>搜索按钮事件特征码并下断点(其实就是在注入的dll下按钮事件特征码断点)</p>
<p><img src="https://img-blog.csdnimg.cn/419c68cff7544c83a635456c8f163f46.png" alt="请添加图片描述" loading="lazy"></p>
<p>运行程序点击按钮,发现程序在刚刚下的断点断下了</p>
<p><img src="https://img-blog.csdnimg.cn/9bd245a5861f4e7a9be398114e63729b.png" alt="请添加图片描述" loading="lazy"></p>
<p>F7单步步入这个call,这个call的地址就是真正的按钮事件函数,并没有任何的vm痕迹</p>
<p><img src="https://img-blog.csdnimg.cn/2d1d5fa91e894688a239a1818b7ba58d.png" alt="请添加图片描述" loading="lazy"></p>
<h1 id="0x3偏移量追踪按钮事件">0X3偏移量追踪按钮事件</h1>
<h2 id="介绍-2">介绍</h2>
<p>新建一个易语言程序并将其拖入OD打开,二进制搜索<code>FF 25</code>转到易语言体处的第三个jmp下断</p>
<p><img src="https://img-blog.csdnimg.cn/f714f3a18405416bbb8e9299256f4b02.png" alt="请添加图片描述" loading="lazy"></p>
<p>然后一路往下跟,跟到<code>calltest.krnln_?LibInitUserProgram</code>,F7进如此call</p>
<p>走到<code>mov eax,dword ptr ds:</code>,并提取其特征: <code>55 8B EC 6A FF 68 ?? ?? ?? ?? 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 81 EC AC 01 00 00</code></p>
<p><img src="https://img-blog.csdnimg.cn/9026de1cc2774c3bb968b523be55d93c.png" alt="请添加图片描述" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/0274c787c1bf48fa87d5e0daa7640c9c.png" alt="请添加图片描述" loading="lazy"></p>
<p>将此处的内存地址复制下来,到内存窗口里搜索此地址</p>
<p><img src="https://img-blog.csdnimg.cn/b2b3a380e34742b28c8158974e67785c.png" alt="请添加图片描述" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/398173896e6c46ad9c743a36cc57a36e.png" alt="请添加图片描述" loading="lazy"></p>
<p>在内存窗口找到第二行第四列所对应的地址<code>550370</code>,然后转到此地址处</p>
<p><img src="https://img-blog.csdnimg.cn/db2ce112cae047d4b408b07afa67fa29.png" alt="请添加图片描述" loading="lazy"><br>
<img src="https://img-blog.csdnimg.cn/5895fb16138d4dca995d8b3e61ccf08f.png" alt="请添加图片描述" loading="lazy"></p>
<p>在内存窗口里往下拉,直至可以看到左边的ascii窗口处有“按钮”字样,其实这是一个结构体,里面有些成员是用于追踪按钮事件的偏移量</p>
<p>怎么知道哪个是偏移量呢?有一个规律05....01....43,这个<code>43</code>就是偏移量,也就是说05...01再往后的值就是偏移量</p>
<p><img src="https://img-blog.csdnimg.cn/f96993ac106f45ec987b475ba99492ca.png" alt="请添加图片描述" loading="lazy"></p>
<p></p>
<p>回到反汇编窗口的易语言体处然后往上拉,找到nop下面的反汇编地址,此处地址是<code>4010ac</code></p>
<p>注意:此处的反汇编代码是不固定的,不一定是pop esi,有时候是push ebp</p>
<p><img src="https://img-blog.csdnimg.cn/d552b09d7b8f4b6885a97e0031c18c1a.png" alt="请添加图片描述" loading="lazy"></p>
<p>计算4010ac + 43(偏移量)= 4010EF, 计算出的这个地址就是按钮事件的函数头部</p>
<p><img src="https://img-blog.csdnimg.cn/0484fe9cd84547fcabb2095856df3743.png" alt="请添加图片描述" loading="lazy"></p>
<h2 id="实例-2">实例</h2>
<p>准备好一个vm好了的易语言程序,这里就不演示VM过程了</p>
<p>在OD搜索<code>createwindow</code>然后下断,这一步的操作是为了让vm把壳吐出来</p>
<p><img src="https://img-blog.csdnimg.cn/2a02a0bb396a4f2c95a0fa439a9b4afe.png" alt="请添加图片描述" loading="lazy"></p>
<p>内存中搜索前文所准备好的特征码:<code>55 8B EC 6A FF 68 ?? ?? ?? ?? 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 81 EC AC 01 00 00</code>,找到关键函数地址<code>0x437600</code></p>
<p><img src="https://img-blog.csdnimg.cn/0e1cfbf0921f46f2b26b7dec1cba970d.png" alt="请添加图片描述" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/d2fb2507c74d47588faba23b248ab1af.png" alt="请添加图片描述" loading="lazy"></p>
<p>根据前文的讲过的操作寻找到偏移量(过程不演示了),偏移量是<code>B0</code></p>
<p><img src="https://img-blog.csdnimg.cn/426bb1a6292d4ce3a069c5b6f43cced1.png" alt="请添加图片描述" loading="lazy"></p>
<p>转到易语言体的反汇编处往上拉,nop下面的地址是<code>401004</code>,然后加上偏移量等于<code>4010b4</code>,这个地址就是按钮事件函数地址</p>
<p><img src="https://img-blog.csdnimg.cn/cdcf7ba85d174bdd91f9e5c03d8a5f5d.png" alt="请添加图片描述" loading="lazy"></p>
<p></p><br><br>
来源:https://www.cnblogs.com/henry666/p/16621337.html
頁:
[1]