MmGetSystemRoutineAddress和MiFindExportedRoutineByName函数的 exported

MmGetSystemRoutineAddress和MiFindExportedRoutineByName函数的实现代码

2013-07-2913:4517人阅读评论(0)收藏举报

MmGetSystemRoutineAddress这个函数也是比较有用的,是得到系统导出函数的地址,不过网上都是写了一堆汇编代码在哪里,根本没有可读性,还不如用IDA看呢。

下面的函数是摘自ReactOS项目的代码:

[cpp]viewplaincopy
  1. PVOID
  2. NTAPI
  3. MmGetSystemRoutineAddress(INPUNICODE_STRINGSystemRoutineName)
  4. {
  5. PVOIDProcAddress=NULL;
  6. ANSI_STRINGAnsiRoutineName;
  7. NTSTATUSStatus;
  8. PLIST_ENTRYNextEntry;
  9. PLDR_DATA_TABLE_ENTRYLdrEntry;
  10. BOOLEANFound=FALSE;
  11. UNICODE_STRINGKernelName=RTL_CONSTANT_STRING(L"ntoskrnl.exe");
  12. UNICODE_STRINGHalName=RTL_CONSTANT_STRING(L"hal.dll");
  13. ULONGModules=0;
  14. ERESOURCEPsLoadedModuleResource;
  15. Status=RtlUnicodeStringToAnsiString(&AnsiRoutineName,
  16. SystemRoutineName,
  17. TRUE);
  18. if(!NT_SUCCESS(Status))returnNULL;
  19. KeEnterCriticalRegion();
  20. ExAcquireResourceSharedLite(&PsLoadedModuleResource,TRUE);
  21. NextEntry=PsLoadedModuleList.Flink;
  22. while(NextEntry!=&PsLoadedModuleList)
  23. {
  24. LdrEntry=CONTAINING_RECORD(NextEntry,
  25. LDR_DATA_TABLE_ENTRY,
  26. InLoadOrderLinks);
  27. if(RtlEqualUnicodeString(&KernelName,&LdrEntry->BaseDllName,TRUE))
  28. {
  29. Found=TRUE;
  30. Modules++;
  31. }
  32. elseif(RtlEqualUnicodeString(&HalName,&LdrEntry->BaseDllName,TRUE))
  33. {
  34. Found=TRUE;
  35. Modules++;
  36. }
  37. if(Found)
  38. {
  39. ProcAddress=MiFindExportedRoutineByName(LdrEntry->DllBase,
  40. &AnsiRoutineName);
  41. if(ProcAddress)break;
  42. if(Modules==2)break;
  43. }
  44. NextEntry=NextEntry->Flink;
  45. }
  46. ExReleaseResourceLite(&PsLoadedModuleResource);
  47. KeLeaveCriticalRegion();
  48. RtlFreeAnsiString(&AnsiRoutineName);
  49. returnProcAddress;
  50. }

MiFindExportedRoutineByName——EAT中定位到指定函数

MmGetSystemRoutineAddress实际调用的MiFindExportedRoutineByName

[cpp]viewplaincopy
  1. PVOID
  2. MiFindExportedRoutineByName(
  3. INPVOIDDllBase,
  4. INPANSI_STRINGAnsiImageRoutineName
  5. )
  6. {
  7. USHORTOrdinalNumber;
  8. PULONGNameTableBase;
  9. PUSHORTNameOrdinalTableBase;
  10. PULONGAddr;
  11. LONGHigh;
  12. LONGLow;
  13. LONGMiddle;
  14. LONGResult;
  15. ULONGE--xportSize;//保存表项的大小
  16. PVOIDFunctionAddress;
  17. PIMAGE_EXPORT_DIRECTORYExportDirectory;
  18. PAGED_CODE();
  19. ExportDirectory=(PIMAGE_EXPORT_DIRECTORY)RtlImageDirectoryEntryToData(
  20. DllBase,
  21. TRUE,
  22. IMAGE_DIRECTORY_ENTRY_EXPORT,
  23. &ExportSize);
  24. if(ExportDirectory==NULL){
  25. returnNULL;
  26. }
  27. NameTableBase=(PULONG)((PCHAR)DllBase+(ULONG)ExportDirectory->AddressOfNames);
  28. NameOrdinalTableBase=(PUSHORT)((PCHAR)DllBase+(ULONG)ExportDirectory->AddressOfNameOrdinals);
  29. //二分查找法
  30. Low=0;
  31. Middle=0;
  32. High=ExportDirectory->NumberOfNames-1;
  33. while(High>=Low){
  34. Middle=(Low+High)>>1;
  35. Result=strcmp(AnsiImageRoutineName->Buffer,
  36. (PCHAR)DllBase+NameTableBase[Middle]);
  37. if(Result<0){
  38. High=Middle-1;
  39. }
  40. elseif(Result>0){
  41. Low=Middle+1;
  42. }
  43. else{
  44. break;
  45. }
  46. }
  47. //如果High<Low,表明没有在EAT中找到这个函数;否则,返回此函数的索引
  48. if(High<Low){
  49. returnNULL;
  50. }
  51. OrdinalNumber=NameOrdinalTableBase[Middle];
  52. //如果索引值大于EAT中已有的函数数量,则查找失败
  53. if((ULONG)OrdinalNumber>=ExportDirectory->NumberOfFunctions){
  54. returnNULL;
  55. }
  56. Addr=(PULONG)((PCHAR)DllBase+(ULONG)ExportDirectory->AddressOfFunctions);
  57. FunctionAddress=(PVOID)((PCHAR)DllBase+Addr[OrdinalNumber]);
  58. ASSERT((FunctionAddress<=(PVOID)ExportDirectory)||
  59. (FunctionAddress>=(PVOID)((PCHAR)ExportDirectory+ExportSize)));
  60. returnFunctionAddress;
  61. }

在模块中定位指定函数名的地址,这个算法挺不错的

MmGetSystemRoutineAddress和MiFindExportedRoutineByName函数的 exported

  

爱华网本文地址 » http://www.413yy.cn/a/25101015/272179.html

更多阅读

vlookup函数的使用方法 精 如何使用vlookup函数

vlookup函数的使用方法 精——简介今天在上一篇的经验中,书生提到了数据有效性和vlookup的经典使用方法,随即有人hi我问我vlookup的值出不来,那么今天我就继续分享下这个必须excel必须掌握的基本函数之一---VLOOKUP 。有可能面试时候老

EXCEL表中LEFT和RIGHT函数的用法 left和right函数

在用EXCEL表中的时候,懂得一些常用的函数,会给你的工作带来很大便利。就像上次偶然的机会,听同事说道LEFT和RIGHT函数的用法,还挺有用的。像导出的财务数据,日期的格式都是2010-01-01,但是如果你只需要年月,不需要日期,你可以插入另外一列,适用

转贴 漫谈数学物理方法和特殊函数 特殊儿童物理治疗

原帖比较长,各位耐心。偶然查找泛函分析的资料时,发现了下面的这一个很好的帖子,与各位网友分享。【转贴】漫谈数学物理方法和特殊函数小弟正在攻读吴教授的这本书,从网上看到了一个学习心得,转贴过来和大家商讨。貌似在新浪爱问网上有

lookup函数的使用方法 int函数的使用方法

lookup函数的使用方法——简介本文介绍一下日常工作中经常会使用到的一个查找函数,lookup函数,与vlookup函数以及hlookup函数一样是非常的强大。通过列举一个例子对lookup函数的使用方法进行分析,分别从精确查找和非精确查找两个方面进

声明:《MmGetSystemRoutineAddress和MiFindExportedRoutineByName函数的 exported》为网友花香满园分享!如侵犯到您的合法权益请联系我们删除