freesoft00
freesoft00当前离线
UID
129513
在线时间
490 小时
帖子
1290
积分
2589
技术
0
魅力
0
人气
21
活力
1202
性别
保密
经验
2589
阅读权限
30
最后登录
2012-6-29
主题
57
精华
0

卡饭_见习写手

距离下一级还需 411 积分
积分
2589
技术
0
魅力
0
人气
21
注册时间
2006-12-7
  • 加好友
  • 发消息
2009-4-11 12:02:23 |显示全部楼层
原帖是在剑盟看到轩辕小聪发的,转过来。

无聊写个示例程序,改自身PEB欺骗SREng无聊之中想到自己很久前用Delphi做过的类型的玩意,现在简化成汇编做个示例。

复制内容到剪贴板 代码:.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
include \masm32\Macros\Strings.mac

.data
CCOUNTED_UNICODE_STRING        "svchost.exe", lpsname, 4
CCOUNTED_UNICODE_STRING        "C:\\WINDOWS\\system32\\svchost.exe", lpfname, 4

.code
Start        proc uses esi edi ebx
assume        fs:nothing
xor        eax, eax
mov        eax, fs:[eax+18h]
mov        eax, [eax+30h]
mov        ebx, [eax+10h]
lea        edi, [ebx+38h]
lea        esi, offset lpfname
push        esi
movsd
movsd
pop        esi
movsd
movsd
mov        eax, [eax+0Ch]
mov        eax, [eax+0Ch]
lea        edi, [eax+2Ch]
lea        esi, offset lpsname
movsd
movsd
lea        edi, [eax+24h]
lea        esi, offset lpfname
movsd
movsd
sleeploop:
invoke        Sleep,7D0h
jmp        sleeploop
ret
Start endp

end Start
include中的String.mac来自KmdKit。
程序原理就是修改PEB中有关自身文件名的UNICODE_STRING字符串。后面的Sleep死循环完全是为了让程序不退出,可以观察效果,试验完后直接结束进程即可。
由于PEB结构偏移声明比较罗嗦,这里直接硬编码了,不明白的自己在WINDBG下查。

[ 本帖最后由 freesoft00 于 2009-4-11 16:26 编辑 ]

附件: 你需要登录才可以下载或查看附件。没有帐号?注册卡饭

 
 

举报

   
freesoft00
freesoft00当前离线
UID
129513
在线时间
490 小时
帖子
1290
积分
2589
技术
0
魅力
0
人气
21
活力
1202
性别
保密
经验
2589
阅读权限
30
最后登录
2012-6-29
主题
57
精华
0

卡饭_见习写手

距离下一级还需 411 积分
积分
2589
技术
0
魅力
0
人气
21
注册时间
2006-12-7
  • 加好友
  • 发消息
2009-4-11 12:04:01 |显示全部楼层
关注卡饭腾讯微博 -关注卡饭新浪微博
调用ZwQueryVirtualMemory遍历进程模块示例(更新)昨天发了个改自身PEB欺骗SREng的示例,本来只是纯属自娱自乐,结果大家的反馈让我大吃一惊,原来有这么多Ring3甚至Ring0的程序,在获取进程模块全文件名时都偷懒了,这实在令人大感意外。
也许大家都觉得,隐藏进程和检测隐藏进程才是王道,却没有注意到,恶意软件进程有时根本不需要隐藏,只要能给自己披上一个伪装,让安全软件把它的进程当成是正常的,就足够了。在现今杀毒软件普遍搞主动防御的情况下,这种情况更为明显。HIPS对恶意软件的行为,不是拦截不住,而是因为它“看起来正常”,而被放过了。我昨天发那个示例,其实本来就是想要让大家意识到这一点。
不过无论如何,还得自己收尾,Ring3情况下怎么对付这种伎俩?学IceSword,ZwQueryVirtualMemory。只不过IceSword是在驱动层调用(ntoskrnl.exe没有导出,要自己从SSDT中找地址),其实Ring3情况下也可以调用的。

因此我今天再给一个示例,可以把之前发的PEB.exe的真身给揭发出来。

一直只知道IceSword(以及看雪论坛上开源的山寨版IceSword)是用ZwQueryVirtualMemory来遍历进程的虚拟内存,从而得到加载的模块的,不过从来没有自己试过。
看了山寨版IceSword相关代码,原来是在Ring3中实现的,就想自己动手整一整,结果发现原来不是那么难。于是用汇编写了个Win32控制台程序来做演示。
基本原理不复杂,倒是细枝末节耗去很多时间。

首先我是以区段内存对齐的单位0x1000字节进行遍历,这样会出现多个区段属于同一个文件。这样我使用两次调用ZwQueryVirtualMemory:
第一次使用参数MemoryBasicInformation,判断传回的MEMORY_BASIC_INFORMATION结构中的AllocationBase字段值与传入的Base是否相等,相等则说明这是文件的第一个区段,这时才进行第二次调用;
第二次使用参数MemorySectionName,获得区段文件名。
山寨版IceSword使用的是0x10000字节为间隔,似乎就避免了这个麻烦,而且也不会漏掉模块。

第一次写Win32控制台程序,也是第一次用msvcrt.dll中的函数(由masm32rt.inc中封装)做字符串处理,发现自己这一块居然超不熟,耗费了不少时间。

其实说原创也不是太合适了,因为参考了一些网上的代码,比如山寨版IceSword,还有提SeDebugPrivilege的那部分也是直接拿的网上的代码(其实只要不是访问系统进程,提权不是必须的)。

代码写得比较挫,又一次证实了自己在Win32汇编这块还很菜……

调用方法:把进程ID作为命令行参数传入,如Query.exe 1000

update:这帖发看雪之后,引来几位牛人回帖,也算值了
如海风月影回帖指出不支持非本地磁盘盘符解析的毛病,这个是我之前偷懒了。

看了看雪上的回帖之后又修改了一下,主要是在盘符转换方面不再偷懒,现在应该可以支持非本地磁盘了。
对这个功能,发现KsBinSword好像没有做?
网上搜索发现QueryDosDevice,但据说没有功能反过来的,这样只能先对A-Z的盘符调用QueryDosDevice,把结果保存起来,然后需要转换的时候再跟全文件名比对。

另外调试了一下ZwQueryVirtualMemory的调用,因为我很在意那几个nls文件,记得好像说是内核创建进程过程中将其映射的。想看看怎么把它们跟后面的Module区分开来。
发现这几个nls映像头部的AllocationProtect都有PAGE_EXECUTE属性,而其他各个exe和dll的映像头部的AllocationProtect属性没有PAGE_EXECUTE,但两者当前的Protect属性都有PAGE_EXECUTE。
因此加了几行代码来做检测,在原文中被注释掉了,如果把注释掉的还原,则显示出来的模块中不包括nls文件。 复制内容到剪贴板
代码:;===============================================================================
;use ZwQueryVirtualMemory to enum Modules of a process
;subsystem:console
;OS Platform:tested on Windows XP Professional simplified with Service Pack 3
;轩辕小聪 http://hi.baidu.com/yicong2007
;
;release notes:
;
;2009.04.06
;改写ConvertDeviceStr函数,实现DosDevice与盘符的转换,以支持非本地磁盘盘符的获取。
;遍历时只对具有PAGE_EXECUTE属性的内存查找MemorySectionName。
;如将被注释掉的三处代码还原,可过滤掉nls文件的显示,但不知这样是否会漏掉模块。
;
;2009.04.05
;第一个版本
;
;===============================================================================
include \masm32\include\masm32rt.inc
include \masm32\include\w2k\native.inc
includelib \masm32\lib\masm32.lib
include \masm32\macros\macros.asm
include \masm32\include\advapi32.inc
includelib \masm32\lib\advapi32.lib

.data
PID dd 0
Base dd 0
hProcess dd 0
DataLength dd 0
lpszPID db 120 dup(0)
lpoutdata db 300h dup(0)
lpFileName db 120h dup(0)
lpDeviceList dd 26d dup(0)
lpListBuffer db MAX_PATH*26d dup(0)
.code

CreateDeviceList proto

CreateDeviceList proc uses esi edi ebx
        local        VolNum
        local        i

mov        VolNum, 3A41h
        mov        i, 0
        mov        esi, offset lpListBuffer
        mov        edi, offset lpDeviceList
        .repeat
                invoke        QueryDosDevice, addr VolNum, esi, MAX_PATH
                .if        eax!=0
                        mov        [edi], esi
                        xor        eax, eax
                        mov        byte ptr [esi+MAX_PATH-1], al
                .endif        
                lea        esi, [esi+MAX_PATH]
                lea        edi, [edi+4]
                add        VolNum, 1
                add        i, 1
        .until        i == 26d        
        mov        eax, 1
        ret        
CreateDeviceList endp

ConvertDeviceStr proto :DWORD, :DWORD

;=====================================================
;把得到的文件名中的盘符翻成平常的C、D……并将字符串改
;成输出所需的格式
;=====================================================
ConvertDeviceStr proc uses esi edi ebx lpSource:DWORD, ImageBase:DWORD

local        VolNum
        local        lptmp[MAX_PATH]:byte
        local        i
        local        match

lea        edi, lptmp
        xor        eax, eax
        mov        i, eax
        mov        match, eax
        mov        ecx, MAX_PATH
        rep        stosb
        mov        VolNum, 41h
        mov        esi, offset lpDeviceList

.repeat
                mov        edi, [esi]
                .if        edi!=0
                        invoke        crt_strstr, lpSource, edi
                        .if        eax==lpSource
                                mov        match, 1
                                .break
                        .endif        
                .endif        
                add        esi, 4
                add        VolNum, 1
                add        i, 1
        .until        i==26d

.if        match==0
                invoke        crt_strncpy, addr lptmp, lpSource, MAX_PATH
        .else        
                invoke        crt_strlen, edi
                mov        esi, lpSource
                lea        esi, [esi+eax]
                invoke        crt_sprintf, addr lptmp, CTXT('%s:%s'), addr VolNum, esi
        .endif        
        invoke        crt_sprintf, lpSource, CTXT('%08X   %s',0dh,0ah), ImageBase, addr lptmp
        ret
                        
ConvertDeviceStr endp

DebugPrivilege   PROTO :DWORD

;=====================================================
;提SeDebugPrivilege,copy from network
;=====================================================

DebugPrivilege    proc uses esi edi ebx dwEnbled

local        hToken
        local        tmpLuid:LUID,tkp:TOKEN_PRIVILEGES
   
        invoke        GetCurrentProcess
        lea        ebx,hToken
        invoke        OpenProcessToken, eax, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, ebx
        invoke        LookupPrivilegeValue, NULL, CTXT('SeDebugPrivilege'), addr tmpLuid
        mov        tkp.PrivilegeCount,1
        push        tmpLuid.LowPart
        pop        tkp.Privileges[0].Luid.LowPart
        push        tmpLuid.HighPart
        pop        tkp.Privileges[0].Luid.HighPart
        .if        dwEnbled
                mov        tkp.Privileges[0].Attributes, SE_PRIVILEGE_ENABLED
        .else        
                mov        tkp.Privileges[0].Attributes,NULL
        .endif        
        invoke        AdjustTokenPrivileges, hToken, FALSE, addr tkp, sizeof TOKEN_PRIVILEGES, NULL, NULL
        invoke        GetLastError
        .if        eax == ERROR_SUCCESS
                push        TRUE
        .else        
                push        FALSE
        .endif               
        invoke        CloseHandle,hToken
        pop        eax
        ret
        
DebugPrivilege    endp

Start        proc uses esi edi ebx

invoke        GetCL, 1, offset lpszPID        
        invoke        crt_sscanf, offset lpszPID, CTXT('%d'), offset PID
        .if        PID==0
                invoke        StdOut, CTXT('Invaild PID.')
                ret        
        .endif        
        invoke        DebugPrivilege, 1
        .if        eax==FALSE
                invoke        StdOut, CTXT('Enable SeDebugPrivilege failed.')
                ret
        .endif        
        invoke        OpenProcess, PROCESS_QUERY_INFORMATION, 0, PID
        .if        eax==0
                invoke        StdOut, CTXT('OpenProcess failed.')
                ret
        .endif        
        mov        hProcess, eax
        invoke        GetModuleHandle, CTXT('ntdll.dll')
        mov        esi, eax
        invoke        GetProcAddress, esi, CTXT('ZwQueryVirtualMemory')
        mov        edi, eax
        invoke        StdOut, CTXT('ModuleBase ImageFileName',0dh,0ah)
        invoke        CreateDeviceList
        .repeat        
                push        offset DataLength
                push        300h
                push        offset lpoutdata
                push        MemoryBasicInformation
                push        Base
                push        hProcess
                call        edi
                mov        esi, offset lpoutdata
                assume        esi:ptr MEMORY_BASIC_INFORMATION
                ;mov        ebx, [esi].AllocationProtect
                ;and        ebx, WSLE_PAGE_EXECUTE
                mov        ecx, [esi].Protect
                and        ecx, WSLE_PAGE_EXECUTE
                mov        esi, [esi].AllocationBase
                assume        esi:nothing
                .if        eax==0 && esi==Base && ecx!=0 ;&& ebx==0               
                        push        offset DataLength
                        push        300h
                        push        offset lpoutdata
                        push        MemorySectionName
                        push        Base
                        push        hProcess
                        call        edi        
                        .if        eax==0
                                mov        esi, offset lpoutdata
                                assume        esi:ptr MEMORY_SECTION_NAME
                                movzx        eax, [esi].SectionFileName._Length
                                .if        eax!=0
                                        mov        esi, [esi].SectionFileName.Buffer
                                        assume        esi:nothing
                                        invoke        crt_sprintf, offset lpFileName, CTXT('%ws'),esi
                                        invoke        ConvertDeviceStr, offset lpFileName, Base
                                        invoke        StdOut, offset lpFileName
                                .endif                                       
                        .endif
                .endif        
                mov        eax, Base
                add        eax, 1000h
                mov        Base, eax
        .until        Base==80000000h
        ret

Start endp

end Start

[ 本帖最后由 freesoft00 于 2009-4-11 16:26 编辑 ]

无聊写个示例程序,改自身PEB欺骗SREng相关推荐

  1. 无聊写个小程序╮(╯▽╰)╭

    一瓶可乐一块钱,两个可乐瓶可换一瓶可乐,三个可乐瓶盖可换一瓶可乐,你用20块可以喝到几瓶可乐 #include<stdio.h> #include<stdlib.h> #inc ...

  2. python推荐系统-用python写个简单的推荐系统示例程序

    用python写个简单的推荐系统示例程序 作者:阿俊 发布于:2011-11-26 16:03 Saturday 分类:推荐系统 python这门语言写程序代码量非常少,短短几行就可以把程序写的很清楚 ...

  3. FFmpeg示例程序合集-批量编译脚本

    此前做了一系列有关FFmpeg的示例程序,组成了< 最简单的FFmpeg示例程序合集>,其中包含了如下项目: simplest ffmpeg player:                 ...

  4. 不要困在自己建造的盒子里——写给.NET程序员(附精彩评论)

    此文章的主旨是希望过于专注.NET程序员在做好工作.写好.NET程序的同时,能分拨出一点时间接触一下.NET之外的东西(例如10%-20%的时间),而不是鼓动大家什么都去学最后什么都学不精,更不是说. ...

  5. 示例程序 示例一、由 CLSID 得到 ProgID......

    五.示例程序 示例一.由 CLSID 得到 ProgID.(程序以 word 为例子.如果运行不正确,嘿嘿,你没有安装 word 吧?) ::CoInitialize( NULL );HRESULT ...

  6. android程序开发实例,Android示例程序剖析之LunarLander游戏

    前面有几篇文章写的是对Android示例程序贪吃蛇Snake程序的剖析,本文继续分析Android自带的另一个小游戏LunarLander的程序.在贪吃蛇Snake程序中采用了"定时器+系统 ...

  7. 【小程序websocket前后端交互】uniapp写微信小程序聊天功能功能,websocket交互功能,心跳重连【详细注释,复制即用】

    前言 这几天在做的一个需求,就是要写一个小程序端的页面,用于跟客服聊天. 然后就用到了websocket技术,以前我做过网页版的,但是做小程序后发现网页版的逻辑放过来没问题,但是很多的方法和api是不 ...

  8. Windows下运行Fast DDS示例程序(包含.idl文件的使用方法)

    本文默认以二进制方式安装好了 Fast DDS(安装包可以从官网获取,建议使用下载工具提速).运行环境是Windows. 本文介绍了两种方法,一种是直接编译运行,另一种是从.idl文件编译运行. 准备 ...

  9. mapreduce编程实例python-使用Python语言写Hadoop MapReduce程序

    原标题:使用Python语言写Hadoop MapReduce程序 Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 在本教程中,我将描述如何使用Pytho ...

  10. MxGraph从入门到精通之1:运行HelloWorld示例程序

    简介 MxGraph包括了一个JavaScript编写的客户端软件,以及一系列各个语言写的后端. 客户端是一个图形组件,它需要一个web服务器把相关的文件传给客户端或者直接从本地文件系统运行起来(如下 ...

最新文章

  1. [洛谷3811]【模板】乘法逆元
  2. 腾讯应用宝采集数据分析
  3. SAP系统和微信集成的系列教程之三:微信用户关注公众号之后,自动在SAP C4C系统创建客户主数据
  4. Objective-C 的 self 和 super 详解
  5. [转载]QMessageBox 用法
  6. Linux系统编程 -- 为什么需要进程间通信??
  7. oracle替换表空间,Oracle替换临时表空间
  8. 从腾讯外包月薪5K到转岗正式员工月薪15K,这178天的心酸只有自己知道...
  9. 大学英语(第四册)复习(原文及全文翻译)——Unit 5 - TO LIE OR NOT TOLIE—THE DOCTOR‘S DILEMMA(撒谎还是不撒谎——医生的难题)
  10. Cookie和Session的作用,区别和各自的应用范围,cookie、Session工作原理
  11. matlab高斯正反算程序6,基于matlab的高斯投影正反算与相邻带坐标换算程序设计...
  12. android 蓝牙相关的类,Android中BluetoothAdapter类简介
  13. HTTP协议状态码的含义
  14. Numpy中一维数组的shape如何理解
  15. 今天不小心跳着看了黑镜第一季三集
  16. 签名MD5与文件MD5概念
  17. 落实“两高”联合发布《关于办理商业贿赂刑事案件适用法律若干问题的意见》的措施
  18. 计算机网络练习题(应用层)
  19. IT华人在硅谷的一天
  20. 一款实现浏览实事的资讯平台app

热门文章

  1. ubuntu18.04安装网卡驱动
  2. Java面试--观察者模式
  3. android screenshot流程,APP中,Screenshot的设计要领和各发布渠道的要求
  4. 在VB语言中,DOEVENTS的具体的用法和含义
  5. 分享一个完全免费的高质量 PPT 模板下载网站
  6. cad角度怎么画_初学入门CAD,就这样成精了!
  7. 网络邻居上的计算机没权限,WinXP打开网上邻居提示“您可能没有权限使用网络资源”怎么办?...
  8. 智能数据中心和智慧园区:华为的单点突破与全局效应
  9. 关于三极管的理解---根据IC符号简易迅速判断三极管导通情况
  10. 用Python做一个证件照制作器