The head of a doubly-linked list that contains the loaded modules for the process. Each item in the list is a pointer to an LDR_DATA_TABLE_ENTRY structure
写完这篇手记之后,越觉得不对劲,这么浅显的方法为什么没有被拿来通用,google了一下,原来,早在09年,就有某牛总结出来了:
4c9K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6Q4x3X3g2Z5j5i4u0E0L8$3&6&6M7$3g2U0N6i4u0A6N6s2W2Q4x3X3g2U0L8$3#2Q4x3V1j5J5x3o6l9&6i4K6u0r3x3o6k6Q4x3V1k6J5k6i4c8J5K9h3g2$3K9h3&6Y4i4K6u0V1K9$3g2J5L8X3g2D9x3K6u0K6i4K6u0V1j5X3q4K6k6g2)9J5k6r3q4V1k6s2u0W2M7%4y4Q4x3X3g2Z5N6r3#2D9
文章用到的是InMemoryOrderModuleList链,至于遍历这些链为什么没有成为通用的方法,很显然,作者在后面加上了如是说明:
Their appears to be some cases on Windows 2000 whereby the above method will not yield the correct result.
提到了在2000平台下,某些例子可能会得到错误的结果,最后提出来查找hash函数名的方法,这个和以前可以某些病毒在IAT里面找从kernel32.dll引入的函数,向上找“MZ”头方法很类似,同样也是依靠遍历LDR链,只不过比较的就是DllName了。详细的代码请参考上文连接:D。