精华内容
下载资源
问答
  • kernel32.dll

    2018-12-01 20:28:53
    缺少kernel32.dll引起的问题,本文件包括kernel32.dll和其描述。
  • 记录一次客户服务武器操作失误,客户线上服务器系统是Windows server enterprise 2007(32位),不兼容视频插件Ffmpeg插件,修改系统文件C:\Windows\System32\kernel32.dllkernel32_1.dll文件名称后,服务器重启未...
  • kernel32.dll|advapi32.dll|gdi32.dll|user32.dll|exeplorer.exe 基于win 7 64位提取,包括 syswow64和system32两个文件夹内的系统核心DLL文件
  • Windows XP/2003 Server 操作系统源代码缺少文件20201123__KERNEL32.DLL.v3.zip
  • 动态获取kernel32.dll实现无导入表的hello world
  • C#调用Kernel32.DLL设置本地系统时间, 需要以管理员权限运行。 示例代码演示如何获得系统时间,并且将系统时间设置为本年3月。
  • kernel32.dll文件

    2014-03-12 22:03:56
    kernel3.dll文件,用于替换被损坏的dll文件,内有各种版本,32位和64位皆可用
  • kernel32.dll打印机所需文件,有的系统不全需要拷贝到system32
  • windows xp dll :advapi32.dll user32.dll gdi32.dll kernel32.dll
  • 网络上的advapi32.dll文件是老版本的,新版本的基本上不容易找到。 WIN XP具有DLL的自动恢复功能,当DLL文件缺失可以进行恢复,但是DLL本身出现了问题就显得有点儿...kernel32.dll|advapi32.dll|gdi32.dll|user32.dll
  • 我们要知道的一件重要事情是,Windows的大多数功能,都是通过三个主要DLL访问的:NTDLL.DLLKernel32.DLLKernelbase.DLL。因此,无论任何时间执行任何二进制文件,这些都是始终要加载的必要DLL。为了加载函数...

    前言

    针对一个已经学习了Linux Shellcode开发,并开始在Windows上尝试的研究人员来说,这一过程可能要比想象的更加艰难。Windows内核与Linux完全不同。尽管如此,但Linux内核要比Windows更容易理解,原因在于其开源的特性,并且与Windows相比,Linux只具有相当少的功能。另一方面,Windows在过去几年中进行了重大的改进,由于这一改进,新版本与老版本相比已经发生了许多变化。在本文中,我们将专注于对Windows 10 x86进行分析,但其他旧版本可能与之相比没有太多的不同。目前,已经有很多关于PEB LDR的博客文章,但我们还没有看到有任何文章中展现了完整的逻辑,并阐述其本质原因的。大多数研究人员只是通过WinDBG进行分析,并要求读者具备一定程度的后端基础。我撰写这篇文章的主要原因,是希望从C语言转到ASM,并希望我们能共同了解在ASM x86中进行Shellcode开发时,后端的工作原理。

    .data段

    在我们开始处理Shellcode部分之前,我建议首先应该理解内存是如何工作的,因为我们即将做的一切操作都是在内存中。如果我们已经了解像LPWSTR、LPSTR这样的Windows数据类型,那么无疑是一个好消息,因为我们必须要知道:

    标准的C语言并不等同于Windows C编程

    接下来,唯一需要重点掌握的,就是基本的Assembly x86。默认情况下,除了系统调用或API调用之外,ASM在Linux或Windows中是相同的。因此,了解寄存器的工作原理就显得非常重要。

    最重要的是,我们应该了解如何对二进制文件进行反汇编。我主要使用x32dbg和WinDBG x86。我会同时使用这两个工具进行调试,因为有一些我们不能在x32dbg中完成的事情,在WinDBG x86中是可以的,反之亦然。因此,我们将不断切换使用这两个工具。

    .text段

    在我们开始使用Shellcode之前,理解其在较低级别的工作方式,这一点非常重要。我们首先将从一个非常简单的例子开始,找到系统的当前主机名。我们来看看下面是使用C语言编写的Windows API示例:

    Windows x86 Shellcode开发:寻找Kernel32.dll地址

    在上图中,我创建了两个变量,分别是compName和compNameSize。这些将是提供给函数GetComputerNameA的参数。请记住,GetComputerNameA和GetComputerNameW有两个相似的函数。 W代表宽Unicode字符,而A代表ANSI CHAR字符串。我们将在整个博客系列中使用ANSI。下面是MSDN对GetComputerNameA函数的说明:

    BOOL GetComputerNameA(LPSTR lpBuffer, LPDWORD nSize);

    上面的代码表示,GetComputerNameA接受LPSTR,表示长指针字符串,而LPDWORD则表示长指针双字。一个字的大小是16位,因此DWORD在所有平台上都是32位。现在,如果使用g++编译上述程序,我们将看到如下内容:天空彩

    Windows x86 Shellcode开发:寻找Kernel32.dll地址

    现在在这里,在程序的最开始,有#include <windows.h>,这也就意味着Windows库将被引入到代码中,它应该在这里动态链接默认依赖项。但是,我们不能对ASM进行相同的操作。在ASM的场景中,我们需要动态地找到函数GetComputerNameA所在的地址,在堆栈上加载参数,并调用具有函数指针的寄存器。我们要知道的一件重要事情是,Windows的大多数功能,都是通过三个主要DLL访问的:NTDLL.DLL、Kernel32.DLL和Kernelbase.DLL。因此,无论任何时间执行任何二进制文件,这些都是始终要加载的必要DLL。为了加载函数GetComputerNameA,我们必须找到这个函数所在的DLL,并在那里找到它的基址。接下来,我们在x32dbg上尝试加载任何x86二进制文件,看看能得到什么。我将加载我们编译的上述exe文件,但实际上,我们可以加载任何随机的32位可执行文件,因为我们只会浏览上面提到的那些DLL。使用x32dbg打开exe文件,并导航到Log部分,可以看到加载了这三个DLL,以及其特定的地址:

    Windows x86 Shellcode开发:寻找Kernel32.dll地址

    接下来,我们将导航到突出显示的Symbols部分,可以看到加载的不同DLL的名称。在这里,我们可以浏览DLL,并查看它们提供的所有功能。

    Windows x86 Shellcode开发:寻找Kernel32.dll地址

    现在,如果我们在搜索框中搜索函数GetComputerNameA,它将显示Kernel32.DLL加载该函数。此外,还将打印出函数所在的地址0x74F69AC0。在理论和实际测试中,这一点都能够很好地展现。接下来,让我们通过C编程然后通过ASM来完成,我们要执行的步骤如下:

    1. 使用函数LoadLibraryA WinAPI在内存中加载Kernel32.dll;

    2. 使用GetProcAddress在Kernel32.dll中找到函数GetComputerNameA的地址;

    3. 将GetProcAddress返回值类型转换为接受2个参数的WinAPI函数(因为GetComputerNameA接受2个参数);

    4. 为ComputerName及其Length创建缓冲区。

    将Address作为函数指针来执行。

    Windows x86 Shellcode开发:寻找Kernel32.dll地址

    访问LoadLibraryA的MSDN页面,可以发现它返回一个HMODULE,这意味着它将一个句柄返回到一个被加载的模块。因此,我们创建了一个变量hmod_libname。类似地,GetProcAddress返回从DLL加载的函数的地址。我们需要将GetProcAddress返回的地址类型转换为GetComputerNameA函数,以使其能够正常工作。为此,我们创建了一个typedef,它基本上复制了函数GetComputerNameA的结构。在上图中,我们加载库Kernel32.dll,并使用GetProcAddress查找函数GetComputerNameA的基址,将地址存储在GetComputerNameProc中。最后,我们创建两个变量CompName和CompNameSize,并使用(*GetComputerNameProc)作为函数指针,执行存储在GetComputerNameProc中的地址,并为其提供所需的变量。上面的代码中,还打印了函数GetComputerNameA的地址。我们尝试对其进行编译,看看结果如何:

    Windows x86 Shellcode开发:寻找Kernel32.dll地址

    不错!地址0x74F69AC0与上面用x32dbg调试时发现的地址一致。

    _start

    我们接下来进入到有趣的部分。所有DLL及其函数的地址在重新启动时都会发生变化,并且在每个其他系统中都会有所不同。这就是我们无法对ASM代码中的任何地址进行硬编码的原因。但是,主要问题仍然存在,那就是我们如何找到kernel32.dll自身的地址?

    我在一开始说过,每个exe都加载了Kernel32.dll、NTDLL.DLL和Kernelbase.dll。事实上,这些DLL是操作系统中非常重要的一部分,每次在执行任何操作时,都会加载这些DLL。因此,这些DLL到内存中的加载顺序总是相同的。然而,这可能因操作系统而异。这就意味着,在Windows XP与Windows 10之间可能有所不同,但所有Windows 10中的加载顺序将保持不变。

    所以,我们在继续下一步之前,需要完成下面的工作:

    1. 找到Kernel32.dll的加载顺序;

    2. 找到Kernel32.dll的地址;

    3. 找到GetComputerNameA的地址;

    4. 在栈上加载GetComputerNameA的参数;

    5. 调用GetComputerNameA函数指针。

    可能听起来很容易?我们来实际尝试一下。

    查找kernel32.dll的地址并不简单。当我们执行任何exe时,在操作系统中首先创建的就是TEB(线程环境块)和PEB(进程环境块)。

    我们的主要关注点在于PEB结构(称为LDR),因为这是与进程相关的所有信息都被加载的地方。从流程参数到流程ID的所有内容都存储在这个位置。在PEB中,有一个名为PEB_LDR_DATA的结构,它包含三个关键部分。这些被称为链接列表(Linked Lists)。

    1. InLoadOrderModuleList – 加载模块(exe或dll)的顺序;

    2. InMemoryOrderModuleList – 模块(exe或dll)存储在内存中的顺序;

    3. InInitializationOrderModuleList – 在进程环境块中初始化模块(exe或dll)的顺序。

    在链表中加载模块的顺序是固定的。这意味着,我们如果能够在上面的列表中找到kernel32.dll的顺序,就可以搜索kernel32.dll的地址,并继续进行。现在,我们启动WinDBG x86。如果各位还没有安装WinDBG及其依赖项,你可以在SLAER上找到一篇关于WinDBG的文章。一旦安装WinDBG之后,就可以像我们之前那样打开任意的exe文件。

    在WinDBG中加载exe文件后,会显示一些输出。限制,我们将忽略输出内容,并在下面的命令提示符中输入.cls以清除屏幕并重新开始。现在,我们在命令提示符下输入!peb,看看在这里能够得到什么:

    Windows x86 Shellcode开发:寻找Kernel32.dll地址

    如大家所见,我们得到了LDR(PEB结构)的地址,即779E0C40。这非常重要,因为我们要使用该地址来计算前进的地址。接下来,我们输入命令dt nt!_TEB,以查找PEB结构的偏移量。

    Windows x86 Shellcode开发:寻找Kernel32.dll地址

    如我们所见,_PEB位于偏移量0x030的位置。以类似的方式,我们可以使用dt nt!_PEB查看_PEB结构的内容。

    Windows x86 Shellcode开发:寻找Kernel32.dll地址

    _PEB_LDR_DATA的偏移量为0x00c。接下来,我们尝试查找_PEB_LDR_DATA结构中的内容。我们可以用类似的方式实现这一点:

    dt nt!_PEB_LDR_DATA

    Windows x86 Shellcode开发:寻找Kernel32.dll地址

    在这里,我们可以看到InLoadOrderModuleList位于偏移量0x00c处,InMemoryOrderModuleList位于偏移量0x014处,InInitializationOrderModuleList位于偏移量0x01c处。此外,如果要查看每个列表所在的地址,可以使用我们此前找到的地址779E0C40(LDR的地址)以及命令dt nt!_PEB_LDR_DATA 779E0C40。这将向我们显示链接列表的相应起始地址和结束地址,如下所示:

    Windows x86 Shellcode开发:寻找Kernel32.dll地址

    有一个地方,可能会被一些人误解,就是上图中展示出InMemoryOrderModuleList的类型为_LIST_ENTRY,但在MSDN上已经另有说明:

    Windows x86 Shellcode开发:寻找Kernel32.dll地址

    因此,MSDN声明它是LDR_DATA_TABLE_ENTRY类型而不是_LIST_ENTRY类型。我们尝试查看结构中加载的模块,并指定该结构的起始地址为0x7041e8,以便可以看到加载的模块的基址。需要注意的是,0x7041e8是此结构的地址,因此第一个条目将比此地址少8个字节。因此,我们的命令是:

    dt nt!_LDR_DATA_TABLE_ENTRY 0x7041e8-8

    Windows x86 Shellcode开发:寻找Kernel32.dll地址

    第一个出现的BaseDllName是gethost.exe。这就是我之前执行的exe文件。此外,我们可以看到现在InMemoryOrderLinks的地址是0x7040e0。偏移量0x018处的DllBase中包含BaseDllName的基址。现在,我们下一个加载的模块必须距离0x7040e0有8个字节,也就是0x7040e0-8。

    dt nt!_LDR_DATA_TABLE_ENTRY 0x7040e0-8

    Windows x86 Shellcode开发:寻找Kernel32.dll地址

    所以,我们的第二个模块是ntdll.dll,它的地址是0x778c000,下一个模块位于0x704690之后的8个字节。所以,我们的下一个命令是:

    dt nt!_LDR_DATA_TABLE_ENTRY 0x704690-8

    Windows x86 Shellcode开发:寻找Kernel32.dll地址

    由此,就得到了第三个模块Kernel32.dll,其地址是0x74f50000,其偏移量时0x018。模块加载的顺序总是固定的,至少这适用于Windows 10、Windows 7、Windows 8(包括8.1)。因此,当我们编写ASM时,我们可以遍历整个PEB LDR结构体,并找到Kernel32.dll的地址,并将其加载到我们的Shellcode中。以类似的方式,我们还可以找到Kernelbase.dll的地址,这是第四个模块。

    Windows x86 Shellcode开发:寻找Kernel32.dll地址

    现在,我们总结一下需要进行的工作:

    1. PEB位于距离文件段寄存器偏移量为0x030的位置;

    2. LDR位于偏移量为PEB + 0x00C的位置;

    3. InMemoryOrderModuleList位于偏移量LDR + 0x014的位置;

    4. 第一个模块入口是exe本身;

    5. 第二个模块入口是ntdll.dll;

    6. 第三个模块入口是kernel32.dll;

    7. 第四个模块入口是Kernelbase.dll。

    我们现在最感兴趣的,就是Kernel32.dll。每次加载DLL时,地址都将存储在DllBase的偏移量0x018的位置。我们链接列表的起始地址将存储在InMemoryOrderLinks的偏移量中,即0x008。因此,偏移量之间的关系将是 DllBase – InMemoryOrderLinks = 0x018 – 0x008 = 0x10。因此,Kernel32.dll的偏移量将是LDR + 0x10。更详细的理解,可以在下图中看到,这张图是我从这里偷过来的。

    Windows x86 Shellcode开发:寻找Kernel32.dll地址

    现在,如果我们在ASM中做同样的工作,将会是如下所示:

    Windows x86 Shellcode开发:寻找Kernel32.dll地址

    我们使用NASM来编译,并在x32dbg中加载它。大家可以从这里下载NASM。

    Windows x86 Shellcode开发:寻找Kernel32.dll地址

    实际上,一旦我们的最后一条指令被运行,就应该在EAX寄存器中加载Kernel32.dll的地址。我们来看看它在x32dbg中看起来是否相同。

    Windows x86 Shellcode开发:寻找Kernel32.dll地址

    如我们所见,在最后一条指令之后,加载到EAX中的地址与我们在下面使用lm命令在WinDBG中看到的地址相同,都是74F50000,这是Kernel32.dll的地址。

    现在,我们已经有了Kernel32.dll的地址,下一步就是使用LoadLibraryA找到GetComputerNameA的地址,并调用该函数。我们将在下一篇文章中重点讨论这一问题,完善ASM代码,实现获取计算机名称并将其打印在屏幕上,然后打印到Shellcode部分。

    本文翻译自:https://scriptdotsh.com/index.php/2019/03/18/windows-shellcoding-x86-hunting

    展开全文
  • Windows XP/2003 Server 操作系统源代码缺少文件20201123__KERNEL32.DLL.v5.zip
  • Windows XP/2003 Server 操作系统源代码缺少文件20201123__KERNEL32.DLL.v4.zip
  • Windows XP/2003 Server 操作系统源代码缺少文件20201123__KERNEL32.DLL.v2.zip
  • kernel32.dll函数介绍

    千次阅读 2017-03-12 16:55:44
    kernel32.dll是非常重要的32位动态链接库文件,属于内核级文件。它控制着系统的内存管理、数据的输入输出操作和中断处理,当Win dows启动时,kernel32.dll就驻留在内存中特定的写保护区域,使别的程序无法占用这个...

    kernel32.dll是非常重要的32位动态链接库文件,属于内核级文件。它控制着系统的内存管理、数据的输入输出操作和中断处理,当Windows启动时,kernel32.dll就驻留在内存中特定的写保护区域,使别的程序无法占用这个内存区域。
    CALL DWord Ptr [<&KERNEL32.WriteFile>] kernel32.WriteFile
    将数据写入一个文件,也可将这个函数应用于对通信设备、管道、套接字以及邮槽的处理

    CALL DWord Ptr [<&KERNEL32.WriteConsole>] kernel32.WriteConsole
    在当前光标位置写入字符串到控制台屏幕缓冲区.

    CALL DWord Ptr [<&KERNEL32.WideCharToMultiByte>] kernel32.WideCharToMultiByte
    映射一个unicode字符串到一个多字节字符串。

    CALL DWord Ptr [<&KERNEL32.WaitForSingleObject>] kernel32.WaitForSingleObject
    用来检测hHandle事件的信号状态

    CALL DWord Ptr [<&KERNEL32.VirtualQuery>] kernel32.VirtualQuery
    以页为单位,遍历进程虚拟空间。

    CALL DWord Ptr [<&KERNEL32.VirtualProtect>] kernel32.VirtualProtect
    呼叫处理序的虚拟位址空间里,变更认可页面区域上的保护。

    CALL DWord Ptr [<&KERNEL32.VirtualFree>] kernel32.VirtualFree
    取消或者释放调用进程的虚地址空间页的一个区域

    CALL DWord Ptr [<&KERNEL32.VirtualAlloc>] kernel32.VirtualAlloc
    用进程的虚地址空间,预定或者提交一部分页

    CALL DWord Ptr [<&KERNEL32.UnhandledExceptionFilter>] kernel32.UnhandledExceptionFilter
    显示了一个对话框告诉你发生了一个错误

    CALL DWord Ptr [<&KERNEL32.TlsSetValue>] kernel32.TlsSetValue
    设置线程数组中的值

    CALL DWord Ptr [<&KERNEL32.TlsGetValue>] kernel32.TlsGetValue
    读取线程数组中的值

    CALL DWord Ptr [<&KERNEL32.TlsFree>] kernel32.TlsFree
    取消或者释放某个线程的TLS数组索引变量。

    CALL DWord Ptr [<&KERNEL32.TlsAlloc>] kernel32.TlsAlloc
    定义一些DWORD线程全局变量或函数静态变量,准备作为各个线程访问自己的TLS数组的索引变量。

    CALL DWord Ptr [<&KERNEL32.TerminateProcess>] kernel32.TerminateProcess
    结束一个进程

    CALL DWord Ptr [<&KERNEL32.Sleep>] kernel32.Sleep
    程序暂停,延迟执行若干时间. 时间的长短由其参数决定

    CALL DWord Ptr [<&KERNEL32.SizeofResource>] kernel32.SizeofResource
    返回指定资源字节数大小

    CALL DWord Ptr [<&KERNEL32.SetUnhandledExceptionFilter>] kernel32.SetUnhandledExceptionFilter
    设置异常捕获函数. 当异常没有处理的时候,系统就会调用SetUnhandledExceptionFilter所设置异常处理函数.

    CALL DWord Ptr [<&KERNEL32.SetStdHandle>] kernel32.SetStdHandle
    设置子进程、父进程可共用标准输入、标准输出和标准错误句柄

    CALL DWord Ptr [<&KERNEL32.SetHandleCount>] kernel32.SetHandleCount
    设置可用文件句柄

    CALL DWord Ptr [<&KERNEL32.SetFilePointer>] kernel32.SetFilePointer
    在一个文件中设置当前的读写位置

    CALL DWord Ptr [<&KERNEL32.SetEvent>] kernel32.SetEvent
    设置事件的状态为有标记,释放任意等待线程

    CALL DWord Ptr [<&KERNEL32.SetEnvironmentVariableA>] kernel32.SetEnvironmentVariableA
    对当前进程的指定环境变量进行设置

    CALL DWord Ptr [<&KERNEL32.SetEndOfFile>] kernel32.SetEndOfFile
    针对一个打开的文件,将当前文件位置设为文件末尾

    CALL DWord Ptr [<&KERNEL32.ResetEvent>] kernel32.ResetEvent
    这个函数把指定的事件对象设置为无信号状态。

    CALL DWord Ptr [<&KERNEL32.ReadFile>] kernel32.ReadFile
    从文件指针指向的位置开始将数据读出到一个文件中, 且支持同步和异步操作,

    CALL DWord Ptr [<&KERNEL32.RaiseException>] kernel32.RaiseException
    触发一个异常对象

    CALL DWord Ptr [<&KERNEL32.QueryPerformanceFrequency>] kernel32.QueryPerformanceFrequency
    返回计数频率

    CALL DWord Ptr [<&KERNEL32.QueryPerformanceCounter>] kernel32.QueryPerformanceCounter
    用于得到高精度计时器的值(如果存在这样的计时器)

    CALL DWord Ptr [<&KERNEL32.OutputDebugString>] kernel32.OutputDebugString
    向调试发送字符串

    CALL DWord Ptr [<&KERNEL32.MultiByteToWideChar>] kernel32.MultiByteToWideChar
    该函数映射一个字符串到一个宽字符(unicode)的字符串。由该函数映射的字符串没必要是多字节字符组。

    CALL DWord Ptr [<&KERNEL32.MoveFile>] kernel32.MoveFile
    描述将一个或多个文件从一个地方移动到另一个地方

    CALL DWord Ptr [<&KERNEL32.lstrlen>] kernel32.lstrlen
    该函数返回指定字符串的字节长度(ANSI版)或字符长度(双字节标准版);其中不包括终止NULL字符。

    CALL DWord Ptr [<&KERNEL32.lstrcmp>] kernel32.lstrcmp
    比较两个字符串,此比较区分大小写。

    CALL DWord Ptr [<&KERNEL32.lstrcmpi>] kernel32.lstrcmpi
    比较两个字符串,此比较不区分大小写。

    CALL DWord Ptr [<&KERNEL32.LoadResource>] kernel32.LoadResource
    装载指定资源到全局存储器。

    CALL DWord Ptr [<&KERNEL32.LoadLibrary>] kernel32.LoadLibrary
    载入指定的动态链接库,并将它映射到当前进程使用的地址空间。一旦载入,即可访问库内保存的资源

    CALL DWord Ptr [<&KERNEL32.LCMapString>] kernel32.LCMapString
    映像字符串

    CALL DWord Ptr [<&KERNEL32.IsValidLocale>] kernel32.IsValidLocale
    确定本地代码是否有效

    CALL DWord Ptr [<&KERNEL32.IsValidCodePage>] kernel32.IsValidCodePage
    判断一个代码页是否有效

    CALL DWord Ptr [<&KERNEL32.IsProcessorFeaturePresent>] kernel32.IsProcessorFeaturePresent
    获取系统中支持的x86处理器的特性

    CALL DWord Ptr [<&KERNEL32.IsDebuggerPresent>] kernel32.IsDebuggerPresent
    表明调用的进程是否是在一个调试器下运行

    CALL DWord Ptr [<&KERNEL32.IsDBCSLeadByteEx>] kernel32.IsDBCSLeadByteEx
    将当前代码页的字符编码转换成Unicode编码

    CALL DWord Ptr [<&KERNEL32.InterlockedIncrement>] kernel32.InterlockedIncrement
    设置一个长整数变量的值 。这个函数执行的操作可以安全地避开同步问题——即使是一个共享变量

    CALL DWord Ptr [<&KERNEL32.InterlockedExchange>] kernel32.InterlockedExchange
    能以原子操作的方式交换俩个参数a, b,并返回a以前的值

    CALL DWord Ptr [<&KERNEL32.InterlockedDecrement>] kernel32.InterlockedDecrement
    就是确保在此次操作期间,变量的值不会被别的地方(如线程)改变。

    CALL DWord Ptr [<&KERNEL32.InterlockedCompareExchange>] kernel32.InterlockedCompareExchange
    锁定前端总线

    CALL DWord Ptr [<&KERNEL32.InitializeCriticalSectionAndSpinCount>] kernel32.InitializeCriticalSectionAndSpinCount
    初始化临界区对象

    CALL DWord Ptr [<&KERNEL32.InitializeCriticalSection>] kernel32.InitializeCriticalSection
    初始化一个临界资源对象

    CALL DWord Ptr [<&KERNEL32.HeapDestroy>] kernel32.HeapDestroy
    取消堆

    CALL DWord Ptr [<&KERNEL32.HeapCreate>] kernel32.HeapCreate
    建立堆

    CALL DWord Ptr [<&KERNEL32.GlobalUnlock>] kernel32.GlobalUnlock
    开锁全局内存

    CALL DWord Ptr [<&KERNEL32.GlobalMemoryStatus>] kernel32.GlobalMemoryStatus
    检查内存状态

    CALL DWord Ptr [<&KERNEL32.GlobalLock>] kernel32.GlobalLock
    锁定内存对象并返回一个指针

    CALL DWord Ptr [<&KERNEL32.GlobalFree>] kernel32.GlobalFree
    释放全局内存块

    CALL DWord Ptr [<&KERNEL32.GlobalAlloc>] kernel32.GlobalAlloc
    该函数从堆中分配一定数目的字节数.

    CALL DWord Ptr [<&KERNEL32.GetVersionEx>] kernel32.GetVersionEx
    返回扩展操作系统版本信息

    CALL DWord Ptr [<&KERNEL32.GetUserDefaultLCID>] kernel32.GetUserDefaultLCID
    获取用户缺省本地ID

    CALL DWord Ptr [<&KERNEL32.GetTimeZoneInformation>] kernel32.GetTimeZoneInformation
    返回当前时区信息

    CALL DWord Ptr [<&KERNEL32.GetTickCount>] kernel32.GetTickCount
    从操作系统启动到现在所经过的毫秒数

    CALL DWord Ptr [<&KERNEL32.GetThreadLocale>] kernel32.GetThreadLocale
    获取线索本地信息

    CALL DWord Ptr [<&KERNEL32.GetSystemTimeAsFileTime>] kernel32.GetSystemTimeAsFileTime
    就是获取系统当前时间(UTC),以FILETIME的形式返回。

    CALL DWord Ptr [<&KERNEL32.GetSystemInfo>] kernel32.GetSystemInfo
    返回关于当前系统的信息。

    CALL DWord Ptr [<&KERNEL32.GetSystemDirectory>] kernel32.GetSystemDirectory
    取得Windows系统目录(System目录)的完整路径名

    CALL DWord Ptr [<&KERNEL32.GetStringType>] kernel32.GetStringType
    获取UNICODE字符串类型

    CALL DWord Ptr [<&KERNEL32.GetStdHandle>] kernel32.GetStdHandle
    返回标准的输入、输出或错误的设备的句柄,也就是获得输入、输出/错误的屏幕缓冲区的句柄。

    CALL DWord Ptr [<&KERNEL32.GetStartupInfo>] kernel32.GetStartupInfo
    返回进程在启动时被指定的 STARTUPINFO 结构

    CALL DWord Ptr [<&KERNEL32.GetProcessHeap>] kernel32.GetProcessHeap
    用以获取 调用过程的堆句柄

    CALL DWord Ptr [<&KERNEL32.GetProcAddress>] kernel32.GetProcAddress
    检索指定的动态链接库(DLL)中的输出库函数地址。

    CALL DWord Ptr [<&KERNEL32.GetOEMCP>] kernel32.GetOEMCP
    获取OEM系统代码页

    CALL DWord Ptr [<&KERNEL32.GetModuleHandle>] kernel32.GetModuleHandle
    获取一个应用程序或动态链接库的模块句柄

    CALL DWord Ptr [<&KERNEL32.GetModuleFileName>] kernel32.GetModuleFileName
    返回指定模块的路径

    CALL DWord Ptr [<&KERNEL32.GetLocaleInfo>] kernel32.GetLocaleInfo
    从记录中获取本机信息

    CALL DWord Ptr [<&KERNEL32.GetFileType>] kernel32.GetFileType
    在给出文件句柄的前提下,判断文件类型

    CALL DWord Ptr [<&KERNEL32.GetFileSize>] kernel32.GetFileSize
    返回指定文件大小

    CALL DWord Ptr [<&KERNEL32.GetFileAttributes>] kernel32.GetFileAttributes
    判断指定文件的属性

    CALL DWord Ptr [<&KERNEL32.GetExitCodeThread>] kernel32.GetExitCodeThread
    获取一个已中止线程的退出代码

    CALL DWord Ptr [<&KERNEL32.GetExitCodeProcess>] kernel32.GetExitCodeProcess
    获取一个已中断进程的退出代码

    CALL DWord Ptr [<&KERNEL32.GetEnvironmentStrings>] kernel32.GetEnvironmentStringsA
    该函数返回值是一个指向当前进程的系统环境变量的指针.

    CALL DWord Ptr [<&KERNEL32.GetDiskFreeSpaceEx>] kernel32.GetDiskFreeSpaceEx
    获取与一个磁盘的组织以及剩余空间容量有关的信息

    CALL DWord Ptr [<&KERNEL32.GetCurrentThreadId>] kernel32.GetCurrentThreadId
    获取当前线程一个唯一的线程标识符

    CALL DWord Ptr [<&KERNEL32.GetCurrentProcessId>] kernel32.GetCurrentProcessId
    获取当前进程一个唯一的标识符

    CALL DWord Ptr [<&KERNEL32.GetCurrentProcess>] kernel32.GetCurrentProcess
    获取当前进程的一个伪句柄。只要当前进程需要一个进程句柄,就可以使用这个伪句柄。该句柄可以复制,但不可继承。不必调用CloseHandle函数来关闭这个句柄

    CALL DWord Ptr [<&KERNEL32.GetCurrentDirectory>] kernel32.GetCurrentDirectory
    在一个缓冲区中装载当前目录

    CALL DWord Ptr [<&KERNEL32.GetCPInfo>] kernel32.GetCPInfo
    取得与指定代码页有关的信息

    CALL DWord Ptr [<&KERNEL32.GetConsoleOutputCP>] kernel32.GetConsoleOutputCP
    为控制台输出获取代码页

    CALL DWord Ptr [<&KERNEL32.GetConsoleMode>] kernel32.GetConsoleMode
    返回控制台输入输出模式

    CALL DWord Ptr [<&KERNEL32.GetConsoleCP>] kernel32.GetConsoleCP
    为控制台输入获取代码页

    CALL DWord Ptr [<&KERNEL32.GetCommandLine>] kernel32.GetCommandLine
    获得指向当前命令行缓冲区的一个指针

    CALL DWord Ptr [<&KERNEL32.GetACP>] kernel32.GetACP
    判断目前正在生效的ANSI代码页

    CALL DWord Ptr [<&KERNEL32.FreeLibrary>] kernel32.FreeLibrary
    释放指定的动态链接库,它们早先是用LoadLibrary API函数装载的

    CALL DWord Ptr [<&KERNEL32.FreeEnvironmentStrings>] kernel32.FreeEnvironmentStrings
    翻译指定的环境字串块

    CALL DWord Ptr [<&KERNEL32.FormatMessage>] kernel32.FormatMessage
    将GetLastError得到的错误信息(这个错误信息是数字代号)转化成字符串信息的函数

    CALL DWord Ptr [<&KERNEL32.FlushInstructionCache>] kernel32.FlushInstructionCache
    来把缓存里的数据重写回主内存里去,让CPU重新加载新的指令,才能执行新的指令

    CALL DWord Ptr [<&KERNEL32.FlushFileBuffers>] kernel32.FlushFileBuffers
    针对指定的文件句柄,刷新内部文件缓冲区

    CALL DWord Ptr [<&KERNEL32.FindResource>] kernel32.FindResource
    该函数确定指定模块中指定类型和名称的资源所在位置

    CALL DWord Ptr [<&KERNEL32.FindNextFile>] kernel32.FindNextFile
    根据调用FindFirstFile函数时指定的一个文件名查找下一个文件

    CALL DWord Ptr [<&KERNEL32.FindFirstFile>] kernel32.FindFirstFile
    该函数到一个文件夹(包括子文件夹)去搜索指定文件 如果要使用附加属性去搜索文件的话 可以使用FindFirstFileEx函数

    CALL DWord Ptr [<&KERNEL32.FindClose>] kernel32.FindClose
    关闭由FindFirstFile函数创建的一个搜索句柄

    CALL DWord Ptr [<&KERNEL32.ExitThread>] kernel32.ExitThread
    中止一个线程

    CALL DWord Ptr [<&KERNEL32.ExitProcess>] kernel32.ExitProcess
    中止一个进程

    CALL DWord Ptr [<&KERNEL32.EnumSystemLocales>] kernel32.EnumSystemLocales
    枚举系统已经安装或提供支持的“地方”设置

    CALL DWord Ptr [<&KERNEL32.DuplicateHandle>] kernel32.DuplicateHandle
    在指出一个现有系统对象当前句柄的情况下,为那个对象创建一个新句柄。当前句柄可能位于一个不同的进程

    CALL DWord Ptr [<&KERNEL32.DeleteFile>] kernel32.DeleteFile
    删除一个指定的文件

    CALL DWord Ptr [<&KERNEL32.CreateThread>] kernel32.CreateThread
    在主线程的基础上创建一个新线程

    CALL DWord Ptr [<&KERNEL32.CreateProcess>] kernel32.CreateProcess
    用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文

    CALL DWord Ptr [<&KERNEL32.CreatePipe>] kernel32.CreatePipe
    创建一个匿名管道 匿名管道不允许异步操作,所以如在一个管道中写入数据,且缓冲区已满,那么除非另一个进程从管道中读出数据,从而腾出了缓冲区的空间,否则写入函数不会返回

    CALL DWord Ptr [<&KERNEL32.CreateMutex>] kernel32.CreateMutex
    创建一个互斥体(MUTEX)

    CALL DWord Ptr [<&KERNEL32.CreateFile>] kernel32.CreateFile
    这是一个全功能的例程,可打开和创建文件、管道、邮槽、通信服务、设备以及控制台缓冲区

    CALL DWord Ptr [<&KERNEL32.CreateEvent>] kernel32.CreateEvent
    创建或打开一个命名的或无名的事件对象

    CALL DWord Ptr [<&KERNEL32.CreateDirectory>] kernel32.CreateDirectory
    创建一个新目录

    CALL DWord Ptr [<&KERNEL32.CopyFile>] kernel32.CopyFile
    复制文件。与vb的filecopy命令相似

    CALL DWord Ptr [<&KERNEL32.CompareString>] kernel32.CompareString
    根据用于特定“地方”环境的文本对比设置,对两个字串进行比较

    CALL DWord Ptr [<&KERNEL32.CloseHandle>] kernel32.CloseHandle
    关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等

    展开全文
  • Kernel32.dll 文件的导出表的分析 一.实验目的 使用PEviews与OllyDbg分析Kernel32.dll。 二.实验原理准备 (1)PE/ELF文件格式 1、PE/ELF都是可执行文件格式。(被装载器和链接器使用的可执行文件的规 范格式,可...

    Kernel32.dll 文件的导出表的分析

    一.实验目的

    使用PEviews与OllyDbg分析Kernel32.dll。

    二.实验原理准备

    (1)PE/ELF文件格式

    	1、PE/ELF都是可执行文件格式。(被装载器和链接器使用的可执行文件的规
    	范格式,可执行,文件时二进制分析的输入。)
    	2、典型代表:
    	     Unix/Linux下:Executable and Linkable Format(ELF)格式。
    	     Windows下,Portable Executable(PE)格式。
    

    (2)动态链接库(DLL)

    	(1)DLL的定义:动态链接库在程序外,是程序能够随时调用的程序库文件。
    	多个进程可以同时共享一个DLL文件。
    	(2)装载方式:显式链接与隐式链接。
    

    (3)导入地址表(IAT:Import Address Table)

    	1、PE文件使用的代码由其他DLL提供时,就需要装载这个DLL。而导入地址表,
    	就是记录程序正在使用的DLL库中的函数实际地址。
    	2、位置:NT头 --> IMAGE_OPTIONAL_HEADER --> DataDirectory[1]
    	  --> IMAGE_IMPORT_DESCRIPTOR --> FirstThunk --> IAT
    

    (4)映射原则

    	1、RVA(Relative Virtual Address):进程空间中相对基地址的偏移
    	2、RAW:外存中数据相对于文件头的偏移量
    	3、RAW - RAW(section) = RVA - RAV(section)
    
    三.实验步骤

    step1: 查看 IMPORT Table 的 RVA
    在这里插入图片描述
    可以看到,IMAGE_IMPORT_DESCRIPTOR 数组的起始 RVA为:9FC98。

    step2:查看RVA(section.rdata)与RAW(section.rdata)
    在这里插入图片描述
    其RVA(section.rdata) = 80000,RAW(section.rdata) = 65000。
    首个IMAGE_IMPORT_DESCRIPTOR 结构的 RAW 为:
    RAW = 9FC98 - 80000 + 65000 = 84C98。

    step3:观察 IMPORT_Directory_Table 的 84C98 位置。
    在这里插入图片描述
    step4:可以看到,DLL 名称字符串 " api-ms-win-core-rtlsupport-1-2-0.dll " 的 Name RVA 为A18E8。其所在的 RAW = A18E8 - 80000 + 65000 = 868E8。
    在这里插入图片描述
    在这里插入图片描述
    step5:我们再来观察一下 " api-ms-win-core-rtlsupport-1-2-0.dll " 的Import Name Table RVA = A0FE0在这里插入图片描述
    所以,INT 结构数组的起始 RAW = A0FE0 - 80000 + 65000 = 85FE0。

    在这里插入图片描述
    故第一个 IMAGE_IMPORT_BY_NAME 结构的 RAW = A18AC -80000 +65000 = 868AC。
    在这里插入图片描述
    易见,从" api-ms-win-core-rtlsupport-1-2-0.dll " 导入的第一个函数 RtlCaptureStackBackTrace 在 api-ms-win-core-rtlsupport-1-2-0.dll 得到处地址表中的序号为 0001。

    step6:让我们看一下, api-ms-win-core-rtlsupport-1-2-0.dll 的 IAT RVA 的值= 816D4。
    在这里插入图片描述
    则 IAT 结构数组起始 RAW = 816D4 - 80000 + 65000 = 666D4。
    在这里插入图片描述
    IAT 数组的第一个元素为 A18AC,当装载到内存时,我们使用 Olldbg 看一下:
    在这里插入图片描述
    可以发现,其值发生了改变。说明当被装载器装载到内存时,原来的地址会发生改变。

    展开全文
  • 此word中包含实验过程,实验源代码,是网络安全的其中一次试验,获取kernel32.dll的所有内核函数
  • 搜索KERNEL32.DLL得到API地址
  • 我们要在已经写入内存的进程执行我们的dll必须要用到Kernel32.dll模块,kernel32.dll是Windows 9x/Me中非常重要的32位动态链接库文件,属于内核级文件。它控制着系统的内存管理、数据的输入输出操作和中断处理,当...

    我们要在已经写入内存的进程执行我们的dll必须要用到Kernel32.dll模块,kernel32.dll是Windows 9x/Me中非常重要的32位动态链接库文件,属于内核级文件。它控制着系统的内存管理、数据的输入输出操作和中断处理,当Windows启动时,kernel32.dll就驻留在内存中特定的写保护区域,使别的程序无法占用这个内存区域。因此我们需要通过代码去获取这个模块句柄然后通过它的核心API调用去执行我们dll函数实现我们的注入功能

    HMODULE GetKernel32ModuleHandle() {
        return GetModuleHandle("Kernel32.dll");
    }
    
    展开全文
  • [DllImport("kernel32.dll")]

    2020-03-20 11:47:11
    using System.Runtime.InteropServices; using System.Text;... [DllImport("kernel32.dll")] private static extern int WritePrivateProfileString(string section, string key, string def, stri...
  • 写在前面的话:继续上篇,在获得了Kernel32.dll基址的基础上,分析它的导出表结构;对PE结构不太熟悉的同学,可以参考看雪论坛里的一篇帖子:https://bbs.pediy.com/thread-224265.htm零、思路说明分析之前,要明确...
  • 在Window目录下的system32文件夹中会看到kernel32.dll、user32.dll、gdi32.dll windows的大多数API都包含在这些DLL中。 kernel32.dll:主要处理内存管理和进程调度。 user32.dll:主要控制用户界面 gdi32.dll:...
  • 把windows2000下的kernel32.dll拷贝到windows 10,用x32dbg打开,在符号选项下可以查看函数的地址。
  • 1.首先想到是否kernel32.dll 出现异常,于是替换系统目录下的kernel32.dll,执行命令regsvr32 KERNEL32.dll 后问题依旧。 证明不是kernel32.dll的问题。 2、安装系统更新补丁KB2533623,下载地址: ...
  • 这次装完Win7 64位专业版,安装Dell触摸板程序出现报错,提示“无法定位程序输入点AddDllDirectory 于动态链接库KERNEL32.dll上”。 安装Atom也碰到了这个问题,报错提示“无法定位程序输入点...
  • 问题描述: 这个问题是我在给windows7系统安装程序的时候遇见的这个问题,最好的办法是重装系统,次好的办法是把下图的补丁下载安装一下 解决方法: 链接:...提取码:1524 ......

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 48,452
精华内容 19,380
关键字:

kernel32.dll