启用新域名 http://www.deianeira.net
Deianeira QQ交流群:75847983
共享源码,俺的第一个MFC语言程序,智能关机小助手 也是Deianeira的插件示例之一 1 Comments
弄了两天啊,几乎无时无刻都在百度,(*^__^*) 嘻嘻……,对MFC真的很蛋疼,不过还是蛮有味的。![]()
原理:先设置一个每个1秒就运行的定时器,然后在事件中 GetLocalTime 获得本地时间,然后就是比较了;剩余时间的获得,采用的是 CTime 和 CTimeSpan 两个类,很简单,主要是看你细心不细心,态度认真不认真。
这里把项目改成exe的了,\(^o^)/~,附件中得项目可以直接生成exe,原项目是生成dll,我修改了一下,因为这类插件都只适合 Deianeira 2.0 beta 版,但是 Deianeira 2.0 beta 版 还在写当中,所以就不拿出来献丑了。
分享一个非常“怪”的问题的解决经验,关于 VC.NET 自定义控件 控件 类型错误 0 Comments
这里,我以继承 ListView 来实现自定义控件为例子,项目名为“test”,VC.NET工程
1、首先解决自定义控件无法在工具箱出现的问题,这个问题容易解决
找到 “工具” --》“选项” --》“Windows 窗体设计器” --》“AutoToolboxPopulate” 默认值为 “False”,改成“True”,然后重新生成项目,这样的话就能在工具箱的顶部看到你的自定义组件了,见下面两幅图:
2、这里就是主要问题来了啊,注意看这里了,如果没搞懂这里的话,就不好办了;如果你没有改掉 “项目属性”--》“配置属性”--》“公共语言运行时支持” 里面的默认值时,自定义的控件是可以从工具箱中拖放到窗体里面去得,但是如果你改成其他的如"公共语言运行时支持(/clr)",然后你在拖放自定义控件的时候就会报错,见下图:
大多数用VC.NET的时候都会要用到VC函数或类型数据,这就使你必须要把项目属性改成“公共语言运行时支持(/clr)”,所以难以避免发生上面问题,这里有个不是很有效的但是又成功的解决办法,就是你拖放标准控件到窗体,然后在代理里面把目标类型换成自己的自定义控件类型,尽管能编译成功,运行的时候也有效果,但是这里有个小问题就是在你重新设计窗体的时候就会报错,原因在“公共语言运行时支持”这里。
改了后编译能运行,自定义控件的特性也能表现出来,但是在你重新设计窗体的时候,问题来了,Unknown type 'ListViewEx'. Please make sure that the assembly that contains this type is referenced. If this type is a part of your development project, make sure that the project has been successfully built.
原因在“公共语言运行时支持”这里。
[分享]2TB彩虹表BT种子,收集自 互撸娃's blog 0 Comments
共享源码,俺的第一个e语言程序,组件智能注册 也是Deianeira的插件示例之一 1 Comments
花了大约一天时间做出来的小小玩意,没多大用途;主要是为了做 Deianeira 插件示例,所以才去学了点e,不过最后感觉e也是蛮有味的,(*^__^*) 嘻嘻……
原理很简单的,就是调用 DLL 或 OCX 文件里面导出的 DllRegisterServer 和 DllUnregisterServer 来实现组件的注册和卸载的,原理就是这样。
源码,在附件中提供,这里就不提供插件版的源码了,因为新插件只适合 Deianeira 2.0 beta 版,当然这个版本这段时间不会发布,主要是更新太多了,增加很多功能还有上个版本还有很多功能没有完成。
PE结构分析 MetaData Header 获得“.NET”程序编译时所用DotNet组件的版本 0 Comments
获得“.NET”程序编译时所用DotNet组件的版本,弄了一个下午,终于弄出来的
下面看下截图,Deianeira.exe,采用NET4.0框架(采用CFF Explorer工具):
//DotNet MetaData Header
typedef struct _ImageMetaDataHeader{
//BSJB 鄙视脚本 (*^__^*) 嘻嘻……
DWORD Signature;
WORD MajorVersion;
WORD MinorVersion;
//保留
DWORD reserved;
//版本字符串的长度
DWORD VersionLength;
//版本字符串
char Version[1];
}IMAGE_METADATA_HEADER, *PIMAGE_METADATA_HEADER;
//作用:MapViewOfFile
//参数:lpctstrFilePath:目标文件路径
//返回:NULL:失败,!NULL:成功
Deianeira_EAPI LPVOID
file_getMapViewOfFile(Deianeira_In LPCTSTR lpctstrFilePath)
{
//打开目标文件
HANDLE hFile = CreateFile(
lpctstrFilePath,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
0,
NULL);
//打开失败
if (!hFile)
{
return NULL;
}
//文件映射
HANDLE hMap = CreateFileMapping(
hFile,
NULL,
PAGE_READONLY,
0, 0, NULL);
//映射失败
if (!hMap)
{
CloseHandle(hFile);
return NULL;
}
//文件到内存的映射
PVOID lpBase = MapViewOfFile(
hMap,
FILE_MAP_READ,
0, 0, 0);
//失败
if (!lpBase)
{
CloseHandle(hMap);
CloseHandle(hFile);
return NULL;
}
return lpBase;
}
//判断是不是dotnet的程序和返回DotNet程序的版本号
//lpszFilePath:目标文件
//返回:NULL:失败,!NULL:成功
Deianeira_EAPI LPSTR
file_isValidDotNetFile(Deianeira_In LPCTSTR lpszFilePath)
{
//打开目标文件
LPVOID lpBase = file_getMapViewOfFile(lpszFilePath);
//失败
if (!lpBase)
{
return NULL;
}
//获得dos头部
PIMAGE_DOS_HEADER pImage_dos_header = (PIMAGE_DOS_HEADER)lpBase;
//获得nt头部
PIMAGE_NT_HEADERS pImage_nt_header = (PIMAGE_NT_HEADERS)((ULONG)lpBase + pImage_dos_header->e_lfanew);
//CLI Header
PIMAGE_COR20_HEADER pImage_cor20_header = (PIMAGE_COR20_HEADER)ImageRvaToVa(pImage_nt_header, lpBase, pImage_nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR].VirtualAddress, NULL);
//如果失败
if(!pImage_cor20_header)
{
UnmapViewOfFile(lpBase);
return NULL;
}
//metadata_header
PIMAGE_METADATA_HEADER pImage_metadata_header = (PIMAGE_METADATA_HEADER)ImageRvaToVa(pImage_nt_header, lpBase, pImage_cor20_header->MetaData.VirtualAddress, NULL);
//如果失败
if (!pImage_metadata_header)
{
UnmapViewOfFile(lpBase);
return NULL;
}
LPSTR lpstrVersion = new char[pImage_metadata_header->VersionLength];
ZeroMemory(lpstrVersion, strlen(lpstrVersion));
strcpy_s(lpstrVersion, pImage_metadata_header->VersionLength, pImage_metadata_header->Version);
//version
UnmapViewOfFile(lpBase);
return lpstrVersion;
}










