关于免杀NOD32高启发式侦查

NOD32定位出来的特征码比较多,手动修改非常麻烦,如果时间不允许的情况下,可以使用比较生僻的加壳加密软件来处理一下,一般都能过!最常用的就是利用北斗加两次壳即可过NOD32! NOD32一般把特征码定位在输入表,输出表和节表三个地方,网上流传的过NOD32的方法是修改输入表,将函数名称用0填充然后在空白处加上被填充的函数名,再将IAT里函数对应的thunk值改到指向新的函数名称,这种方法固然改变了输入表,但并不能躲过NOD32的查杀,因为NOD32的查杀机制并不是直接读取特定位置比如函数名称位置的十六进制的值来比对,而是根据IAT表里的thunk值跟进到函数名称位置,然后再比对,应该比较容易理解。可以举个例子: 先看一下PE文件输入表部分结构 从PE头+0x80可以找到输入表的RVA,转化成对应文件偏移找到输入表位置 IMAGE_IMPORT_DESCRIPTOR 开始一般是各动态链接库DLL文件的名字字符串的RVA和First thunk值,准确点应该是 originalFirstThunk 该字段是指向一32位以00结束的RVA偏移地址串,此地址串中每个地址描述一个输入函数 TimeDateStamp 一个32位的时间标志,有特殊的用处 ForwarderChain 输入函数列表的32位索引 Name DLL文件名(一个以00结束的ASCII字符串)的32位RVA地址 FirstThunk 该字段是指向一32位以00结束的RVA偏移地址串,此地址串中每个地址描述一个输入函数,它在输入表中的顺序是可变的 引用看雪学院的一个例子吧 ------------------------------------------------------------------------------------------------------------------------------------------------------------ 0000C1E8h : 00 00 00 00 00 00 00 00 00 00 00 00 BA C2 00 00 ````````````---- 0000C1F8h : 38 C2 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ----```````````` 0000C208h : C5 C2 00 00 44 C2 00 00 00 00 00 00 00 00 00 00 --------```````` 0000C218h : 00 00 00 00 D2 C2 00 00 54 C2 00 00 00 00 00 00 ````--------```` 0000C228h : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ```````````````` 0000C238h : 7F 89 E7 77 4C BC E8 77 00 00 00 00 E6 9F F1 77 --------````---- 0000C248h : 1A 38 F1 77 10 40 F1 77 00 00 00 00 4F 1E D8 77 --------````---- 0000C258h : 00 00 00 00 00 00 4D 65 73 73 61 67 65 42 6F 78 ``````MessageBox 0000C268h : 41 00 00 00 77 73 70 72 69 6E 74 66 41 00 00 00 A```wsprintfA``` 0000C278h : 45 78 69 74 50 72 6F 63 65 73 73 00 00 00 4C 6F ExitProcess```Lo 0000C288h : 61 64 4C 69 62 72 61 72 79 41 00 00 00 00 47 65 adLibraryA````Ge 0000C298h : 74 50 72 6F 63 41 64 64 72 65 73 73 00 00 00 00 tProcAddress```` 0000C2A8h : 47 65 74 4F 70 65 6E 46 69 6C 65 4E 61 6D 65 41 GetOpenFileNameA 0000C2B8h : 00 00 55 53 45 52 33 32 2E 64 6C 6C 00 4B 45 52 ``USER32.dll`KER 0000C2C8h : 4E 45 4C 33 32 2E 64 6C 6C 00 63 6F 6D 64 6C 67 NEL32.dll`comdlg 0000C2D8h : 33 32 2E 64 6C 6C 00 00 00 00 00 00 00 00 00 00 32.dll`````````` 正如你看到的,这个输入表被分成三个主要部分: - C1E8h - C237h:IMAGE_IMPORT_DESCRIPTOR 结构部分,对应着每一个需要输入的动态 链接库(DLL)。这部分以关键字 00 结束。 IMAGE_IMPORT_DESCRIPTOR struct originalFirstThunk dd 0 ;原拆分 IAT 的 RVA TimeDateStamp dd 0 ;没有使用 ForwarderChain dd 0 ;没有使用 Name dd 0 ;DLL 名字符串的 RVA FirstThunk dd 0 ;IAT 部分的 RVA IMAGE_IMPORT_DESCRIPTOR ends - C238h - C25Bh:这部分双字(DWord) 称作“IAT”,由 IMAGE_IMPORT_DESCRIPTOR 结构中的 FirstThunk 部分指明。这部分每一个 DWord 对应一个输入函数。 - C25Ch - C2DDh : 这里是输入函数和 DLL 文件的名称。问题是,这些是没有规定顺序 的:有时候 DLL 文件在函数前面,有时候正好相反,另外一些时候它们混在一起。 ------------------------------------------------------------------------------------------------------------------------------------------------------------ 从C1E8到C1FB对应谝桓鯠LL文件 比如定位ExitProcess为特征码,NOD32是先读取OriginalFirstThunk、TimeDateStamp、ForwarderChain 均为0,DLL名称RVA为C2BA,First Thunk为C238,本来RVA要转化为文件偏移才能找到对应名称的,本例为求简单。两者设置成了相同的,至于如何转化可以参考网上其他文章。C2BA处为user.dll,C238处为第一个dll文件的各函数名称的RVA也就是thunk值,4个字节为一组,也就是32位为一组,可见user.dll有两个API,以0结尾,其余的类似。 理解以后就不难发现,NOD32注意的是函数的thunk,注意,不是thunk值,thunk是指根据First Thunk找到的指明各函数地址的地址,此地址的值即Thunk值则为各函数的地址,可以通过它找到函数名称,所以修改函数thunk也就是把函数转移到别的空白区域是没用的,照样被杀! 那该如何做呢?既然抓的是Thunk那我就把Thunk改掉,比如整个函数的所有thunk均前移一位,此时First Thunk也要修改,但经过测试修改后的文件运行会提示是无效的Windows映象,很是奇怪,还请高手赐教! 如果定位出了NOD32只是输入表有特征码可以用ASProtect加密IAT函数即可,手工修改的方法还在研究中,搞定以后会更新出来!个人不建议加2层北斗,第一加后容易文件损坏,第二加后本来过金山,卡巴的又会被杀(定位了加壳后的特征码)! 至于定位在输出表上还是可以手工修改过NOD的,简要介绍下,以灰鸽子的键盘记录插件为例,需要修改3-4处:删掉特征码,输出表把对应的比如PluginRun移到后面空白处,不过与之相关的也要修改掉,比如定义函数PluginRun位置的地方也要修改,还有比如定义函数名的地方,还有定义函数顺序的地方都要修改.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值