首页 > 系统相关 >re | 通过PEB遍历进程模块

re | 通过PEB遍历进程模块

时间:2023-12-23 16:13:10浏览次数:38  
标签:遍历 pLdrDataEntry LIST re TABLE ENTRY DATA PEB

re | 通过PEB遍历进程模块

最近在设计实验,重新写一些代码存一下:
使用vc6编译通过。
比较好的参考文章:https://www.cnblogs.com/bokernb/p/6404795.html

#include <stdio.h>
#include <windows.h>
/*
typedef struct _LIST_ENTRY {
   struct _LIST_ENTRY *Flink;
   struct _LIST_ENTRY *Blink;
} LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY;
*/

typedef struct _UNICODE_STRING {
  USHORT Length;
  USHORT MaximumLength;
  PWSTR  Buffer;
} UNICODE_STRING, *PUNICODE_STRING;

typedef struct _LDR_DATA_TABLE_ENTRY
{
    LIST_ENTRY InLoadOrderLinks;                  // 3个双向链表
    LIST_ENTRY InMemoryOrderLinks;
    LIST_ENTRY InInitializationOrderLinks;
    PVOID      DllBase;
    PVOID      EntryPoint;
    UINT    SizeOfImage;               // 这里32位的就是UINT 64位是UINT64
    UNICODE_STRING FullDllName;
    UNICODE_STRING BaseDllName;     // 查找这个
	//...
}LDR_DATA_TABLE_ENTRY, * PLDR_DATA_TABLE_ENTRY;

void shellcode(){
	// 准备字符串备用
	wchar_t wsKernel32Dll[] = L"kernel32.dll";
	char sUser32Dll[] = "USER32.dll";
	char sGetProcAddr[] = "GetProcAddress";
	char sLoadLibraryA[] = "LoadLibraryA";
	char sMessageBoxA[] = "MessageBoxA";

	// 通过fs:[0x30]查找PEB 找到3个链表 找到K32.dll
	/*
	_PEB_LDR_DATA
	[0] Length
	[4] Initialized
	[8] SsHandle
	[c] InLoadOrderModuleList : _LIST_ENTRY
	[14] InMemoryOrderModuleList : _LIST_ENTRY
	[1c] InInitializationOrderModuleList : _LIST_ENTRY
	...

	*/
	DWORD pBeg = 0;
	DWORD pPLD = 0;
	PLIST_ENTRY pInLoadOrderModuleList = 0;
	__asm{
		pushad
		mov eax, fs:[0x30]        ; PEB
		mov eax, [eax+0x0c]       ; PEB->Ldr
		add eax, 0x0c             ; _PEB_LDR_DATA->InLoadOrderModuleList
		lea ebx, dword ptr [pInLoadOrderModuleList] ; 获取InLoadOrderModuleList的地址保存在变量中
		mov [ebx], eax;
		popad
	}
	printf("InLoadOrderModuleList: %p %p \n",pInLoadOrderModuleList->Flink, pInLoadOrderModuleList->Blink);
	// 拿到第一个LDR_DATA_TABLE_ENTRY节点的地址
	PLDR_DATA_TABLE_ENTRY pFirstLdrDataEntry = (PLDR_DATA_TABLE_ENTRY)pInLoadOrderModuleList->Flink;
	// 循环遍历所有的模块
	PLDR_DATA_TABLE_ENTRY pLdrDataEntry = pFirstLdrDataEntry;
	while(1){
		printf("[%p] %p %p \n", pLdrDataEntry, pLdrDataEntry->InLoadOrderLinks.Flink, pLdrDataEntry->InLoadOrderLinks.Blink);
		printf("    [%S(%p)] %S \n", pLdrDataEntry->BaseDllName.Buffer, pLdrDataEntry->DllBase, pLdrDataEntry->FullDllName.Buffer);
		if (pLdrDataEntry->InLoadOrderLinks.Flink == (PLIST_ENTRY)pFirstLdrDataEntry){
			break;
		}
		// 判断是不是kernel32.dll
		if(wcsicmp(pLdrDataEntry->BaseDllName.Buffer, wsKernel32Dll) == 0){
			printf("~~~~~~ find it! ~~~~~~~\n");
		}
		pLdrDataEntry = (PLDR_DATA_TABLE_ENTRY)pLdrDataEntry->InLoadOrderLinks.Flink;
	}


	// 通过导出表查找LoadLibrary


}

int main(){
	shellcode();

	return 0;
}

标签:遍历,pLdrDataEntry,LIST,re,TABLE,ENTRY,DATA,PEB
From: https://www.cnblogs.com/Mz1-rc/p/17923224.html

相关文章

  • RedissonLock 使用场景以及优缺点分析
    RedissonLock是Redisson库提供的一种基于Redis实现的分布式锁。以下是如何使用RedissonLock以及其优缺点:使用RedissonLock:初始化Redisson客户端:Configconfig=newConfig();config.useSingleServer().setAddress("redis://localhost:6379");RedissonClientredisson......
  • redis_原理
    redis_原理数据结构1.动态字符串SDSC语言字符串存在的问题:获取字符串长度需要通过运算非二进制安全不可修改redis构建了一种新的字符串结构,简单动态字符串SimpleDynamicStringSDSRedis是C语言实现的,其中SDS是一个结构体,属性包括:uint8_tlen:buf已保存的字符串字节数......
  • 关于Secure Hash Algorithm加密算法
    一、概述SHA(SecureHashAlgorithm)加密算法是一种广泛应用的密码散列函数,由美国国家安全局(NSA)设计,用于保障数据的安全性和完整性。SHA算法经历了多个版本的更新,目前主要应用于各种网络安全和数据加密领域。SHA在线加密|一个覆盖广泛主题工具的高效在线平台(amd794.com)http......
  • 前端歌谣-第六十四课-express之静态资源
    前言我是歌谣微信公众号关注前端小歌谣一起学习前端知识今天继续给大家讲解获取express获取静态资源的讲解案列constexpress=require("express")constapp=express()constIndexRouter=require("./router/indexRouter")//配置解析app.use(express.static("public"))app......
  • Redis_高级
    Redis_高级分布式缓存单点Redis的问题:数据丢失问题:实现Redis数据持久化并发能力问题:搭建主从集群,实现读写分离故障恢复问题:利用Redis哨兵,实现健康检测和自动恢复存储能力问题:搭建分片集群,利用插槽机制实现动态扩容数据丢失问题-数据持久化RDB基本流程fork主进程获......
  • Unity最新一键清理Prefab中所有MissingComponent
    因为老的API Properties.DeleteArrayElementAtIndex(propertyIndex);提示没权限修改,而unity提供了新的API GameObjectUtility.RemoveMonoBehavioursWithMissingScript(go);更方便移除丢失的组件,需要遍历物体下面所有子节点,否则无法移除子节点的丢失组件。于是重新整理了下......
  • MySQL 8.0.32 InnoDB ReplicaSet 配置和手动切换
    1.环境准备主库:192.168.137.4mytest3从库:192.168.137.5mytest4MySQL:8.0.322.配置ReplicaSet实例启动mysqlshell#mysqlsh--uriroot@localhost--socket=/abce/mysql_data/mysql.sockMySQLShell8.0.32Copyright(c)2016,2023,Oracleand/oritsaffiliat......
  • postgresql实例结构
    postgresql实例结构postgresql实例简介用来访问postgresql数据库一个实例对应一个数据库集簇由内存和后台进程组成postgresql初始化参数文件文件中有两种类型的参数1.显式:在文件中对参数进行设置2.隐式:文件中没有设置,使用postgres默认值可以存在多个初始化参数文......
  • 金蝶云星空打开应用报错'D:\WorkSpace\XXXX\XXXX_k3Cloud' is already locked.
    一、报错截图 二、报错内容发生时间:2023-12-2211:01:13错误来源:System.Windows.Forms错误信息:'D:\WorkSpace\XXXX\XXXXXXX_k3Cloud'isalreadylocked.===================================================调用堆栈:在System.Windows.Forms.Control.M......
  • Three光源Target位置改变光照方向不变的问题及解决方法
    0x00楔子在Three.js中,光源的目标(target)是一种用于指定光源方向的重要元素。在聚光灯中和定向光(DirectionalLight)中都有用到。有时我们可能会遇到光源目标位置更新后,但光照方向未正确更新的问题。这个问题并不复杂,但是有时候出现了,往往会想不到原因。0x01原因出现这个问题......