一.基本操作
在逆向分析的过程中涉及大量符号还原的部分,该部分主要介绍一些PE结构符号还原
通过 View->Open subviews->Type libraries 打开类型库窗口,可以看到当前 IDA 加载的类型库
View->Open subview->Structures 打开结构体窗口,可以看到 IDA 当前 的工程数据库中已经包含的所有标准和用户自定义的结构体信息
在结构体窗口中,Insert 键添加结构体,选择 add standard structure添加所需要的结构
回到代码窗口,在对应的数据上右键,conver to new structure*
二.技巧总计
标签:加载DLL
fs30+0xC=Ldr
LDR +0xC=_LIST_ENTRY
_LIST_ENTRY+0x18=DLLBASE
有3C的那个对应的结构是NTheaders
在符号还原的过程中:
5A4D对应IMAGE_DOS_HEADER
4550对应IMAGE_NT_HEADERS
两部分的关键部分为magic与signature
正常顺序:
_IMAGE_NT_HEADERS过后是
IMAGE_EXPORT_DIRECTORY结构
申请内存空间
最后一个参数40表示的是PAGE_EXECUTE_READWRITE
熟识两个API:
1.VirtualAlloc
LPVOID VirtualAlloc(
LPVOID lpAddress,
DWORD dwSize,
DWORD flAllocationType,
DWORD flProtect
)
2.BOOL WriteProcessMemory(
HANDLEhProcess,
LPVOIDlpBaseAddress,
LPVOIDlpBuffer,
DWORDnSize,
LPDWORD lpNumberOfBytesWritten )
alloc的特征:
下面三个都是一样的功能,获取一个DLL的基地址
一:
1 00404830 mov eax,dword ptr fs:[0x30] // PEB = FS:[0x30]
2 00404836 mov eax,dword ptr ds:[eax+0xC] // PEB_LDR_DATA = [PEB+0xC]
3 00404839 mov eax,dword ptr ds:[eax+0xC] //InLoadOrderModuleList 使用模块加载顺序遍历
4 0040483C mov eax,dword ptr ds:[eax+0x18] // eax = 00400000(LDR_DATA_TABLE_ENTRY.DllBase) 第一个DLL模块基址
二:
1 00404830 mov eax,dword ptr fs:[0x30] // PEB = FS:[0x30]
2 00404836 mov eax,dword ptr ds:[eax+0xC] // PEB_LDR_DATA = [PEB+0xC]
3 00404839 mov eax,dword ptr ds:[eax+0x14] // InMemoryOrderModuleList 使用模块在内 中的顺序遍历
4 0040483C mov eax,dword ptr ds:[eax+0x10] // eax = 00400000(LDR_DATA_TABLE_ENTRY.DllBase) 第一个DLL模块基址
三:
1 00404830 mov eax,dword ptr fs:[0x30] // PEB = FS:[0x30]
2 00404836 mov eax,dword ptr ds:[eax+0xC] // PEB_LDR_DATA = [PEB+0xC]
3 00404839 mov eax,dword ptr ds:[eax+0x1C] // InMemoryOrderModuleList 使用模块初始化时的顺序遍历
4 0040483C mov eax,dword ptr ds:[eax+0x8] // eax =776C0000(LDR_DATA_TABLE_ENTRY.DllBase) 第一个DLL模块基址
将所有内容转换成同一个格式特征识别:
Memoryset函数的特征:
分配空间,并且内存加载执行(其中0x1000,0x2000,0x3000表示的是加载时不同提交方式)