• Sublime Text 3 3114注册码

    ·

    发布于

    修改于

    —– BEGIN LICENSE —–
    Anthony Sansone
    Single User License
    EA7E-878563
    28B9A648 42B99D8A F2E3E9E0 16DE076E
    E218B3DC F3606379 C33C1526 E8B58964
    B2CB3F63 BDF901BE D31424D2 082891B5
    F7058694 55FA46D8 EFC11878 0868F093
    B17CAFE7 63A78881 86B78E38 0F146238
    BAE22DBB D4EC71A1 0EC2E701 C7F9C648
    5CF29CA3 1CB14285 19A46991 E9A98676
    14FD4777 2D8A0AB6 A444EE0D CA009B54
    —— END LICENSE ——

  • 判断当前用户是否在管理员组

    ·

    发布于

    修改于

    配合判断当前进程权限的函数可以得知当前是否具备Bypass UAC的条件。

    https://www.hualaishi.me/判断当前进程是否具有管理员权限/

    //
    BOOL IsUserInAdminGroup()
    {
    	BOOL	fInAdminGroup = FALSE;
    	DWORD	dwError = ERROR_SUCCESS;
    	HANDLE	hToken = NULL;
    	HANDLE	hTokenToCheck = NULL;
    	DWORD	cbSize = 0;
    	ULONG	dwMajorVersion = 0;
    	ULONG	dwMinorVersion = 0;
    
    	do
    	{
    		if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_DUPLICATE, &hToken))
    			return FALSE;
    
    		GetSysVer(&dwMajorVersion, &dwMinorVersion);
    		if (dwMajorVersion >= 6)
    		{
    			TOKEN_ELEVATION_TYPE elevType;
    			if (!GetTokenInformation(hToken, TokenElevationType, &elevType, sizeof(elevType), &cbSize))
    				break;
    			if (TokenElevationTypeLimited == elevType)
    			{
    				if (!GetTokenInformation(hToken, TokenLinkedToken, &hTokenToCheck, sizeof(hTokenToCheck), &cbSize))
    					break;
    			}
    		}
    		if (!hTokenToCheck)
    		{
    			if (!DuplicateToken(hToken, SecurityIdentification, &hTokenToCheck))
    				break;
    		}
    		BYTE adminSID[SECURITY_MAX_SID_SIZE];
    		cbSize = sizeof(adminSID);
    		if (!CreateWellKnownSid(WinBuiltinAdministratorsSid, NULL, &adminSID, &cbSize))
    			break;
    		if (!CheckTokenMembership(hTokenToCheck, &adminSID, &fInAdminGroup))
    			break;
    	} while (0);
    
    	if (hToken)
    		CloseHandle(hToken);
    	if (hTokenToCheck)
    		CloseHandle(hTokenToCheck);
    
    	return fInAdminGroup;
    }

  • 开启和关闭WOW64进程的重定位

    ·

    发布于

    修改于

    用于在64位系统中的32位进程访问64位的系统目录和注册表

    //
    BOOLEAN EnableWow64FsRedirection(BOOLEAN Wow64FsEnableRedirection)
    {
    	typedef BOOLEAN (WINAPI *_Wow64EnableWow64FsRedirection)(
    		_In_ BOOLEAN Wow64FsEnableRedirection
    	);
    
    	_Wow64EnableWow64FsRedirection fpWow64EnableWow64FsRedirection = (_Wow64EnableWow64FsRedirection)GetProcAddress(GetModuleHandleA("Kernel32.dll"), "Wow64EnableWow64FsRedirection");
    	if (fpWow64EnableWow64FsRedirection)
    	{
    		return fpWow64EnableWow64FsRedirection(Wow64FsEnableRedirection);
    	}
    	return FALSE;
    }

  • 判断当前进程是否为64位系统中的32位进程(WOW64)

    ·

    发布于

    修改于

    //
    BOOL IsWow64(HANDLE ProcessHandle)
    {
    	typedef BOOL(WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
    	LPFN_ISWOW64PROCESS fnIsWow64Process;
    	BOOL bIsWow64 = FALSE;
    
    	fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(LoadLibraryA("kernel32.dll"), "IsWow64Process");
    	if (NULL != fnIsWow64Process)
    	{
    		fnIsWow64Process(ProcessHandle, &bIsWow64);
    	}
    
    	return bIsWow64;
    }
    

  • 判断当前进程是否具有管理员权限

    ·

    发布于

    修改于

    测试结果

    • 用管理员权限运行,返回TRUE;
    • 在UAC环境下直接运行,返回FALSE;
    • 在SYSTEM权限服务进程中执行,返回TRUE。
    //
    BOOL IsAdmin()
    {
    	typedef BOOL(WINAPI *_LPFN_ISADMIN) (VOID);
    	_LPFN_ISADMIN	fnIsAdmin;
    
    	//	IsUserAnAdmin
    	HMODULE	hShell32 = LoadLibraryA("Shell32.dll");
    
    	fnIsAdmin = (_LPFN_ISADMIN)::GetProcAddress(hShell32, "IsUserAnAdmin");
    
    	if (NULL != fnIsAdmin)
    	{
    		return fnIsAdmin();
    	}
    	return FALSE;
    }
    
    BOOL IsUserAdmin(VOID)
    /*++ 
    Routine Description: This routine returns TRUE if the caller's
    process is a member of the Administrators local group. Caller is NOT
    expected to be impersonating anyone and is expected to be able to
    open its own process and process token. 
    Arguments: None. 
    Return Value: 
       TRUE - Caller has Administrators local group. 
       FALSE - Caller does not have Administrators local group. --
    */ 
    {
    	BOOL b;
    	SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
    	PSID AdministratorsGroup; 
    	b = AllocateAndInitializeSid(
    	    &NtAuthority,
    	    2,
    	    SECURITY_BUILTIN_DOMAIN_RID,
    	    DOMAIN_ALIAS_RID_ADMINS,
    	    0, 0, 0, 0, 0, 0,
    	    &AdministratorsGroup); 
    	if (b) 
    	{
    		if (!CheckTokenMembership( NULL, AdministratorsGroup, &b)) 
    		{
    			b = FALSE;
    		} 
    		FreeSid(AdministratorsGroup); 
    	}
    	return(b);
    }

  • Linux调用动态库及g++动态库函数导出方法

    ·

    发布于

    修改于

    编写程序main,在程序main中调用lib.so中的myprintf函数。
    main.cc

    //main.cc
    #include <iostream>
    #include <dlfcn.h> //dlopen等函数需要的头文件
    
    int main(int argc,char* argv[])
    {
        void* dlp = dlopen("./lib.so",RTLD_NOW);
        if (dlp)
        {
        	std::cout << "dlopen is OK!" << std::endl;
        	typedef void (*pf_myprintf)(const char* str);
    		pf_myprintf myprintf = (pf_myprintf)dlsym(dlp,"myprintf");
    		if (myprintf)
    		{
    			char txtbuf[100];
    			std::cin.get(txtbuf,100);
    			myprintf(txtbuf);
    		}
    		else
    		{
    			std::cout << "dlsym is failed!" << std::endl;
    		}
        }
        else
        {
        	std::cout << "dlopen is failed!" << std::endl;
        	return 0;
        }
    	return 1;
    }

    lib.cc

    //lib.cc
    #include <iostream>
    
    extern "C"__attribute__((visibility("default"))) void myprintf(const char* str)
    {
    	std::cout << "-----myprintf begin-----" << std::endl;
    	std::cout << str << std::endl;
    	std::cout << "------myprintf end------" << std::endl;
    }
    
    extern "C" void test_export1()
    {
    	std::cout << "-----test_export-----" << std::endl;
    }
    
    __attribute__((visibility("default"))) void test_export2()
    {
    	std::cout << "-----test_export-----" << std::endl;
    }

    makefile

    #main lib makefile
    main:main.cc
    	g++ main.cc -o main -ldl
    lib:lib.cc
    	g++ -o lib.so lib.cc -shared -fPIC -fvisibility=hidden
    clean:
    	-rm main *.so

    使用make来编译生成主调程序,使用make lib来生成库程序lib.so,而后执行main即可调用动态库中的函数,如图1所示。

    ubuntu_amd64-2016-01-30-13-00-46
    图1

    下面我们看看lib.cc中的三个函数都哪个导出了,使用命令readelf -s lib.so,结果如图2所示。

    ubuntu_amd64-2016-01-30-13-01-08
    图2

    可以看到,三个函数只有test_export2没有被导出,也只有这个函数没有用extern "C"标注,另外,该函数使用了__attribute__((visibility("default")))。由此可以得出以下假设:

    1. 使用g++编译动态库,会导出具有extern "C"标识的函数,在gcc中有效的__attribute__((visibility("default")))标识在g++中无效。原因可能是因为__attribute__是Linux C中特有的标识,在C++中很有可能没有作用。
    2. 另外从lib.so的导出符号表中可以看到一些C++形式的导出函数,所以一定是还有其它方法可以直接导出C++形式的函数。

  • Ubuntu安装VMware tools

    ·

    发布于

    修改于

    可以用open-vm-tools替代传统的VMware tools,直接apt-get就可以。

    • sudo apt-get install open-vm-tools
    • sudo apt-get install open-vm-tools-desktop

    必须有open-vm-tools-desktop才能支持真机与虚拟机之间的文件拖拽等操作。


  • 编译boost

    ·

    发布于

    修改于

    • 最常用的两个编译命令
    1. b2 –toolset=msvc-14.2 –layout=versioned –build-type=complete variant=release link=static threading=multi runtime-link=static –address-model=32,64

    这个生成的是静态库,并且是静态链接到标准库,用于Release版本。

    1. b2 –toolset=msvc-14.2 –layout=versioned –build-type=complete variant=debug link=static threading=multi runtime-link=shared –address-model=32,64

    这个生成的也是静态库,但是是动态链接到标准库,用于Debug版本。

    • 参数具体含义
    1. –layout指定生成库的文件名 tagged不包含编译器信息和boost版本信息 versioned包含编译器信息和boost版本信息以上两者都会按照参数包含编译信息。
    2. –build-type=complete:编译所有库。
    3. install:表示需要将头文件拷贝到指定目录,如果使用stage代替install则不拷贝头文件,需要开发者自己到boost目录中去找。
    4. threading=multi:支持多线程, 生成的库文件名称中包含”-mt”标识。
    5. variant=release|debug debug:库文件名中包含”-gd”标识 release:库文件名中无特殊标识(不包含”-gd”)。
    6. runtime-link=shared|static static:生成的库文件名称包含”-s” shared:库文件名中无特殊标识(不包含”-s”)。
    7. msvc-14.2是vs2019,14.1是vs2017,msvc-14.1_xp是vs2017的xp编译模式(存疑)。
    8. –address-model=32,64 编译32和64位版本。
    9. –std=c++14是指定C++版本 //有可能是错的。


  • Ubuntu EFI模式安装

    ·

    发布于

    修改于

    总共分两步,都在磁盘配置界面中完成:

    1. 添加efi分区,大小100MB~200MB,另外使用其他分区工具也可以创建该分区,格式为FAT32;
    2. “安装启动引导器的设备”处选择这个efi分区。

    ubuntu efi


  • Google开源项目风格指南

    ·

    发布于

    修改于

    Google 经常会发布一些开源项目,意味着会接受来自其他代码贡献者的代码。但是如果代码贡献者的编程风格与 Google 的不一致,会给代码阅读者和其他代码提交这造成不小的困扰。Google 因此发布了这份自己的编程风格, 使所有提交代码的人都能获知 Google 的编程风格。包含C++、Objective-C、Python的相关规范。

    • 中文翻译版:

    http://zh-google-styleguide.readthedocs.org/en/latest/contents/

    • 英文原版:

    https://google.github.io/styleguide/cppguide.html


最新