Article 1:Loading Win32/64 DLLs "manually" without LoadLibrary()

The most important steps of DLL loading are:

  1. Mapping or loading the DLL into memory.
  2. Relocating offsets in the DLL using the relocating table of the DLL (if present).
  3. Resolving the dependencies of the DLL, loading other DLLs needed by this DLL and resolving the offset of the needed functions.
  4. Calling its entrypoint (if present) with the DLL_PROCESS_ATTACH parameter.

I wrote the code that performed these steps but then quickly found out something is not OK: This loaded DLL doesn't have a valid HMODULE/HINSTANCE handle and many windows functions expect you to specify one (for example, GetProcAddress(), CreateDialog(), and so on...). Actually the HINSTANCE handle of a module is nothing more than the address of the DOS/PE header of the loaded DLL in memory.I tried to pass this address to the functions but it didn't work because windows checks whether this handle is really a handle and not only the contents of memory! This makes using manually loaded DLLs a bit harder!I had to write my own GetProcAddress() because the windows version didn't work with my DLLs.Later I found out that I want to use dialog resources in the DLL and CreateDialog() also requires a module handle to get the dialog resources from the DLL. For this reason I invented my custom FindResource() function that works with manually loaded DLLs and it can be used to find dialog resources that can be passed to the CreateDialogIndirect() function. You can use other types of resources as well in manually loaded DLLs if you find a function for that resource that cooperates with FindResource(). In this tip you get the code for the manual DLL loader and GetProcAddress(), but I post here the resource related functions in another tip.

Limitations

  1. The loaded DLL doesn't have a HMODULE so it makes life harder especially when its about resources.
  2. The DllMain() doesn't receive DLL_THREAD_ATTACH and DLL_THREAD_DETACH notifications. You could simulate this by creating a small DLL that you load with normal LoadLibrary() and from the DllMain() of this normally loaded DLL you could call the entrypoint of your manually loaded DLLs in case of DLL_THREAD_ATTACH/DLL_THREAD_DETACH.(建立一个普通的用LoadLibrary()加载起来的dll,从这个正常加载起来的dll的DLLMain(),你可以调用手动加载的DLL的入口点)
  3. If your DLL imports other DLLs, then the other DLLs are loaded with the WinAPI LoadLibrary(). This is actually not a limitation, just mentioned it for your information. Actually it would be useless to start loading for example kernel32.dll with manual dll loading, most system DLLs would probably disfunction/crash!
  4. DLLs that make use of SEH *may* fail. The fact that the DLL contains SEH related code alone isn't a problem but the __try blocks in the loaded DLL won't be able to catch the exceptions because the ntdll.dll!RtlIsValidHandler() doesn't accept exception handler routines from the memory area of our manually loaded DLL (because this memory area isn't mapped from a PE file). This is a problem only if an exception is raised inside a __try block of the DLL (because windows can't run the exception handler of the DLL and raises another exception that escapes the exception handler of the DLL - the result is usually a crash).
  5. Whether the CRT works with manual DLL loading or not depends on several things. It depends on the actual CRT version you are using and the functions you call from the CRT. If you are using just a few simple functions (like printf) then the CRT may work. I've written my DLLs with /NODEFAULTLIB linker option that means you can't reach CRT functions and it reduces your DLL size considerably (like with 4K intros). But then you have to go with pure WinAPI! This can be quite inconvenient but you can overcome this by writing your own mini CRT. I've provided one such mini CRT in my C++ example without attempting to be comprehensive but it at least allows you to use the most basic C++ features: automatically initialized static variables, new/delete operators. BTW, if you are about to use this code then you should understand most of these problems and you should appreciate that writing C/C++ DLL without CRT is still much more convenient than writing something as an offset independent or relocatable assembly patch.

源码分析:

  • TestDLL

定义一个结构体DLLInterface类型:里边是两个函数类型的指针AddNumbers和MyMessageBox

typedef struct DLLInterface
{
int (*AddNumbers)(int a, int b);
void (*MyMessageBox)(const char* message);
} DLLInterface;

对应的cpp文件中定义了两个函数:

int AddNumbers(int a, int b)
{
printf("DLL: AddNumbers(%d, %d)\n", a, b);
return a + b;
} void MyMessageBox(const char* message)
{
printf("DLL: MyMessageBox(\"%s\")\n", message);
MessageBoxA(NULL, message, "DLL MessageBox!", MB_OK);
}

然后将这两个函数作为指针传给上面定义的这样的一个结构体:

DLLInterface g_Interface =
{
AddNumbers,
MyMessageBox
};

将函数存储在dll文件的导出表中,__declspec(dllexport)表示被包含这个函数的程序之外的程序调用:

__declspec(dllexport) const DLLInterface* GetDLLInterface()
{
return &g_Interface;
}

DLLMain:

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
// With manual DLL loading you can not use DLL_THREAD_ATTACH and DLL_THREAD_DETACH.
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
printf("DLL: DLL_PROCESS_ATTACH\n");
// TODO
break;
case DLL_PROCESS_DETACH:
printf("DLL: DLL_PROCESS_DETACH\n");
// TODO
break;
default:
break;
}
return TRUE;
}
  • LoadDLL:

这里是模拟加载DLL(LoadLibrary)

MODULE_HANDLE LoadModule(const char* dll_path)
{
LOAD_DLL_INFO* p = new LOAD_DLL_INFO;
DWORD res = LoadDLLFromFileName(dll_path, , p);
if (res != ELoadDLLResult_OK)
{
delete p;
return NULL;
}
return p;
}

LoadDLLFromFileName中调用了:

ELoadDLLResult LoadDLLFromFileNameOffset(const char* filename, size_t dll_offset, size_t dll_size, int flags, LOAD_DLL_INFO* info)
{
ELoadDLLResult res;
FILE* f = fopen(filename, "rb");//filename就是testDLL的路径
if (!f)
return ELoadDLLResult_DLLFileNotFound;
res = LoadDLLFromCFile(f, dll_offset, dll_size, flags, info);
fclose(f);
return res;
}

再看LoadDLLFromCFile中的内容,这里值得说明

ELoadDLLResult LoadDLLFromCFile(FILE* f, size_t dll_offset, size_t dll_size, int flags, LOAD_DLL_INFO* info)
{
LOAD_DLL_FROM_FILE_STRUCT ldffs = { f, dll_offset, dll_size };
return LoadDLL((LOAD_DLL_READPROC)&LoadDLLFromFileCallback, &ldffs, flags, info);
}

LOAD_DLL_READPROC是一个函数指针类型,定义如下:

//LOAD_DLL_READPROC是一个函数指针
typedef BOOL (*LOAD_DLL_READPROC)(void* buff, size_t position, size_t size, void* param);

将LoadDLLFromFileCallback作为参数传递给LoadDLL."LoadDLLFromFileCallback"这个函数起名的用意是显然的,就是为了说明这是一个CALLBACK函数

这个CALLBACK函数的源码如下:

static BOOL LoadDLLFromFileCallback(void* buff, size_t position, size_t size, LOAD_DLL_FROM_FILE_STRUCT* param)
{
if (!size)
return TRUE;
if ((position + size) > param->dll_size)
return FALSE;
fseek(param->f, param->dll_offset + position, SEEK_SET);
return fread(buff, , size, param->f) == size;//用fread的形式把数据读入内存,起到Load的作用
}

说白了,CALLBACK之所以叫回调,是因为他是为了“被(作为参数)调用”而存在的,而不是为了来调用别的函数。这里,LoadDLLFromFileCallback被LoadDLL调用,用和LoadDLLFromFileCallback函数同类型的函数指针作为参数,传入LoadDLL,也就是说传入LoadDLLFromFileCallback函数供LoadDLL使用。其实CALLBACK函数不止这一个,还有如下这个函数:

static BOOL LoadDLLFromMemoryCallback(void* buff, size_t position, size_t size, LOAD_DLL_FROM_MEMORY_STRUCT* param)
{
if (!size)
return TRUE;
if ((position + size) > param->dll_size)
return FALSE;
memcpy(buff, (char*)param->dll_data + position, size);//拷贝指定位置开始的指定大小的数据到buff
return TRUE;
}
LoadDLLFromMemoryCallbackLoadDLLFromFileCallback同为CALLBACK函数,他们的模型是一样的,他们都是用来被其它函数调用的,LoadDLL根据自身想实现的不同功能,选择调用不同的CALLBACK函数而已。
对比一下LoadDLLFromCFileLoadDLLFromMemory其实只是在其内部调用的时候使用了不同的CALLBACK函数作为参数而已:
DWORD LoadDLLFromMemory(const void* dll_data, size_t dll_size, int flags, LOAD_DLL_INFO* info)
{
LOAD_DLL_FROM_MEMORY_STRUCT ldfms = { dll_data, dll_size };
return LoadDLL ((LOAD_DLL_READPROC)&LoadDLLFromMemoryCallback, &ldfms, flags, info);
}

LoadDLL函数源码部分:

这里可能是重点部分,需要学习研究的点也很多。

ELoadDLLResult LoadDLL(LOAD_DLL_READPROC read_proc, void* read_proc_param, int flags, LOAD_DLL_INFO* info)
{
LOAD_DLL_CONTEXT ctx;
ELoadDLLResult res;
BOOL finished_successfully = FALSE;
unsigned i; if (!read_proc)
return ELoadDLLResult_WrongFunctionParameters; ctx.sect = NULL;
ctx.loaded_import_modules_array = NULL;
ctx.import_modules_array_capacity = ;
ctx.num_import_modules = ;
ctx.dll_main = NULL;
__try
{
__try
{
res = LoadDLL_LoadHeaders(&ctx, read_proc, read_proc_param);//加载了DOS头、PE头、Section Table
if (res != ELoadDLLResult_OK)
return res; res = LoadDLL_AllocateMemory(&ctx, flags);//开辟了一块能容纳Sections大小的虚拟空间
if (res != ELoadDLLResult_OK)
return res; __try
{
res = LoadDLL_LoadSections(&ctx, read_proc, read_proc_param, flags);//Load Sections和Sections之前的内容
if (res != ELoadDLLResult_OK)
return res; res = LoadDLL_PerformRelocation(&ctx);
if (res != ELoadDLLResult_OK)
return res; res = LoadDLL_ResolveImports(&ctx);//填充IAT
if (res != ELoadDLLResult_OK)
return res; res = LoadDLL_SetSectionMemoryProtection(&ctx);
if (res != ELoadDLLResult_OK)
return res; res = LoadDLL_CallDLLEntryPoint(&ctx, flags);
if (res != ELoadDLLResult_OK)
return res; /* We finished!!! :) Filling in the callers info structure... */ if (info)
{
__try
{
info->size = sizeof(*info);
info->flags = flags;
info->image_base = ctx.image_base;
info->mem_block = ctx.image;
info->dll_main = ctx.dll_main;
info->export_dir_rva = ctx.hdr.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
info->loaded_import_modules_array = ctx.loaded_import_modules_array;
info->num_import_modules = ctx.num_import_modules;
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
return ELoadDLLResult_WrongFunctionParameters;
}
} finished_successfully = TRUE;
return ELoadDLLResult_OK;
}
__finally
{
if (!finished_successfully)
VirtualFree(ctx.image, , MEM_RELEASE); if (!finished_successfully || !info)
{
if (ctx.loaded_import_modules_array)
{
for (i=; i<ctx.num_import_modules; ++i)
FreeLibrary(ctx.loaded_import_modules_array[i]);
free(ctx.loaded_import_modules_array);
}
}
}
}
__finally
{
if (ctx.sect)
free(ctx.sect);
}
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
return ELoadDLLResult_UnknownError;
}
}

模拟的FreeLibrary

bool UnloadModule(MODULE_HANDLE handle)
{
bool res = FALSE != UnloadDLL(handle);
delete handle;
return res;
}
BOOL UnloadDLL(LOAD_DLL_INFO* info)
{
unsigned i;
BOOL res = TRUE; __try
{
if (!info || info->size!=sizeof(*info) || !info->image_base || !info->mem_block)
return FALSE; if (info->loaded_import_modules_array)//存放的是HMODULE
{
for (i=; i<info->num_import_modules; ++i)
FreeLibrary(info->loaded_import_modules_array[i]);
free(info->loaded_import_modules_array);
} if (!(info->flags & ELoadDLLFlag_NoEntryCall) && info->dll_main)
{
__try
{
res = info->dll_main(info->image_base, DLL_PROCESS_DETACH, NULL);//执行DLLmain的detach
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
res = FALSE;
}
} VirtualFree(info->mem_block, , MEM_RELEASE);
return res;
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
return FALSE;
}
}

模拟的GetProcAddress:

FARPROC MyGetProcAddress(HMODULE module, const char* func_name)
{
IMAGE_NT_HEADERS* hdr;
__try
{
if (((IMAGE_DOS_HEADER*)module)->e_magic != IMAGE_DOS_SIGNATURE)
return NULL;
hdr = (IMAGE_NT_HEADERS*)((DWORD_PTR)module + ((IMAGE_DOS_HEADER*)module)->e_lfanew); if (hdr->Signature != IMAGE_NT_SIGNATURE || hdr->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR_MAGIC)
return NULL; return MyGetProcAddress_ExportDir(
hdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress,
(DWORD_PTR)module,
func_name
);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
return NULL;
}
}

里边调用了:MyGetProcAddress_ExportDir,其实就是从export中获得函数的地址

FARPROC MyGetProcAddress_ExportDir(DWORD export_dir_rva, DWORD_PTR image_base, const char* func_name)
{
IMAGE_EXPORT_DIRECTORY* exp;
DWORD_PTR ord;
DWORD i; if (!export_dir_rva)
return NULL;
exp = (IMAGE_EXPORT_DIRECTORY*)(image_base + export_dir_rva);
ord = (DWORD_PTR)func_name; __try
{
if (ord < 0x10000)
{
/* Search for ordinal. */ if (ord < exp->Base)
return NULL;
ord -= exp->Base;
}
else
{
/* Search for name. */ for (i=; i<exp->NumberOfNames; ++i)
{
if ( !strcmp( (char*)(((DWORD*)(exp->AddressOfNames + image_base))[i] + image_base), func_name) )
{
ord = ((WORD*)(exp->AddressOfNameOrdinals + image_base))[i];
break;
}
}
} if (ord >= exp->NumberOfFunctions)
return NULL;
return (FARPROC)(((DWORD*)(exp->AddressOfFunctions + image_base))[ord] + image_base); }
__except (EXCEPTION_EXECUTE_HANDLER)
{
return NULL;
}
}

源码下载、说明:

http://www.codeproject.com/Tips/430684/Loading-Win-DLLs-manually-without-LoadLibrary

下面是一个德国人写的Loading a DLL from memory

This tutorial describes a technique how a dynamic link library (DLL) can be loaded from memory without storing it on the hard-disk first.

To emulate the PE loader, we must first understand, which steps are neccessary to load the file to memory and prepare the structures so they can be called from other programs.

When issuing the API call LoadLibrary, Windows basically performs these tasks:

  1. Open the given file and check the DOS and PE headers.
  2. Try to allocate a memory block of PEHeader.OptionalHeader.SizeOfImage bytes at position PEHeader.OptionalHeader.ImageBase.
  3. Parse section headers and copy sections to their addresses. The destination address for each section, relative to the base of the allocated memory block, is stored in the VirtualAddress attribute of the IMAGE_SECTION_HEADER structure.
  4. If the allocated memory block differs from ImageBase, various references in the code and/or data sections must be adjusted. This is called Base relocation.
  5. The required imports for the library must be resolved by loading the corresponding libraries.
  6. The memory regions of the different sections must be protected depending on the section’s characteristics. Some sections are marked as discardable and therefore can be safely freed at this point. These sections normally contain temporary data that is only needed during the import, like the informations for the base relocation.
  7. Now the library is loaded completely. It must be notified about this by calling the entry point using the flag DLL_PROCESS_ATTACH.

Allocate memory

All memory required for the library must be reserved / allocated using VirtualAlloc, as Windows provides functions to protect these memory blocks. This is required to restrict access to the memory, like blocking write access to the code or constant data.

The OptionalHeader structure defines the size of the required memory block for the library. It must be reserved at the address specified by ImageBase if possible:

aaarticlea/png;base64,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" alt="" />

If the reserved memory differs from the address given in ImageBase, base relocation as described below must be done.

Copy sections

Once the memory has been reserved, the file contents can be copied to the system. The section header must get evaluated in order to determine the position in the file and the target area in memory.

Before copying the data, the memory block must get committed:

aaarticlea/png;base64,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" alt="" />

Base relocation

All memory addresses in the code / data sections of a library are stored relative to the address defined by ImageBase in the OptionalHeader. If the library can’t be imported to this memory address, the references must get adjusted => relocated. The file format helps for this by storing informations about all these references in the base relocation table, which can be found in the directory entry 5 of the DataDirectory in the OptionalHeader.

This table consists of a series of this structure

aaarticlea/png;base64,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" alt="" />

It contains (SizeOfBlock – IMAGE_SIZEOF_BASE_RELOCATION) / 2 entries of 16 bits each. The upper 4 bits define the type of relocation, the lower 12 bits define the offset relative to the VirtualAddress.

The only types that seem to be used in DLLs are

IMAGE_REL_BASED_ABSOLUTE
No operation relocation. Used for padding.
IMAGE_REL_BASED_HIGHLOW
Add the delta between the ImageBase and the allocated memory block to the 32 bits found at the offset.

Resolve imports

The directory entry 1 of the DataDirectory in the OptionalHeader specifies a list of libraries to import symbols from. Each entry in this list is defined as follows:

aaarticlea/png;base64,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" alt="" />

The Name entry describes the offset to the NULL-terminated string of the library name (e.g. KERNEL32.DLL). The OriginalFirstThunk entry points to a list of references to the function names to import from the external library. FirstThunk points to a list of addresses that gets filled with pointers to the imported symbols.

When we resolve the imports, we walk both lists in parallel, import the function defined by the name in the first list and store the pointer to the symbol in the second list:

aaarticlea/png;base64,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" alt="" />

Protect memory

Every section specifies permission flags in it’s Characteristics entry. These flags can be one or a combination of

IMAGE_SCN_MEM_EXECUTE
The section contains data that can be executed.
IMAGE_SCN_MEM_READ
The section contains data that is readable.
IMAGE_SCN_MEM_WRITE
The section contains data that is writeable.

These flags must get mapped to the protection flags

  • PAGE_NOACCESS
  • PAGE_WRITECOPY
  • PAGE_READONLY
  • PAGE_READWRITE
  • PAGE_EXECUTE
  • PAGE_EXECUTE_WRITECOPY
  • PAGE_EXECUTE_READ
  • PAGE_EXECUTE_READWRITE

Now, the function VirtualProtect can be used to limit access to the memory. If the program tries to access it in a unauthorized way, an exception gets raised by Windows.

In addition the section flags above, the following can be added:

IMAGE_SCN_MEM_DISCARDABLE
The data in this section can be freed after the import. Usually this is specified for relocation data.
IMAGE_SCN_MEM_NOT_CACHED
The data in this section must not get cached by Windows. Add the bit flag PAGE_NOCACHE to the protection flags above.

Notify library

The last thing to do is to call the DLL entry point (defined by AddressOfEntryPoint) and so notifying the library about being attached to a process.

The function at the entry point is defined as

typedef BOOL (WINAPI *DllEntryProc)(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved);

DllEntryProc entry = (DllEntryProc)(baseAddress + PEHeader->OptionalHeader.AddressOfEntryPoint);

(*entry)((HINSTANCE)baseAddress, DLL_PROCESS_ATTACH, 0);

Afterwards we can use the exported functions as with any normal library.

LoadLibrary执行的任务就到此结束了。

Exported functions

If you want to access the functions that are exported by the library, you need to find the entry point to a symbol, i.e. the name of the function to call.

The directory entry 0 of the DataDirectory in the OptionalHeader contains informations about the exported functions. It’s defined as follows:

aaarticlea/png;base64,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" alt="" />

First thing to do, is to map the name of the function to the ordinal number of the exported symbol. Therefore, just walk the arrays defined by AddressOfNames and AddressOfNameOrdinals parallel until you found the required name.

Now you can use the ordinal number to read the address by evaluating the n-th element of the AddressOfFunctions array.

Freeing the library

To free the custom loaded library, perform the steps

DllEntryProc entry = (DllEntryProc)(baseAddress + PEHeader->OptionalHeader.AddressOfEntryPoint);
(*entry)((HINSTANCE)baseAddress, DLL_PROCESS_ATTACH, 0);
  • Free external libraries used to resolve imports.
  • Free allocated memory.

MemoryModule

MemoryModule is a C-library that can be used to load a DLL from memory.

The interface is very similar to the standard methods for loading of libraries:

aaarticlea/png;base64,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" alt="" />

原文参考:

http://www.joachim-bauch.de/tutorials/loading-a-dll-from-memory/

源码参考:

https://github.com/fancycode/MemoryModule

Load PE from memory(反取证)(未完)的更多相关文章

  1. Go web编程学习笔记——未完待续

    1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...

  2. [教程] [承風雅傳HSU]用ES4封裝Win7---ES4 Win7封裝教程(未完待續)

    [教程] [承風雅傳HSU]用ES4封裝Win7---ES4 Win7封裝教程(未完待續) a10036it 发表于 2015-7-27 21:11:19 https://www.itsk.com/t ...

  3. 《MySQL 基础课程》笔记整理(进阶篇)(未完)

    一.MySQL服务安装及命令使用 安装过程就不写了,毕竟百度经验一大把 MySQL 官方文档 MySQL 参考手册中文版 1.MySQL简介 ​ RDBMS(Relational Database M ...

  4. ExtJs之Ext.grid.GridPanel(部分未完)

    今天在家休息,年假不用就作费啊. 看了几部香港老电影,陪爸爸看了勇士占奇才, 然后,测试了一下EXTJS未完的内容, 在京东上订了七本历史普及书,近两百块..:) 搞定. <!DOCTYPE h ...

  5. Apple放大绝进行反取证

    取证说穿了其实就是攻防,这本是正义与邪恶的对决,亦即执法单位与嫌疑犯两者之间的事,但现实生活中要比这复杂多了. 怎么说呢?举个例子大家便理解了.取证人员费尽心思,用尽各种手法,努力地想要自手机上提取重 ...

  6. javascript有用小功能总结(未完待续)

    1)javascript让页面标题滚动效果 代码如下: <title>您好,欢迎访问我的博客</title> <script type="text/javasc ...

  7. ASP.NET MVC 系列随笔汇总[未完待续……]

    ASP.NET MVC 系列随笔汇总[未完待续……] 为了方便大家浏览所以整理一下,有的系列篇幅中不是很全面以后会慢慢的补全的. 学前篇之: ASP.NET MVC学前篇之扩展方法.链式编程 ASP. ...

  8. 关于DOM的一些总结(未完待续......)

    DOM 实例1:购物车实例(数量,小计和总计的变化) 这里主要是如何获取页面元素的节点: document.getElementById("...") cocument.query ...

  9. 我的SQL总结---未完待续

    我的SQL总结---未完待续 版权声明:本文为博主原创文章,未经博主允许不得转载. 总结: 主要的SQL 语句: 数据操作(select, insert, delete, update) 访问控制(g ...

随机推荐

  1. 如何在 Linux 中找出最近或今天被修改的文件

    1. 使用 ls 命令,只列出你的 home 文件夹中今天的文件. ls -al --time-style=+%D | grep `date +%D` 其中: -a- 列出所有文件,包括隐藏文件 -l ...

  2. suricata抓包方式之一AF_PACKET

    suricata抓包方式之一AF_PACKET 噜拯渡 睦坚削 曜纡宄 式犒藿氆 咬焚桤φ 要蒯钮 喃俚夼 币噎嶂颐 话千叶舞就后悔了怎么想都容易让人引 虻谮м 及葚雏钏 看着表面平静实际 ...

  3. java中system.out.println()是什么意思

    在Java编程中,我们常常用System.out.println()方法来输出字符串,也许我们都已经猜到println()是方法名,但System是什么,out又是什么呢?这里就涉及用到一个stati ...

  4. 使用SQL Server视图的优缺点

    SQL Server视图我们经常会用的到,下面就为您介绍使用SQL Server视图的优缺点,希望可以对您SQL Server视图有更多的了解. 在程序设计的时候必须先了解视图的优缺点,这样可以扬长避 ...

  5. boolean attribute(布尔值属性) attribute vs property

    boolean attribute(布尔值属性) boolean attribute     HTML - Why boolean attributes do not have boolean val ...

  6. OvS: ovs-ofctl adding parameters analysis

    if using dpdk, then OvS' datapath folder is ignored. Only OvS' userspace code are in use. According ...

  7. maven 阿里镜像

    <mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>al ...

  8. lldb 命令

    po [[UIWindow keyWindow] recursiveDescription]

  9. python之~【空格】可不能随便加唷~

    上个礼拜学习从.proto文件转xxpb2.py文件的时候,明明成功了的. 结果周末的时候在家里,以及今天周一来到公司电脑,都遇到同样的一个问题. 我就纳闷了.这个路径确实存在呀. 而且我找遍了搜索引 ...

  10. “System.BadImageFormatException”类型的未经处理的异常在 PurchaseDevices.Access.dll 中发生 其他信息: 未能加载文件或程序集“System.Data.SQLite, Version=1.0.66.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139”或它的某一个依赖项。试图加载格式不正确

    引用sqlite的程序集时,有时会报如下异常:  "System.BadImageFormatException"类型的未经处理的异常在 PurchaseDevices.Acces ...