vc6 调试 附加到进程 列表空_远程进程Shellcode注入调试技巧

在病毒分析的过程中,时常会遇到很多病毒为了躲避杀软的检测,使用进程注入的方式,将shellcode注入到系统进程中执行,本文将介绍一些在遇到shellcode注入进程时所使用的调试技巧。 

情形一:PE进程远程注入shellcode到其它进程

PE类文件在进行进程注入的时候,可能会注入一个PE文件,也有可能是注入一段shellcode,但注入的流程通常是一样的。

注入已有进程:

OpenProcess —> WriteProcessMemory —> CreateRemoteThread;

创建进程注入:

CreateProcess —> WriteProcessMemory —> GetThreadContext —> SetThreadContext —> ResumeThread;

上面一种是注入已有进程,下面一种是自己创建一个进程进行注入,不过需要关注的点是一样的,就是远程线程启动时的context(上下文)。

如果是遇到CreateRemoteThread的情况,就比较直观,只要直接找到该函数的第四个参数lpStartAddress,就是我们要找的context值,下图是一个示例:

4760b85b31a6f4cb114058fbb9e8f840.png

如果是遇到ResumeThread情形,就稍稍麻烦一些,需要先查看GetThreadContext的第二个参数lpContext,获取到的进程上下文会放在该指针结构中,然后代码对其中的地址值进行修改,再调用SetThreadContext:

b3f9c06d7f95f7cc53bd854900d511b5.png

找到上下文地址后,只需要断在CreateRemoteThread或ResumeThread函数上,使用WinHex打开程序要注入的进程,将该上下文地址处的代码修改为JMP到当前地址(或0xCC,此处可以发散一下,只要是能够想办法断下来即可),再单步步过(F8)CreateRemoteThread/ResumeThread,使用OD附加到注入的进程,断在上下文地址处,再将代码修改回原来的代码即可继续执行。

情形二:脚本病毒/宏病毒远程注入shellcode到其它进程

脚本病毒/宏病毒注入shellcode时所使用的函数与PE类略有不同,下面以一个宏病毒的分析过程为例来进行说明。

调试宏代码,该样本的宏代码没有经过混淆,可以清晰的看到其将shellcode硬编码赋值给一个数组,这里的数据长这样:

516096f3993242d09e00e22f52318b69.png

需要把它转化成C++能够认识的类型,不过别着急,先继续往下看,代码创建了一个rundll32.exe进程并挂起,然后申请一块shellcode长度大小内存,依次将数据写入进程内存,最后启动进程:

9ed926b30aecd953ea8dbc51947d7360.png

这里需要关注的函数是最后用来启动进程的CreateStuff,这个函数是前面代码自定义的函数,对应是CreateRemoteThread:

Private Declare Function CreateStuff Lib "kernel32" Alias "CreateRemoteThread" (ByVal hProcess As Long, ByVal lpThreadAttributes As Long, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Long, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long

再看函数参数:

CreateStuff(pInfo.hProcess, 0, 0, rwxpage, 0, 0, 0)

pInfo.hProcess是进程句柄,rwxpage是启动进程需要给出执行的上下文,于是在这一条语句下个断点,print一下rwxpage参数的值:

b7715fedd45af696e324b5cc0c3a166c.png

589824,转换成十六进制为0x90000,应该就是要找的上下文地址,接下来就是到进程内存中去找到这一段数据了,使用WinHex打开对应进程的内存,找到0x90000这个地址:

56d7929093f5c351163714f687f058df.png

可以看到这一段数据中有明文显示的可疑字符串了,看起来像是网络连接相关的,到这一步就要想办法来调试这段shellcode,这里有两种调试的思路。

思路一:像调试PE类注入那样,把执行上下文地址处的代码修改为0xCC或jmp当前地址的代码:

90f186855f52155809935011d754c85f.png

如果修改为0xCC,需要注意,应该把调试器的实时调试设置选成“附加前无需确认”,这样进程启动后才会自动附加到OD进行调试(记得将内存修改回原值,如果没有自动附加,就手动附加一下进程):

4a3e0da0dc53e55d8543d9f438f905d5.png

如果修改成jmp当前地址,那么需要手动打开OD,选择要附加的进程,然后跳转到执行上下文的地址下断点,断下来后把内存地址修改为原值,再继续调试:

4f77a13eb35d64abb9fa6a1f359bbb62.png

思路二:在WinHex中找到这段shellcode后,将其选中,右键->Edit->Copy Block->C Source,这样就能将数据拷贝成C++能够识别的形式:

dec9b6ed35c36728f86a9168c973264d.png

然后用Visual studio新建一个C++控制台应用项目,定义一个数组,内容为我们拷贝的C Source数据:

c2c33e8391deb03aa44dfb1705112615.png

然后在main函数中定义函数指针指向shellcode的首地址,然后调用这个shellcode首地址的这个函数,读起来很绕,但实际上一条指令就能够完成:

9eca6d57a2b93c366804cfc56f5460db.png

当然,这里的写法并不局限于一种,只要理解其中的原理即可。随后生成Release版的EXE文件,就能够使用OD或IDA对shellcode进行分析了,用IDA加载出来的Main函数如下:

5408b4554e9104089802ca3c446f444d.png

本文使用了几个示例,讲解了在恶意代码分析过程中遇到远程进程注入时的一些调试方法,虽然调试技巧有很多种,但万变不离其宗,在调试过程中可以根据自己的需要选择不同的调试思路,也可以根据原理开发一些工具,如shellcode生成EXE文件工具等。

*本文作者:深信服千里目安全实验室,转载须注明来自FreeBuf.COM

653c2e061a6a35a607f0d8acd3cd998c.gif

精彩推荐

065b241feee2aec388e4544d0a519f4e.png

aba5825db25d080b210712fbd2c838e1.png

3609c7a2602865f06d71b7030c019678.png

47271a4cab0eb188a65b18c1f28e4837.png

28c25ef3371c8d3a67d303550c2b05f0.png6353eb42c6e19f743ec8fa4f4fcf96be.gifebd0600144abdc8bfe371c1a685d7c91.gif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值