SSDT未导出函数的调用,对于有SSDT导出表的32位系统来说,可以使用导出表+索引号的方式调用,没有导出的64位系统来说,一般都是各种硬编码。 实际上,还有兼容性和稳定性更好点的方法: 计算两个已知的导出函数的地址差值ulAddressDiff; 计算这两个函数的索引号差值ulIndexDiff; 计算每个索引号差值所占字节大小ulSizeInBytePerFunc=ulAddressDiff/ulIndexDiff; 根据已知导出函数的地址+索引号以及上一步的值,得出索引号是0的函数的地址pIndex0FuncAddress; 以后调用任何未导出函数时,pFuncAddress=pIndex0FuncAddress+ulSizeInBytePerFunc*ulFuncIndex; ulFuncIndex最好从ntdll获取,这样比较稳定(即使64位系统,一样可以在32位进程按32位进程获取index的方法获取)。原理: Zw的函数,实际都是个Stub而已,所有Zw的函数除了索引号不一样,其他几乎完全一样。而且,所有Zw函数在几乎所有目前已知的系统上,都是按照索引号的顺序依次整齐排列的。 又因为Zw函数内部,使用了“相对call”,所以他们的顺序以及排列方式几乎不太可能变动而且实在也没有变动的必要。 so....上述方法稳定性和兼容性,我自认为比以往发现的其他调用未导出的SSDT函数的方法要稳定
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)