我下载的为:qt-everywhere-opensource-src-4.7.2.tar.gz
各种API远程线程注入的方法,分别是 远程线程注入,普通消息钩子注入,全局消息钩子注入,APC应用层异步注入,ZwCreateThreadEx强力注入,纯汇编实现的线程注入等。
Shell 脚本编程是你在 Linux 下学习或练习编程的最简单的方式。尤其对系统管理员要处理着自动化任务,且要开发新的简单的实用程序或工具等(这里只是仅举几例)更是必备技能。 -- Aaron Kili
原文地址::http://blog.sina.com.cn/s/blog_b74a41780101ihlt.html
-----------------------------------------------------------------
Linux开源社区(微信号:cn_linux) 英文:Aaron Kili,翻译:Linux中国/ch-cn 链接:linux.cn/article-8618-1.html Shell 脚本编程 是你在 Linux 下学习或练习编程的最简单的方式。尤其对 系统管理员要处理着自动化任务,且要开发新的简单的实用程序或工具等(这里只是仅举几例)更是必备技能。 本文中,我们将分享 10 个写出高效可靠的 bash 脚本的实用技巧,它们包括: 1、 脚本中多写注释 这是不仅可应用于 shell 脚本程序中,也可用在
GetProcAddress函数检索指定的动态链接库(DLL)中的输出库函数地址。 函数原型: FARPROC GetProcAddress( HMODULE hModule, // DLL模块句柄 LPCSTR lpProcName // 函数名 ); 参数: hModule [in] 包含此函数的DLL模块的句柄。LoadLibrary或者GetModuleHandle函数可以返回此句柄。 lpProcName [in] 包含函数名的以NULL结尾的字符串,或者指定函数的序数值。如果此参数是一个序数值,它必须在一个字的底字节,高字节必须为0。 返回值: 如果函数调用成功,返回值是DLL中的输出函数地址。 如果函数调用失败,返回值是NULL。得到进一步的错误信息,调用函数GetLastError。 注释: GetProcAddress函数被用来检索在DLL中的输出函数地址。 lpProcName指针指向的函数名,拼写和大小写必须和DLL源代码中的模块定义文件(.DEF)中输出段(EXPORTS)中指定的相同。Win32 API函数的输出名可能不同于你在代码中调用的这些函数名,这个不同被宏隐含在相关的SDK头文件中。如果想得到更多信息,请参考Win32函数原型(Win32 Function Prototypes)。 lpProcName参数能够识别DLL中的函数,通过指定一个与函数相联系的序数值(在.DEF中的EXPORTS段)。GetProcAddress函数验证那个指定的序数值是否在输出的序数1和最高序数值之间(在.DEF中)。函数用这个序数值作为索引从函数表中读函数地址,假如.DEF 文件不连续地定义函数的序数值,如从1到N(N是输出的函数序数值),错误将会发生,GetProcAddress将会返回一个错误的、非空的地址,虽然指定的序数没有对应的函数。 为了防止函数不存在,函数应该通过名字指定而不是序数值。 要求: Windows NT/2000: 要求Windows NT 3.1 或以后版本。 Windows 95/98: 要求Windows 95 或以后版本。 头文件: 在Winbase.h中声明,include Windows.h。 库文件: Use Kernel32.lib。 参看: 动态链接库纵览(Dynamic-Link Libraries Overview), 动态链接库函数(Dynamic-Link Library Functions),FreeLibrary, GetModuleHandle, LoadLibrary 示例代码: 调用KERNEL32.DLL中的RegisterServiceProcess(仅在Windows98中适用) HMODULE hModule=GetModuleHandle("kernel32.dll"); if (hModule) { typedef DWORD (CALLBACK *LPFNREGISTER)(DWORD,DWORD); LPFNREGISTER lpfnRegister; lpfnRegister=(LPFNREGISTER)GetProcAddress(hModule,"RegisterServiceProcess"); if (lpfnRegister) { (*lpfnRegister)(NULL,1L); } }
在Windows编程中,经常会遇到需要对数据进行压缩和解压缩的情况,数据压缩是一种常见的优化手段,能够减小数据的存储空间并提高传输效率。Windows提供了这些API函数,本文将深入探讨使用Windows API进行数据压缩与解压缩的过程,主要使用ntdll.dll库中的相关函数。
在笔者前几篇文章中,我们使用汇编语言并通过自定位的方法实现了一个简单的MessageBox弹窗功能,但由于汇编语言过于繁琐在编写效率上不仅要考验开发者的底层功底,还需要写出更多的指令集,这对于普通人来说是非常困难的,当然除了通过汇编来实现ShellCode的编写以外,使用C同样可以实现编写,在多数情况下读者可以直接使用C开发,只有某些环境下对ShellCode条件有极为苛刻的长度限制时才会考虑使用汇编。
文本关键字:Linux、软件管理、configure、make、make install
#include <windows.h> #include <iostream> #include "12dll.h" using namespace std; #pragma comment(lib,"12Dll")//要链接到什么库文件 void main() { //CMy12Dll a; cout<<fnMy12Dll()<<endl; char b; cin>>b; } VS2008 新建WIN32项目 选择动态连接库 应用程序类型为:WINDOWS 应用程序 附加选项为:导出符号 d
有时即使某些命令运行失败,bash 可能继续去执行脚本,这样就影响到脚本的其余部分(会最终导致逻辑错误)。用下面的行的方式在遇到命令失败时来退出脚本执行:
0x00 HOOK概述Hook也就是钩子,在Windows中大部分的应用程序都是基于消息机制,会根据不同的消息使用消息过程函数完成不同的功能。而钩子是一种消息处理机制,它可以比你的应用程序先获得消息,可以用来截获、监视系统的消息,改变执行流程实现特定的功能。对于全局钩子来说,它会影响所有应用程序,所以钩子函数必须在DLL中实现。0x01 函数介绍SetWin
GUI(Graphical User Interface)应用,链接器选项:/SUBSYSTEM:WINDOWS
NtGlobalFlag 是一个Windows内核全局标记,在Windows调试方案中经常用到。这个标记定义了一组系统的调试参数,包括启用或禁用调试技术的开关、造成崩溃的错误代码和处理方式等等。通过改变这个标记,可以在运行时设置和禁用不同的调试技术和错误处理方式,比如调试器只能访问当前进程、只允许用户模式调试、启用特定的错误处理方式等等。但由于NtGlobalFlag标记是内核全局标记,其改变会影响整个系统的行为,需要谨慎处理。
Hook也就是钩子,在Windows中大部分的应用程序都是基于消息机制,会根据不同的消息使用消息过程函数完成不同的功能。而钩子是一种消息处理机制,它可以比你的应用程序先获得消息,可以用来截获、监视系统的消息,改变执行流程实现特定的功能。对于全局钩子来说,它会影响所有应用程序,所以钩子函数必须在DLL中实现。
1. Nginx简介 Nginx (发音为[engine x])专为性能优化而开发,其最知名的优点是它的稳定性和低系统资源消耗,以及对并发连接的高处理能力(单台物理服务器可支持30000~50000个并发连接), 是一个高性能的 HTTP 和反向代理服务器,也是一个IMAP/POP3/SMTP 代理服。
我们日常测试中,有时候有些辅助程序文件比如一些配置文件需要放在主程序执行文件同样的位置,便于管理和调用,这时候我们就需要获取执行文件的绝对路径。
MinHook是一个轻量级的Hooking库,可以在运行时劫持函数调用。它支持钩子API函数和普通函数,并且可以运行在32位和64位Windows操作系统上。其特点包括易于使用、高性能和低内存占用。MinHook使用纯汇编语言实现,在安装和卸载钩子时只需要短暂地锁定目标线程,因此对目标线程的影响非常小。
DLL,是 Dynamic Link Library的缩写,中文名 动态链接库。DLL是一个包含可由多个程序,同时使用的代码和数据的库。 本文简介DLL 概念,记录 DLL 工程创建与使用方法。 简介 动态链接库( Dynamic-link library,缩写为 DLL) 是微软公司在windows 系统中实现共享函数库概念的一种实现方式。所谓动态链接,就是把常用的公共函数封装到 DLL 文件中,当程序需要用到这些函数时,系统才会动态地将 DLL 加载到内存中使用。 调用方式主要分为两种:
DLL劫持算是一个老的漏洞,而且乌云漏洞库中也有很多的案例,只不过案例更多的只是验证一下,并没有教如何利用。至于为什么专门抓起来再学一遍了,唉,内网渗透需要
在调试一些病毒程序的时候,可能会碰到一些反调试技术,也就是说,被调试的程序可以检测到自己是否被调试器附加了,如果探知自己正在被调试,肯定是有人试图反汇编啦之类的方法破0解自己。为了了解如何破0解反调试技术,首先我们来看看反调试技术。
可以使用 sh -v testString.sh 命令来执行如下脚本,查看原始命令及输出内容,为了方便区分命令和内容,其中输出内容以深蓝色显示。
在调试一些病毒程序的时候,可能会碰到一些反调试技术,也就是说,被调试的程序可以检测到自己是否被调试器附加了,如果探知自己正在被调试,肯定是有人试图反汇编啦之类的方法破解自己。为了了解如何破解反调试技术,首先我们来看看反调试技术。
undefined 是 Undefined 类型的唯一值,它表示未定义的值。当声明变量未赋值时,或者定义属性未设置值时,默认值都为 undefined。 示例1 undefined 派生自 null,null 和 undefined 都表示空缺的值,转化为布尔值时都是假值,可以相等。
首先我们来看下面这幅图,为啥cc的值不是33呢,其实是因为在Linux的Shell当中,变量的默认类型全都是字符串类型,所以aa和bb都是字符串,让他们俩相加就是字符串相加,根本就不会进行数值运算。
1. Kernel32.dll 它包含那些用于管理内存、进程和线程的函数,例如CreateThread函数;
在Windows XP,Windows Server 2003以及更早的版本中,第一个登录的用户以及Windows的所有服务都运行在Session 0上,这样的做法导致用户使用的应用程序可能会利用Windows的服务程序提升自身的权限,为此,在后续的Windows版本中,引入了一种隔离机制,普通应用程序已经不再session 0中运行。
利用Window可以先加载当前目录下的dll特性,仿造系统的LPK.DLL,让应用程序先加载我们的伪LPK.DLL,然后在我们的dll中去调用原来系统的原函数.
Libzplay 是遵循 GPL 协议的开源库,它集成了 mp3、flac、ac3、aac、wav等多种音频格式的解码器和编码器,提供了面向 C/C++、C#、Delphi 等多种编程语言的接口,仅需 3 行代码(创建播放资源,打开文件,开始播放)便可实现音乐播放功能。
开始是一位朋友有这个需求,他给了我一个英伟达官网的开发包,名字是:R410-developer.zip(诸位可以自己到英伟达官网下载),里面提供了一些示例,包含自定义分辨率、显示器颜色设置等,但是显示器色彩设置的例子一致没有跑通,而且我也没有找到哪个参数是可以设置数字振动值的,所以憋屈了很多天。但直到看到了一个 AHK 版本实现的设置工具通过代码发现,其实实现方法是通过 nvapi.dll 动态库导出的一个查询函数地址的方法,将指定接口导出来执行具体业务。在加上在 github 上搜索的各类示例,最终实现了这个功能,下面详细介绍实现步骤。
为什么我们需要白加黑这种攻击方法呢?答:降本增效,我们知道在以后AI+安全崛起的大背景下,社工将会成为攻防演练项目中,成本最低,效率最高的一种攻击方式,而这个时候"白加黑"的成本优势就体现的淋漓尽致了。
SetWindowHookEx 是Windows系统的一个函数,可用于让一个应用程序安装全局钩子,但读者需要格外注意该方法安装的钩子会由操作系统注入到所有可执行进程内,虽然该注入方式可以用于绕过游戏保护实现注入,但由于其属于全局注入所以所有的进程都会受到影响,而如果想要解决这个问题,则需要在DllMain()也就是动态链接库开头位置进行判断,如果是我们所需操作的进程则执行该DLL模块内的功能,如果不是则自动跳过不执行任何操作即可实现指定进程的注入方式。
所谓游戏外挂,其实是一种游戏外辅程序,它可以协助玩家自动产生游戏动作、修改游戏网络数据包以及修改游戏内存数据等,以实现玩家用最少的时间和金钱去完成功力升级和过关斩将。虽然,现在对游戏外挂程序的“合法”身份众说纷纭,在这里我不想对此发表任何个人意见,让时间去说明一切吧。
二、Javascript在执行前会对整个脚本文件的声明部分做完整分析(包括局部变量),从而确定实变量的作用域。
onlyoffice为一款开源的office在线编辑组件,提供word/excel/ppt编辑保存操作
Nginx (发音为engine x)专为性能优化而开发,其最知名的优点是它的稳定性和低系统资源消耗,以及对并发连接的高处理能力(单台物理服务器可支持30000~50000个并发连接), 是一个高性能的 HTTP 和反向代理服务器,也是一个IMAP/POP3/SMTP 代理服。
ProcessHeap 是Windows进程的默认堆,每个进程都有一个默认的堆,用于在进程地址空间中分配内存空间。默认情况下ProcessHeap由内核进行初始化,该堆中存在一个未公开的属性,它被设置为加载器为进程分配的第一个堆的位置(进程堆标志),ProcessHeap标志位于PEB结构中偏移为0x18处,第一个堆头部有一个属性字段,这个属性叫做ForceFlags属性偏移为0x44,该属性为0说明程序没有被调试,非0说明被调试,另外的Flags属性为2说明被调试,不为2则说明没有被调试。
原文链接:https://blog.csdn.net/humanking7/article/details/80393070
我们知道kernel32.dll里有一个GetProcAddress函数,可以找到模块中的函数地址,函数原型是这样的: WINBASEAPI FARPROC WINAPI GetProcAddress( IN HMODULE hModule, IN LPCSTR lpProcName ); hModule 是模块的句柄,说白了就是内存中dll模块的首地址 loProcName 一般指函数名称的字符串地址,也可能是指序号,如何区分呢? 我们这样 if (((DWORD)lpProcName& 0xFFFF0000) == 0) { //这里是序号导出的; } { //这里是函数名称导出的 } 最终真找到匹配的函数地址,然后返回就ok了,但是前提是你需要了解PE的导出表 下面简单说一下,首先从PE里找到下面这个结构,如果不知道如何找的话,建议在坛子里搜索一下PE结构解析的文章,找到这个结构应该还是很简单的 typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; DWORD TimeDateStamp; WORD MajorVersion; WORD MinorVersion; DWORD Name; DWORD Base; DWORD NumberOfFunctions; DWORD NumberOfNames; DWORD AddressOfFunctions; // RVA from base of image DWORD AddressOfNames; // RVA from base of image DWORD AddressOfNameOrdinals; // RVA from base of image } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY; 具体什么意思呢? 虽然, kanxue老大在这里写的很漂亮了都 http://www.pediy.com/tutorial/chap8/Chap8-1-7.htm 我还是打算啰嗦一下 Base 函数以序号导出的时候的序号基数,从这个数开始递增 NumberOfFunctions 本dll一共有多少个导出函数,不管是以序号还是以函数名导出 NumberOfFunctions 本dll中以能够以函数名称导出的函数个数(注意,说一下,其实函数里的每一个函数都能通过序号导出,但是为了兼容性等等,也给一些函数提供用函数名称来导出) AddressOfFunctions 指向一个DWORD数组首地址,共有NumberOfFunctions 个元素,每一个元素都是一个函数地址 AddressOfNames 指向一个DWORD数组首地址,共有NumberOfNames个元素,每一个元素都是一个字符串(函数名字符串)首地址 AddressOfNameOrdinals指向一个WORD数组首地址,共有NumberOfNames个元素,每一个元素都是一个函数序号 我们说的最后俩数组,其实是一种一一对应的关系,假如分别叫 dwNames[] 和 dwNamesOrdinals[], 假如dwNames[5]的值(这个指是一个地址,前面都说了)指向的字符串等于“GetValue”,那么dwNamesOrdinals[5]的值(这个指是一个序号,前面都说了),就是GetValue导出函数的序号啦,那么怎样找到地址呢? 这时候就需要用到第一个数组了,假如名字叫dwFuncAddress[], GetValue的导出地址就是 dwFuncAddress[dwNamesOrdinals[5]] + 模块基址 好了,啰嗦了这么多,看代码: DWORD MyGetProcAddress( HMODULE hModule, // handle to DLL module LPCSTR lpProcName // function name ) { int i=0; PIMAGE_DOS_HEADER pImageDosHeader = NULL; PIMAGE_NT_HEADERS pImageNtHeader = NULL; PIMAGE_EXPORT_DIRECTORY pImageExportDirectory = NULL; pImageDosHeader=(PIMAGE_DOS_HEADER)hModule; pImageNtHeader=(PIMAGE_NT_HEADERS)((DWORD)hModule+pImageDosHeader->e_lfanew); pImageExportDirectory=(PIMAGE_EXPORT_DIREC
我们知道kernel32.dll里有一个GetProcAddress函数,可以找到模块中的函数地址,函数原型是这样的: WINBASEAPI FARPROC WINAPI GetProcAddress( IN HMODULE hModule, IN LPCSTR lpProcName ); hModule 是模块的句柄,说白了就是内存中dll模块的首地址 loProcName 一般指函数名称的字符串地址,也可能是指序号,如何区分呢? 我们这样 if (((DWORD)lpProcName& 0xFFFF0000) == 0) { //这里是序号导出的; } { //这里是函数名称导出的 } 最终真找到匹配的函数地址,然后返回就ok了,但是前提是你需要了解PE的导出表 下面简单说一下,首先从PE里找到下面这个结构,如果不知道如何找的话,建议在坛子里搜索一下PE结构解析的文章,找到这个结构应该还是很简单的 typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; DWORD TimeDateStamp; WORD MajorVersion; WORD MinorVersion; DWORD Name; DWORD Base; DWORD NumberOfFunctions; DWORD NumberOfNames; DWORD AddressOfFunctions; // RVA from base of image DWORD AddressOfNames; // RVA from base of image DWORD AddressOfNameOrdinals; // RVA from base of image } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY; 具体什么意思呢? 虽然, kanxue老大在这里写的很漂亮了都 http://www.pediy.com/tutorial/chap8/Chap8-1-7.htm 我还是打算啰嗦一下 Base 函数以序号导出的时候的序号基数,从这个数开始递增 NumberOfFunctions 本dll一共有多少个导出函数,不管是以序号还是以函数名导出 NumberOfFunctions 本dll中以能够以函数名称导出的函数个数(注意,说一下,其实函数里的每一个函数都能通过序号导出,但是为了兼容性等等,也给一些函数提供用函数名称来导出) AddressOfFunctions 指向一个DWORD数组首地址,共有NumberOfFunctions 个元素,每一个元素都是一个函数地址 AddressOfNames 指向一个DWORD数组首地址,共有NumberOfNames个元素,每一个元素都是一个字符串(函数名字符串)首地址 AddressOfNameOrdinals指向一个WORD数组首地址,共有NumberOfNames个元素,每一个元素都是一个函数序号 我们说的最后俩数组,其实是一种一一对应的关系,假如分别叫 dwNames[] 和 dwNamesOrdinals[], 假如dwNames[5]的值(这个指是一个地址,前面都说了)指向的字符串等于“GetValue”,那么dwNamesOrdinals[5]的值(这个指是一个序号,前面都说了),就是GetValue导出函数的序号啦,那么怎样找到地址呢? 这时候就需要用到第一个数组了,假如名字叫dwFuncAddress[], GetValue的导出地址就是 dwFuncAddress[dwNamesOrdinals[5]] + 模块基址 好了,啰嗦了这么多,看代码:
最近2周比较忙,没有抽出时间来写Blog,不过在这段时间里面把整个思路理了一遍,梳理了一下大纲,以后会多抽时间来写Blog。
Windows资源是一种二进制数据,由链接器链接进程序成为程序的一部分,通过资源的方式可以很方便的对应用程序进行扩展。在Windows中资源可以是系统自定义的,也可以是用户自定义的。在VC++中资源是以被称为资源脚本的文本文件描述的(扩展名为rc),另外为了方便代码中调用资源,VC++环境中还会自动生成一个resource.h的头文件供C++代码使用,这个文件中主要定义了各个资源的ID,在vc++中使用ID来唯一标识一个资源,这个ID可以是数字也可以是字符串,其实在VC中真正用来标识资源的是字符串,通过宏MAKEINTRESOURCE可以将数字型的ID转化为对应的字符串,一般的资源函数在操作资源时都需要提供一个资源的字符串,而这个串就是利用这个宏传入ID生成的。 在VC中资源脚本的基本格式为: 资源名(ID串) 类型名 [语言] 资源数据 资源数据可以是一段指定格式的文本或者一个文件,比如我们将wav作为资源加入到程序中,可以这样写: MY_WAVE_RES IDR_WAVE sample.wav.其中语言如果没有指定,那么默认为操作系统当前的语言环境。 另外我们也可以将不同的资源放入不同的文本文件中,先定义好,然后在.rc文件中使用#include 来包含进来,比如在一个名为wav.resinclude文件中定义了一个WAV资源,然后可以在.rc文件中加上一句 “#include
领取专属 10元无门槛券
手把手带您无忧上云