第一个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进行初始化操作
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
0xC5 https://github.com/SamuelTulach/mutante 请
R0g 0x10101010....那个是memset