第一个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进行初始化操作
进去sub_140001E00,看着像是对SourceString各种加密操作,根据具体问题具体分析的原则,我们根据调用sub_140001E00的三个参数进行分析
分析他只会这样走
实在看不懂,我们看起汇编代码 rdx为0,此外没有别的写入,大胆猜测是对字符串清零
分析sub_140001000 这个貌似也是清零?那就不对了,反汇编看看,好家伙ida没识别出来
vsnwprintf的函数介绍
这个是对字符串真正的初始化
获取到第一个驱动设备,然后
v0已经分析过是storport.sys的某个函数
old disk serial number说明这个整个call是找到硬盘序列号在内核中的地址并修改 修改的算法,用了RtlRandomEx确保随机性
[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法
0xC5 https://github.com/SamuelTulach/mutante 请
R0g 0x10101010....那个是memset