沙箱在模拟有些函数的时候,虽然功能已经模拟了,但是将其模拟的功能和原生api进行比较,发现有些执行的分支并没有模拟到。
在kernel32.dll中,如果lstrcpynA的第三个参数iMaxLength为0,则返回值为第一个参数lpString1。但是沙箱模拟时却直接返回零。导致发生了异常。不同的沙箱模拟的好坏不一样,有些沙箱模拟的比较好,执行不会产生异常。
图1 执行lstrcpynA
图2 kernerl32.dll的lstrcpynA实现
解决方案:模拟lstrcpynA实现,覆盖分支路径。如果lstrcpynA的第三个参数iMaxLength为0,则返回值为第一个参数lpString1。
hash:e0cd322ab4cea356eb8092887c7bc025ff672e6c