恶意代码行为-获取Kernel32基址-PEB搜索及利用OD分析

所用工具:windbg、ollydbg

恶意代码行为:载入需要的DLL及获取该DLL中相关函数地址

为什么要找到Kernel32.DLL在哪儿?

其中2个重要的函数: LoadLibraryA,GetProcAddress

附上一张重要的图,待会会围绕这张图来分析。

getkernel.exe源码,这是一个获取kernel32.dll基址的程序

void __noreturn sub_401010()
{
  unsigned int v0; // eax
  unsigned int retaddr; // [esp+0h] [ebp+0h]

  v0 = retaddr & 0xFFFF0000;
  while ( *(_WORD *)v0 != 23117 )
  {
    v0 -= 0x10000;
    if ( v0 < 0x70000000 )
      goto LABEL_6;
  }
  if ( *(_WORD *)(*(_DWORD *)(v0 + 60) + v0) == 17744 )
  {
    wsprintfA(Text, "%X", v0);
    MessageBoxA(0, Text, Caption, 0);
  }
LABEL_6:
  ExitProcess(0);
}

运行效果

1.windbg调试

首先使用windbg调试,打开getkernel.exe

在命令输入框中输入命令dt_teb进入teb模块,通过图片可以知道在teb中偏移0x30处是PEB

TEB(Thread Environment Block,线程环境块):系统在此TEB中保存频繁使用的线程相关的数据。可通过CPU的FS寄存器来访问该段,一般存储在[FS:0]

PEB(Process Environment Block,进程环境块)存放进程信息,每个进程都有自己的PEB信息。位于用户地址空间。可在TEB结构地址偏移0x30处获得PEB的地址位置。

输入命令dt_peb进入peb块,

在peb中偏移0x0c处是ldr

输入命令dt_PEB_LDR_DATA

然后输入命令!peb查看LDR地址,注意此次感叹号是英文的感叹号

输入命令dt _PEB_LDR_DATA 770389c0查看三个list地址,红色部分地址是LDR地址

然后输入命令dt _LDR_DATA_TABLE_ENTRY 0x5b54a0-8,从偏移0x14处取出地址0X5b54a0,进入该地址也就是LDR_MODULE里,减8是因为让程序进入栈顶处,这里面就是getkernel.exe程序自己的内容,可以对应图片中的相关信息。

例如偏移0x18处存储的是基址BaseAddress,值为00400000,偏移0x1c处存储的是该程序的入口地址为00401005,然后0x20处是大小,0x24处是该文件的全名,包括文件存放的路径。

上图中可以看到偏移0x08处是指向它的前向指针也就是LDR_ MODULE (ntlI.dI),所以输入命令dt _LDR_DATA_TABLE_ENTRY 0x5b5388-8进入里面,减8同样是使其进入栈顶。这里面是ntdll.dll的相关信息。

最后输入命令dt _LDR_DATA_TABLE_ENTRY 0x5b5898-8进入第三个数组LDR_ MODULE (kernel32.dll)。可以看到偏移0x18处就是kernel32.dll的基址,为759e0000,与该程序运行后的效果也一致。

2.ollydbg调试

使用OD随便打开一个exe文件,因为都会调用kernel32.dll,所以随便一个exe文件都可以。这里我还是调试getkernel.exe。发现程序入口在00401005,与前面使用windbg调试查找到的程序入口是一致的。

根据该图片,我们需要从FS偏移0x30处进入PEB模块,根据上图,可以看到FS为361000,偏移至361000+30=361030

在左下角右键转到表达式361030,进入PEB

然后在偏移0x0C处获得LDR的入口地址,转到表达式0035E000+0C=0035E00C处

在地址0035E00C处,储存着数值770389C0,这里指向的是PEB_ LDR_ DATA的地址,我们转到该地址处可以进入PEB_ LDR_ DATA

现在就进入了PEB_ LDR_ DATA块,可以对照着右图分析一下数据。

我们要取InMemoryOrderModuleList里的Flink指针里的地址值,也就是006F2A08,转到该处,进入LDR_ _MODULE ()。可以看到getkernel.exe的入口地址00401005,基址00400000等。

在LDR_ _MODULE ()中偏移0x08处的指针指向LDR_ MODULE (ntdll.dII),偏移0x08处也就是006F2A08,里面存储的006F2910就是LDR_ MODULE (ntdll.dII)中偏移0x08的位置,我们转到此处。

同理可以分析出ntdll.dll的基址、入口地址等。我们再转到006F8878处可以进入到LDR_ MODULE (kernel32.dIl),就可以看到kermel32.dll的基址是759E0000,这与我们前面用windbg调试得到的数值一致,也与getkercel.exe程序运行的结果一致。

  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
利用Python来分析恶意代码PDF可以使用一些开源工具,如pefile、pydasm、pydbg等。以下是一个简单的例子,可以使用pefile来查找PE文件中的一些信息: ```python import pefile # 打开PE文件 pe = pefile.PE('malware.exe') # 打印PE文件的基本信息 print("[*] Image base: 0x%x" % pe.OPTIONAL_HEADER.ImageBase) print("[*] Entry point: 0x%x" % pe.OPTIONAL_HEADER.AddressOfEntryPoint) print("[*] Number of sections: %d" % pe.FILE_HEADER.NumberOfSections) # 打印每个节的信息 for section in pe.sections: print("[*] Section name: %s" % section.Name.decode('utf-8')) print("\t[*] Virtual address: 0x%x" % section.VirtualAddress) print("\t[*] Virtual size: 0x%x" % section.Misc_VirtualSize) print("\t[*] Size of raw data: %d" % section.SizeOfRawData) ``` 以上代码将打开一个名为“malware.exe”的PE文件,并打印一些基本信息,包括图像基址、入口点和节的数量。然后它将循环遍历每个节,并打印每个节的名称、虚拟地址、虚拟大小和原始数据大小。 另一个流行的工具是IDA Pro,它是一个交互式反汇编器和调试器。您可以使用Python脚本扩展IDA Pro的功能。例如,以下代码将使用IDA Pro分析PE文件,并查找包含字符串“malware”的函数: ```python import idaapi # 打开PE文件 idaapi.autoWait() idc.LoadFile('malware.exe') # 查找包含“malware”字符串的函数 search_str = 'malware' for func_ea in idautils.Functions(): func_name = idc.GetFunctionName(func_ea) for ref_ea in idautils.CodeRefsTo(func_ea, 1): if search_str in idc.GetDisasm(ref_ea): print("Found string in function: %s" % func_name) break ``` 以上代码将打开IDA Pro并加载PE文件“malware.exe”。然后它将循环遍历每个函数,并搜索代码引用到该函数的地方是否包含字符串“malware”。如果找到了包含该字符串的引用,代码将打印该函数的名称。 总的来说,Python和一些开源工具可以帮助您分析恶意代码PDF,但是要记住,这只是开始,您需要对恶意代码进行更深入的分析才能真正了解其行为和意图。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值