在 Windows 调试一些程序的时候,有可能会遇到程序本身编译为始终以管理员身份运行的。而这些程序在拿到管理员身份的时候会启动一些保护以检测自己是否被调试注入等等。

而我们不希望这些程序以管理员身份启动。

如果是直接启动该程序,我们可以使用命令:

cmd /min /C "set __COMPAT_LAYER=RUNASINVOKER && start "" "(your app path)"

替换 (your app path) 部分为你们的程序路径

如果经常需要使用的话,还可以把该命令集成到 Windows 右键菜单里,通过注册表

RunWithoutPrivilegeElevation.reg

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\Run Without Privilege Elevation]
@="Run Without Privilege Elevation"

[HKEY_CLASSES_ROOT\*\shell\Run Without Privilege Elevation\command]
@="cmd /min /C \"set __COMPAT_LAYER=RUNASINVOKER && start \"\" \"%1\"\""

点我下载:RunWithoutPrivilegeElevation.reg

但有时该程序是被另外的程序启动的,这时我们就无法执行命令来启动了。 不过不用担心,Windows 还给了我们另外的方案

为程序设置 Compatibility Flags

DisableAppRunAsAdministrator.reg

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
"(your app path)"="RunAsInvoker"

替换 (your app path) 部分为你们的程序路径

设置好后,无论是谁启动的该程序,程序都无法以最高的管理员身份运行了。

在 Windows 里 DLL 卸载自身模块是无法通过字节调用 FreeLibrary 自己来实现的。

原因分析

在当前线程中调用 FreeLibrary 后,当前模块就会立即被释放掉,而当前线程还没有运行结束。所以程序就运行到了一块不可访问的内存里,产生异常从而导致程序崩溃。

解决方案

Windows 里面 提供了一条可以用来释放自身模块的函数 FreeLibraryAndExitThread 可以释放自身。

函数

VOID WINAPI FreeLibraryAndExitThread(_In_ HMODULE hLibModule, _In_ DWORD dwExitCode)

在升级win8.1之后,重新安装的Git虽然可以正常使用 但遇到https时会报“Unable to find remote helper for ‘https’”的错误

网络搜索了许久未果,于是自己研究

  1. 检查安装的文件 结果:所有文件均完整

  2. 检查文件的访问权限 结果:所有文件当前用户均可访问

  3. 为调用的git等exe文件授予管理员运行权限 结果:问题依旧存在

挣扎了半天,尝试重装解决。

在重装的时候选择了 管理员权限运行 结果意外的发现重装后,https可以正常使用了。

至此问题解决。