沙箱在模拟库里面的api时,可能有遗漏或者模拟不位。执行某个api后,没有产生预期的行为,导致产生了异常。
![](https://i-blog.csdnimg.cn/blog_migrate/7c4c0e2c99a3b0d139e25b44aa1350e2.png)
图1 沙箱里面执行的FoldStringA
由于沙箱没有模拟此FoldStringA,执行完这个函数之后,并没有将字符串映射过去,如图二所示。函数执行完后,0x20fca0处的值还是为零。
![](https://i-blog.csdnimg.cn/blog_migrate/6fbaf5e8ec978024600c564761ba1cb4.png)
图2 执行函数后
后续拿lpDestStr的值进行解密操作。解密出函数字符串后,再取得函数地址,最后调用。由于api没有模拟,lpDestStr的值不正确,解密字符串失败,无法获取函数地址,导致执行异常。
![](https://i-blog.csdnimg.cn/blog_migrate/d50fe0b7222b6e7d86e70ace16b0304a.png)
图3 解密并执行
解决方案:在沙箱里面模拟FoldStringA函数,将源字符串映射到目的字符串去。
过程:分析此样本时,发现GetProcAddress返回异常,第二个参数异常,导致返回值为零。往上追溯有解密字符串的地方,解密字符串的key来源于FoldStringA的lpDestStr。再次调试发现执行完FoldStringA后,字符串没有映射过去,手动映射过去后,执行正常。
hash:7000a39136f7603db9d7c37d6ac515b932086c0c