本文为看雪论坛优秀文章
看雪论坛作者ID:PlaneJun
首先创建了一个名为"avoid repeat open"的互斥体,保证程序的单例执行。随后开始动态获取ZwAllocateVirtualMemory和ZwFreeVirtualMem的函数地址。调用ZwAllocateVirtualMemory申请一段可执行内存后,开始将两段shellcode写入。紧接着可以看到通过调用GetTickCount来判断运行时间是否超过4秒,若超过4秒则清空shellcode,即绘制消失。shellcode的入口为D3D的一些shader初始化。由于绘制青色方块正常,黄色方块不正常,故猜测黄色方块数据存在污染。进一步分析DrawFillRect函数,得知前四个参数中,第一第二个为坐标数据,第三第四个为Key。并且在捕获绘制青色方块的数据时发现,第三和第四个参数在参与运算时结果始终为0,反之,黄色方块不为0。将指令集扣下后使用C++进行模拟流程,并输出操作流程。经过对比,发现黄色方块在计算Decryp之后,将Table[6]与Table[7]的值进行了互换。直接通过判断互换流程将其修改为Table[3] = Table[1]禁止互换。修改后发现仍然没有绘制黄色小方块,通过代码调试发现绘制时,Table[4]为负数,而Table[4] = (Table[0] – Table[1]) = 0x32 – 0x3E8。怀疑0x3E8为故意使坐标计算为负数,故将0x3E8修改为0x0后,黄色小方块显示。同理,第二个黄色方块的由于没有Key互换,但是对0x1F4计算,将0x1F4修改为0,后方块显示。经过手动修改后,发现存在0x3E8和0x1F4数据对黄色方块的坐标进行污染,将其修改0,并且禁止key互换后,旗帜显示。看雪ID:PlaneJun
https://bbs.pediy.com/user-home-826671.htm
*本文由看雪论坛 PlaneJun 原创,转载请注明来自看雪社区
文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458449720&idx=1&sn=d3e33c568fee745ef1ad6334443c2eac&chksm=b18fc7b286f84ea479599f079963ab9b9e199717629c8d0636cd87341b552823a01f995a18c3#rd
如有侵权请联系:admin#unsafe.sh