利用CreateRemoteThread向进程注入远程代码时,一般会有以下两种做法:

  1. 利用LoadLibrary在目标进程加载指定的DLL
  2. 将代码复制到目标进程,然后启动这段代码

上面的第二种方法其实在使用上更加灵活。因为借用该方法,我们可以灵活地自定义函数(以下简称为启动函数)的参数。其使用流程一般为:

  • 利用VirtualAllocEx / WriteProcessMemory 将启动函数的代码复制到目标进程
  • 利用VirtualAllocEx / WriteProcessMemory 将启动函数的参数复制到目标进程
  • 调用CreateRemoteThread (..., 启动函数指针, 参数指针...)来注入远程线程

在这种注入方式下,由于是将CODE直接从本进程(主调进程)注入到目标进程,因此这个函数的处理需要十分小心才是。

你必须要防止在启动函数代码中引用本进程的内部资源,便如.rdata段(比如常量定义),.text段(比如内部的函数)。

如果你没有遵守以上规则,那么启动函数被复制到目标进程并开始执行后,崩溃是必然的结果,因为这个代码引用的额外资源并不在目标进程中。

我在实际使用过程中就遇到了以下导致崩溃的问题:

在目标进程中用OD查看启动函数代码时,发现代码中被插入了security_cookie功能,其中包括了两个额外引用:

  1. mov eax, [security_cookie]
  2. call security_check_cookie

第一个引用实际上是引用了本地进程的rdata段

第二个引用实际上是引用了本地进程的text段

如果解决这个问题呢,实际上微软在MSDN中已经给出了答案,那就是在工程的编译选项中添加以下开关:

/GS-

这样就完全禁止了编译器对启动函数的Guard Stack功能,关于该编译选项可以参考:

http://msdn.microsoft.com/zh-cn/library/8dbf701c.aspx

 

C/C++ 编译器选项

-优化-

/O1 最小化空间                          /O2 最大化速度
/Ob 内联扩展(默认 n=0)               /Od 禁用优化(默认)
/Og 启用全局优化                        /Oi[-] 启用内部函数
/Os 优选代码空间                        /Ot 优选代码速度
/Ox 最大化优化                          /Oy[-] 启用帧指针省略

-代码生成-

/GF 启用只读字符串池                    /Gm[-] 启用最小重新生成
/Gy[-] 分隔链接器函数                   /GS[-] 启用安全检查
/GR[-] 启用 C++ RTTI                    /GX[-] 启用 C++ EH (与 /EHsc 相同)
/EHs 启用 C++ EH (没有 SEH 异常)        /EHa 启用 C++ EH (w/ SEH 异常)
/EHc 外部“C”默认为 nothrow           
/fp: 选择浮点模式:
    except[-] - 在生成代码时考虑浮点异常
    fast -“fast”浮点模式;结果可预测性比较低
    precise -“precise”浮点模式;结果可预测
    strict -“strict” 浮点模式(意味着 /fp:except)
即使使用 /fp:except,/Qfast_transcendentals 也生成内联内部 FP
/GL[-] 启用链接时代码生成               /GA 为 Windows 应用程序进行优化
/Ge 对所有函数强制堆栈检查              /Gs[num] 控制堆栈检查调用
/Gh 启用 _penter 函数调用               /GH 启用 _pexit 函数调用
/GT 生成纤程安全 TLS 访问               /RTC1 启用快速检查(/RTCsu)
/RTCc 转换为较小的类型检查              /RTCs 堆栈帧运行时检查
/RTCu 未初始化的局部用法检查           
/clr[:option] 为公共语言运行库编译,其中 option 是:
    pure - 生成只包含 IL 的输出文件(没有本机可执行代码)
    safe - 生成只包含 IL 的可验证输出文件
    oldSyntax - 接受 Visual C++ 2002/2003 的托管扩展语法
    initialAppDomain - 启用 Visual C++ 2002 的初始 AppDomain 行为
    noAssembly - 不产生程序集           /Gd __cdecl 调用约定
/Gr __fastcall 调用约定                 /Gz __stdcall 调用约定
/GZ 启用堆栈检查(/RTCs)                 /QIfist[-] 使用 FIST 而不是 ftol()
/hotpatch 确保可热修补映像的函数填充   
/arch: CPU 结构的最低要求,为以下内容之一:
    SSE - 启用支持 SSE 的 CPU 可用的指令
    SSE2 - 启用支持 SSE2 的 CPU 可用的指令
/Qimprecise_fwaits 仅在“try”边界上生成 FWAITs,而不是“try”内部

-输出文件-

/Fa[file] 命名程序集列表文件            /FA[scu] 配置程序集列表
/Fd[file] 命名 .PDB 文件                /Fe 命名可执行文件
/Fm[file] 命名映射文件                  /Fo 命名对象文件
/Fp 命名预编译头文件              /Fr[file] 命名源浏览器文件
/FR[file] 命名扩展 .SBR 文件           
/doc[file] 处理 XML 文档注释,并可选择命名 .xdc 文件

-预处理器-

/AI

添加到程序集搜索路径           /FU 强制使用程序集/模块
/C 不抽出注释                           /D{=|#} 定义宏
/E 将预处理定向到 stdout                /EP 预处理到标准输出,没有 #line
/P 预处理到文件                         /Fx 将插入的代码合并到文件中
/FI 命名强制包含文件              /U 移除预定义的宏
/u 移除所有预定义的宏                   /I

添加到包含搜索路径
/X 忽略“标准位置”

-语言-

/Zi 启用调试信息                        /Z7 启用旧式调试信息
/Zp[n] 在 n 字节边界上包装结构          /Za 禁用扩展
/Ze 启用扩展(默认)                      /Zl 忽略 .OBJ 中的默认库名
/Zg 生成函数原型                        /Zs 只进行语法检查
/vd{0|1|2} 禁用/启用 vtordisp           /vm 指向成员的指针类型
/Zc:arg1[,arg2] C++ 语言合规性,这里的参数可以是:
    forScope[-] - 对范围规则强制使用标准 C++
    wchar_t[-] - wchar_t 是本机类型,不是 typedef
/ZI 启用“编辑并继续”调试信息          /openmp 启用 OpenMP 2.0 语言扩展

- 杂项 -

@ 选项响应文件                    /?, /help 打印此帮助消息
/bigobj 生成扩展的对象格式              /c 只编译,不链接
/errorReport:option 将内部编译器错误报告给 Microsoft
    none - 不发送报告                       prompt - 提示立即发送报告
    queue - 在下一次管理员登录时,提示发送报告(默认)
    send - 自动发送报告                 /FC 诊断中使用完整路径名
/H 最大外部名称长度                /J 默认 char 类型是 unsigned
/MP[n] 最多使用“n”个进程进行编译      /nologo 取消显示版权消息
/showIncludes 显示包含文件名            /Tc 将文件编译为 .c
/Tp 将文件编译为 .cpp      /TC 将所有文件编译为 .c
/TP 将所有文件编译为 .cpp               /V 设置版本字符串
/w 禁用所有警告                         /wd 禁用警告 n
/we 将警告 n 视为错误                /wo 发出一次警告 n
/w 为 n 设置警告等级 1-4          /W 设置警告等级(默认 n=1)
/Wall 启用所有警告                      /WL 启用单行诊断
/WX 将警告视为错误                      /Yc[file] 创建 .PCH 文件
/Yd 将调试信息放在每个 .OBJ 中          /Yl[sym] 为调试库插入 .PCH 引用
/Yu[file] 使用 .PCH 文件                /Y- 禁用所有 PCH 选项
/Zm 最大内存分配(默认为 %)           /Wp64 启用 64 位端口定位警告

-链接-

/LD 创建 .DLL                           /LDd 创建 .DLL 调试库
/LN 创建 .netmodule                     /F 设置堆栈大小
/link [链接器选项和库]                  /MD 与 MSVCRT.LIB 链接
/MT 与 LIBCMT.LIB 链接                  /MDd 与 MSVCRTD.LIB 调试库链接
/MTd 与 LIBCMTD.LIB 调试库链接

-代码分析-

/analyze[:WX-] 启用代码分析            
    WX- - 即使调用了 /WX,也不应将代码分析警告视为错误

关闭GS选项,解决注入后崩溃的更多相关文章

  1. 解决关闭app权限弹框后无法识别页面对象问题

    在使用appium进行安卓端app的自动化测试,我碰到这样下面这几个问题: 1.每次启动我的待测app时总会提示app权限 2.关闭完权限后,无法识别页面对象 第一个问题的解决,我更换不同的真机进行测 ...

  2. [系统软件]Ubuntu 18.04中的Shutter禁用了“编辑”选项解决

    本文引用自linux公社, 原文请点击 : https://www.linuxidc.com/Linux/2018-04/151911.htm   在Ubuntu 18.04中安装了我最喜欢的截图工具 ...

  3. MacOS 10.12 Sierra 安全性与隐私没有任何来源选项解决方法

    MacOS 10.12 Sierra 安全性与隐私没有任何来源选项解决方法 来源: 时间:2016年09月21日 在升级了macOS Sierra (10.12)版本后在“安全性与隐私”中不再有“任何 ...

  4. eclipse 导出Runnable JAR file ,双击无法执行原因与解决 双击后闪退的原因 批处理java打包文件 @echo off start javaw -jar *.jar

    eclipse 导出Runnable JAR file 导出后如果系统没有JRE,双击无法运行,需要用命令方法 安装后解决,如图 双击后闪退的原因,通过执行 java -jar TingGe.jar ...

  5. c# 基础连接已经关闭: 连接被意外关闭,错误的解决

    原文:c# 基础连接已经关闭: 连接被意外关闭,错误的解决 调试一个使用HttpWebRequest模拟提交表单的程序的时候频繁出现上述错误提示,google了一下发现了几个解决方案.1.在appli ...

  6. android动画特效之解决解决移动后闪烁现象,解决输入法弹出后位置回复原状,解决两个动画叠加

    以下代码实现的效果是: BoundOpenView从居中移动到顶部,移动完后,BoundSendView从隐藏变为显示,并从顶部移动BoundOpenView下方20dp处,同时透明度慢慢增加. pr ...

  7. 转载: Centos7 升级python3,解决升级后不兼容问题

    Centos7配置更新国内yum源 http://blog.csdn.net/qingguiyu/article/details/50721956 Centos7 升级python3,解决升级后不兼容 ...

  8. win7或win2008系统中,出现【已停止工作,联机检查解决方案并关闭该程序,关闭程序】解决方法!

    win7或win2008系统中,出现[已停止工作,联机检查解决方案并关闭该程序,关闭程序]解决方法! 经过摸索,点击[控制面板]-[操作中心]-[更改操作中心设置]-[问题报告设置]-[从不检查解决方 ...

  9. linux中如何解决克隆后的电脑的问题

    1.如何解决克隆后的电脑的网络问题 克隆出来的电脑,IP地址,网卡都是重复的,不能直接使用,需要修改 1)vim  /etc/udev/rules.d/70-persistent-net.rules ...

随机推荐

  1. 51nod 1120 机器人走方格 V3 卡特兰数 lucas定理

    N * N的方格,从左上到右下画一条线.一个机器人从左上走到右下,只能向右或向下走.并要求只能在这条线的上面或下面走,不能穿越这条线,有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 100 ...

  2. CF109 C. Lucky Tree 并查集

    Petya loves lucky numbers. We all know that lucky numbers are the positive integers whose decimal re ...

  3. CF 486D vailid set 树形DP

    As you know, an undirected connected graph with n nodes and n - 1 edges is called a tree. You are gi ...

  4. Tornado (and Twisted) in the age of asyncio》

    Tornado (and Twisted) in the age of asyncio>

  5. 转--简单工厂模式 Simple Factory

    简单工厂模式的作用就是定义一个用于创建对象的接口 在简单工厂模式中,一个工厂类处于对产品类实例化调用的中心位置上,它决定那一个产品类应当被实例化.         先来看看它的组成: 1) 工厂类角色 ...

  6. 解决CI框架的Disallowed Key Characters错误提示

    用CI框架时,有时候会遇到这么一个问题,打开网页,只显示 Disallowed Key Characters 错误提示.有人说 url 里有非法字符.但是确定 url 是纯英文的,问题还是出来了.但清 ...

  7. oracle常用的数据迁移方法

    源地址:http://wenku.baidu.com/link?url=lI6UYpvDs_y8ku6DytEZLl4GSJjQ0GAGPvv8txrbRoQKgqzTCMAfBZI5mn9t-KQk ...

  8. 服务器网页GZIP压缩怎么配置

    服务器网页GZIP压缩怎么配置     服务器网页GZIP压缩怎么配置,GZIP压缩对网页压缩来说最好不过了,下面是IIS下Gzip配置详细操作步骤:     简单来说,IIS6集成了Gzip,只不过 ...

  9. Replace JSON.NET with ServiceStack.Text in ASP.NET Web API

    Because ServiceStack.Text performs much better I recently stumbled across a comparison of JSON seria ...

  10. C++学习22 多态的概念及前提条件

    在<C++基类和派生类的赋值>一节中讲到,基类的指针也可以指向派生类对象.请看下面的例子: #include <iostream> using namespace std; c ...