Theevilspirit的文章

  • 基于Python使用词云图

    1 引言词语图,也叫文字云,是对文本出现频率较高的“关键词”予以视觉化的展现,词云图过滤掉大量的低频低质的文本信息,使得浏览者一下就可以知道文章的主旨。
    2 模块准备import jieba # 分词模块import matplotlib.pyplot as plt # 画图模块from wordcloud import WordCloud # 文字云模块from scipy.misc import imread # 处理图像的函数,用于读取并处理背景图片
    3 实现的思路准备一份需要分析的文本材料,这里选用的是 19 年两会政府工作报告,首先用 jieba 模块对文本材料进行分词处理(即识别出一个个有意义的词语),然后对处理后的材料使用WordCloud 文字云模块生成相应的词云图片即可of course,你也可以选择一张背景图片,以此为背景生成特定的云图。
    4 代码实现def wordcloud(): """ 背景图片为自定义的一个矩阵 :return: 词云图 """ # 读取词源文件 二进制的形式 with open("./govreport.txt", "rb") as f: t = f.read() # 保存为str类型 ls = jieba.lcut(t) # 进行分词 txt = " ".join(ls) # 把分词用空格连起来 # 设置词云的参数 w = WordCloud( font_path="msyh.ttc", # 设置字体 width=1000, # 设置输出的图片宽度 height=700, # 设置输出的图片的高度 background_color="white", # 设置输出图片的背景色 ) w.generate(txt) # 生成词云 w.to_file("./wordColud.png") # 将图片保存 return Nonedef wordcloud2(): """ 用指定的图片生成词云图 :return: 词云图 """ # 词源的文本文件 wf = "./govreport.txt" word_content = open(wf, "r", encoding="utf-8").read().replace("\n", "") # 设置背景图片 img_file = "./map.jpg" # 解析背景图片 mask_img = imread(img_file) # 进行分词 word_cut = jieba.lcut(word_content) # 把分词用空格连起来 word_cut_join = " ".join(word_cut) # 设置词云参数 wc = WordCloud( font_path="SIMYOU.TTF", # 设置字体 max_words=2000, # 允许最大的词汇量 max_font_size=90, # 设置最大号字体的大小 mask=mask_img, # 设置使用的背景图片,这个参数不为空时,width和height会被忽略 background_color="white", # 设置输出的图片背景色 ) # 生成词云 wc.generate(word_cut_join) # 用于显示图片,需要配合plt.show()一起使用 plt.imshow(wc) plt.axis("off") # 去掉坐标轴 plt.savefig("./wordcloudWithMap.png") plt.show() return None
    5 效果展示不带背景图片的词云图

    带有中国地图的词云图
    1  留言 2019-04-21 10:18:25
  • 基于AheadLib工具进行DLL劫持

    背景或许你听过DLL劫持技术,获取你还没有尝试过DLL劫持技术。DLL劫持技术的原理是:

    由于输入表中只包含DLL名而没有它的路径名,因此加载程序必须在磁盘上搜索DLL文件。首先会尝试从当前程序所在的目录加载DLL,如果没找到,则在Windows系统目录中查找,最后是在环境变量中列出的各个目录下查找。利用这个特点,先伪造一个系统同名的DLL,提供同样的输出表,每个输出函数转向真正的系统DLL。程序调用系统DLL时会先调用当前目录下伪造的DLL,完成相关功能后,再跳到系统DLL同名函数里执行。这个过程用个形象的词来描述就是系统DLL被劫持(hijack)了。

    现在,本文就使用 AheadLib 工具生成劫持代码,对程序进行DLL劫持。现在就把实现原理和过程写成文档,分享给大家。
    实现过程本文选取劫持的程序是从网上随便下的一个程序“360文件粉碎机独立版.exe”,我们使用 PEview.exe 查看改程序的导入表,主要是看有程序需要导入哪些DLL文件。

    观察导入的DLL,类似KERNEL32.DLL、USER32.DLL等受系统保护的重要DLL,劫持难度比较大,所以,我们选择VERSION.DLL。至于,判断是不是受系统保护的DLL,可以查看注册表里面的键值,里面的DLL都是系统保护的,加载路径固定:
    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager\knowndlls然后,确定劫持的DLL文件之后,我们使用 AheadLib 工具来生成DLL劫持代码:

    接着,新建一个DLL工程,把AheadLib工具生成的代码拷贝到DLL工程中,同时,我们在DLL的入口点函数DllMain中增加一行弹窗代码,这样可以提示我们DLL劫持成功。然后编译链接,生成DLL文件。这个我们自己编译生成的DLL文件,就可以把DLL名称改成“VERSION.DLL”,放到和“360文件粉碎机独立版.exe”程序在同一目录下,运行程序,则会加载同一目录下的“VERSION.DLL”。
    为了验证DLL程序是否能成功劫持,我们把改名后的“VERSION.DLL”和“360文件粉碎机独立版.exe”放在桌面,然后,运行程序,这是,成功弹窗:

    我们使用 Process Explorer 工具查看下“360文件粉碎机独立版.exe”进程加载的DLL情况:

    可以看到,我们自己的version.dll成功被加载,而且还加载了系统的version.dll。之所以会加载系统的version.dll文件,是因为我们自己的DLL文件中,会加载version.dll文件。
    编码实现现在,我给出version.dll劫持部分入口点部分的代码,其余的代码都是使用AheadLib工具生成的,自己在入口点添加了一行弹窗的代码而已。
    // 入口函数BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved){ if (dwReason == DLL_PROCESS_ATTACH) { DisableThreadLibraryCalls(hModule); ::MessageBox(NULL, "I am Demon", "CDIY", MB_OK); return Load(); } else if (dwReason == DLL_PROCESS_DETACH) { Free(); } return TRUE;}
    总结有了AheadLib劫持代码生成工具的帮助,使得DLL劫持变得很轻松。本文的文档自己极力简化了,大家只要认真跟着步骤操作,应该可以看得懂的。
    注意,本文演示的例子实在 Windows7 32位系统上,对于64位系统,原理是一样的,对于代码劫持工具也可以换成 AheadLib 64位版本的。
    参考参考自《Windows黑客编程技术详解》一书
    1  留言 2018-12-10 09:49:26
  • 使用ShellExecute函数实现以管理员身份运行程序

    背景在 Win7 或者 Win7 以上版本的系统,我们想以管理员身份运行一个程序的时候,只需要选中这个程序文件,鼠标右击,选择“以管理员身份启动”就可以了。但是,在实际的编程中,我们要以管理员身份创建一个进程该怎么操作呢?
    可能有人会想,创建一个进程,那使用 CreateProcess 函数创建就可以了。是的,CreateProcess 是可以创建一个进程,但是它不能以管理员权限创建进程。换句话说,它只能创建一个权限比它低或者相同权限的进程。若是一个普通进程,它就创建不了管理员权限进程。
    本文要介绍的 ShellExecute 函数,可以实现创建管理员权限进程。但是,如果系统开启了UAC(用户账户控制),则会弹窗提示是否要以管理员权限运行。现在,我就把这个小程序实现的过程进行整理,分享给大家。
    函数介绍ShellExcute 函数
    对指定的文件执行操作。
    函数声明
    HINSTANCE ShellExecute( _In_opt_ HWND hwnd, _In_opt_ LPCTSTR lpOperation, _In_ LPCTSTR lpFile, _In_opt_ LPCTSTR lpParameters, _In_opt_ LPCTSTR lpDirectory, _In_ INT nShowCmd);
    参数

    hwnd [in]用于显示UI或错误消息的父窗口的句柄。如果操作未与窗口相关联,则此值可以为NULL。lpOperation[in]指向以NULL结尾的字符串的指针,在本例中称为动词,用于指定要执行的操作。可用的动词集取决于特定的文件或文件夹。一般来说,从对象的快捷菜单中可以获得的动作是动词。lpFile [in]指向以空值终止的字符串的指针,用于指定要在其上执行指定动词的文件或对象。要指定Shell命名空间对象,请传递完全限定的解析名称。请注意,并非所有对象都支持所有动词。例如,并非所有文档类型都支持“打印”动词。如果lpDirectory参数使用相对路径,则不要使用lpFile的相对路径。lpParameters [in]如果lpFile指定了一个可执行文件,则该参数是一个指向空值终止字符串的指针,该字符串指定要传递给应用程序的参数。此字符串的格式由要调用的动词决定。如果lpFile指定文档文件,则lpParameters应为NULL。lpDirectory [in]指向以空值终结的字符串的指针,该字符串指定操作的默认(工作)目录。如果此值为NULL,则使用当前工作目录。如果在lpFile中提供了相对路径,则不要使用lpDirectory的相对路径。nShowCmd [in]指定应用程序在打开时如何显示的标志。如果lpFile指定了一个文档文件,那么该标志就被简单传递给相关应用程序。
    返回值

    如果函数成功,则返回大于32的值。如果函数失败,则返回一个错误值,该值指示失败的原因。

    实现过程对于这个小程序,就直接调用 ShellExecute 函数进行实现就行,我们设置的执行操作是 “runas”,表示以管理员身份运行。
    根据上面的函数介绍,我们一一查看下程序调用该函数的参数情况。第 1 个参数,设为NULL,不关联任何窗口句柄;第 2 个参数表示操作行为,其中,“runas”表示以管理员身份执行操作;第 3 个参数表示要执行该操作的文件路径;第 4、第 5 个操作设为NULL,不传递执行参数以及当前工作目录;第 6 个参数表示程序运行时的显示标志,其中,SW_SHOWNORMAL表示正常显示。
    // 以管理员身份运行程序 HINSTANCE hRet = ::ShellExecute(NULL, "runas", pszFileName, NULL, NULL, SW_SHOWNORMAL); if (32 < (DWORD)hRet) { return TRUE; }
    这样,我们只要传递程序路径,调用此函数,就可以编程实现以管理员身份运行程序了。
    编程实现BOOL RunAsAdmiin(char *pszFileName){ // 以管理员身份运行程序 HINSTANCE hRet = ::ShellExecute(NULL, "runas", pszFileName, NULL, NULL, SW_SHOWNORMAL); if (32 < (DWORD)hRet) { return TRUE; } return FALSE;}
    程序测试我们直接运行程序,传入要以管理云身份启动的程序路径。UAC成功弹窗,点击确定,程序成功以管理员身份执行。
    总结这个小程序,关键是对 ShellExecute 函数参数的理解,其中关键参数是第 2 个参数,指定了操作的行为 “runas”,以管理员身份运行。
    此外,ShellExecute 函数的拓展函数 ShellExecuteEx,也可以使用相同的方式实现以管理员身份运行的功能。
    参考参考自《Windows黑客编程技术详解》一书
    1  留言 2018-11-27 09:53:36

发送私信

不要靠提高嗓门获取自己的存在感,那样只是虚张声势

15
文章数
17
评论数
eject