我想这个用特征搜索函数搜到这个call所在的地址,该怎么用这个函数?已知可以使用下面函数获取PsLookupProcessByProcessId代码所在的地址
//特征码搜索代码
//pSearchBeginAddr 扫描的内存(内核)起始地址
//ulSearchLength 需要扫描的长度
//pSpecialCode 扫描特征码,传入一个UCHAR类型的字节数组
//ulSpecialCodeLength 特征码长度,传入字节数组长度
// By: LyShark.com
PVOID SearchSpecialCode(PVOID pSearchBeginAddr, ULONG ulSearchLength, PUCHAR pSpecialCode, ULONG ulSpecialCodeLength)
{
PVOID pDestAddr = NULL;
PUCHAR pBeginAddr = (PUCHAR)pSearchBeginAddr;
PUCHAR pEndAddr = pBeginAddr + ulSearchLength;
PUCHAR i = NULL;
ULONG j = 0;
for (i = pBeginAddr; i <= pEndAddr; i++)
{
// 遍历特征码
for (j = 0; j < ulSpecialCodeLength; j++)
{
// 判断地址是否有效
if (FALSE == MmIsAddressValid((PVOID)(i + j)))
{
break;
}
// 匹配特征码
if (*(PUCHAR)(i + j) != pSpecialCode[j])
{
break;
}
}
// 匹配成功
if (j >= ulSpecialCodeLength)
{
pDestAddr = (PVOID)i;
break;
}
}
return pDestAddr;
}
获取PsLookupProcessByProcessId代码所在的地址
UNICODE_STRING st = { 0 };
RtlInitUnicodeString(&st, L"PsLookupProcessByProcessId");
PVOID PsLookupProcessByProcessIdaddr = MmGetSystemRoutineAddress(&st);
''该回答引用ChatGPT''
如对你的问题有帮助,请点击右侧采纳即可,谢谢!
首先,你需要获取PsLookupProcessByProcessId的地址,这可以通过使用MmGetSystemRoutineAddress函数来实现,如下代码所示:
UNICODE_STRING st = { 0 };
RtlInitUnicodeString(&st, L"PsLookupProcessByProcessId");
PVOID PsLookupProcessByProcessIdaddr = MmGetSystemRoutineAddress(&st);
然后,可以使用SearchSpecialCode函数来搜索PsLookupProcessByProcessId的地址,传递需要扫描的起始地址和长度、特征码、特征码长度。例如:
PUCHAR pSpecialCode = [Your feature code];
ULONG ulSpecialCodeLength = [length of feature code];
PVOID pFoundAddress = SearchSpecialCode(PsLookupProcessByProcessIdaddr, [Search Length], pSpecialCode, ulSpecialCodeLength);
如果搜索成功,pFoundAddress将是PsLookupProcessByProcessId的地址。
不知道你这个问题是否已经解决, 如果还没有解决的话: