第一个call进去 往下拉 可知程序无任何保护,程序是依靠驱动来达到修改机器码的目的。通过下断很容易提取这三个sys文件
分析first.sys
我电脑系统版本21h2,第一个call实现的方法无效,原因是某个函数的特征码搜不到.暂时放弃,来分析第二个call 分析第一个call 用到了ZwQuerySystemInformation,参数SystemModuleInformation则为遍历内核模块, 易得a2为storport.sys的内核起始地址,a3为storport.sys的模块大小
返回,这个call是打印输出的 分析下一个
第一个参数为storport.sys的内核起始地址,第二个是个全局变量,我们看一下这个全局变量是什么 看不出来,转成代码试试, 很像函数头部的汇编代码,根据后面第三个参数,推断这个函数应该是通过暴力枚举特征码的方式搜索storport.sys的某个函数地址进这个call分析
校验storport.sys的PE有效性 根据PE特性,拿到代码段以及PAGE段,因为函数一般都在这些段里
第一个参数为代码段或page段的真正起始地址,第二个为这个代码段或PAGE段的大小,第三个参数为特征码,第四个参数为通配符(第三,第四对应sub_1400013C0的第二参数,第三参数)
再分析sub_140001344
在分析sub_1400016A8 如果a3也就是通配符里面的值是空的那就是返回1
返回1导致这边这个while不运行了,无法遍历,所以这个特征码搜索应该是写的有点毛病,必须带通配符才能搜索,但具体情况具体分析,很显然这里的a3里面是有值的, 因为v5为char[],所以v5[4]=a1,v5[v6]=a3,这里不知道是不是编译器没优化好还是写法有问题。这里好好理解就知道为什么是特征码搜索了。
返回前面的几部操作是获取storport.sys里某个函数的地址,后面的操作要用到这个函数。IoGetDeviceObjectPointer的用法是根据设备名字获得设备地址,DestinationString由SourceString得到, sub_140001E00和 sub_140001000就是对SourceString进行初始化操作
[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!
0xC5 90eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6e0j5h3#2#2k6h3I4f1N6h3I4S2j5$3S2Q4x3V1k6E0N6i4c8S2L8Y4c8W2 请
R0g 0x10101010....那个是memset