破一桩疑案——硬件错误( 二 )


破一桩疑案——硬件错误
本文插图
可以选择看源码去 , 也可以选择直接用Windbg 反汇编dmp文件中的汇编代码 , 前者留给你们去看 , 我们这次就直接看dmp中的汇编代码;截取部分如下:
0:030> uf VCRUNTIME140!memmove Flow analysis was incomplete, some code may be missing VCRUNTIME140!memmove [d:agent_work2ssrcvctoolscrtvcruntimesrcstringi386MEMCPY.ASM @ 139]: 139 51212d60 57pushedi 151 51212d61 56pushesi 156 51212d62 8b742410movesi,dword ptr [esp+10h] 157 51212d66 8b4c2414movecx,dword ptr [esp+14h] 158 51212d6a 8b7c240cmovedi,dword ptr [esp+0Ch] 168 51212d6e 8bc1moveax,ecx 170 51212d70 8bd1movedx,ecx 171 51212d72 03c6addeax,esi 173 51212d74 3bfecmpedi,esi 174 51212d76 7608jbeVCRUNTIME140!memmove+0x20 (51212d80) VCRUNTIME140!memmove+0x18 [d:agent_work2ssrcvctoolscrtvcruntimesrcstringi386MEMCPY.ASM @ 176]: 176 51212d78 3bf8cmpedi,eax 177 51212d7a 0f8294020000jbVCRUNTIME140!TrailingUpVec+0x50 (51213014) VCRUNTIME140!memmove+0x20 [d:agent_work2ssrcvctoolscrtvcruntimesrcstringi386MEMCPY.ASM @ 183]: 183 51212d80 83f920cmpecx,20h 184 51212d83 0f82d2040000jbVCRUNTIME140!TrailingDownVec+0x1eb (5121325b) VCRUNTIME140!memmove+0x29 [d:agent_work2ssrcvctoolscrtvcruntimesrcstringi386MEMCPY.ASM @ 185]: 185 51212d89 81f980000000cmpecx,80h 186 51212d8f 7313jaeVCRUNTIME140!memmove+0x44 (51212da4) VCRUNTIME140!memmove+0x31 [d:agent_work2ssrcvctoolscrtvcruntimesrcstringi386MEMCPY.ASM @ 187]: 187 51212d91 0fba2514f0215101 btdword ptr [VCRUNTIME140!__isa_enabled (5121f014)],1 188 51212d99 0f828e040000jbVCRUNTIME140!TrailingDownVec+0x1bd (5121322d) VCRUNTIME140!memmove+0x3f [d:agent_work2ssrcvctoolscrtvcruntimesrcstringi386MEMCPY.ASM @ 189]: 189 51212d9f e9e3010000jmpVCRUNTIME140!memmove+0x227 (51212f87)。。。 省略这个函数很长 , 大家在以后分析dmp或者做安全逆向分析恶意代码时也会遇到 , 没有源文件 , 那么我们肯定不会用Windbg或者其他工具来直接看 , 效率太低下了 , 用Notepad++来分析 , 会事半功倍;如下截图所示:
破一桩疑案——硬件错误
本文插图
下边我们的任务显然就是来看看这个VCRUNTIME140!_favor的值是多少了;如下:
0:030> dd VCRUNTIME140!__favor 5121f2d0???????? ???????? ???????? ???????? 5121f2e0???????? ???????? ???????? ???????? 5121f2f0???????? ???????? ???????? ????????很不幸 , 该dmp中没有保存这个数据 , 没办法 , 为了减小dmp文件的大小 , 必然要压缩掉一些数据 , 而有时候这些数据确实至关重要的 。 那怎么办?没关系 , 我们本地写个简单的小程序来测试下:
破一桩疑案——硬件错误
本文插图
破一桩疑案——硬件错误
本文插图
由图可知 , 这个变量的bit1位为1 , 为1意味着jae那条指令不跳 , 不跳意味着memmove的拷贝由rep这个指令前缀来重复操作完成的 , 但这里有个问题 , 我本地的这个__favor为2 , 是不是就意味着dmp用户那里的也为2呢?这个不好说 , 那怎么办?山穷水尽了吗?还没有 , 最快捷的办法就是百度下看看这个变量干嘛用的 。 可惜的是 , 百度出来一堆垃圾 , 或许Google一下能有一点点 , 但也别抱太大希望 。 好了 , 那就自求多福吧;


推荐阅读