首页
社区
课程
招聘
使用
雪    币: 211
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
四个螳螂 1 2007-9-1 00:53
0
第二阶段第二题目答案
下面是13个不同方法:

4.RemoteExitProcess,以 PROCESS_CREATE_THREAD|VM_OPERATION方式打开进程,然后创建个远程线程,线程开始地址是 ExitProcess 参数0 ,程序自行了断.

5.首先确保进程能被打开(8和9介绍),然后创建一个线程去 DebugActiveProcess 他,然后什么也不做退出线程,程序无人接管,于是挂掉~

6.以 VM_OPERATION方式打开进程, 然后调用 NtUnmapViewOfSection 卸载掉他的ntdll.dll 这个时候程序还未崩溃,然后再随意发送个消息给它,它的程序一经调用直接就会异常,但是ntdll已经挂掉,无法用户空间异常处理,自行了断~(我认为这个方法应和往进程空间写垃圾数据属于同一方法)

7.发送键盘 ESC 单击的消息(这个和发送窗口消息不能算同一个的).

8.下面是重点要介绍的:-----------------------------
由于CrackMeApp打开了驱动的文件句柄,所以直接不能卸载驱动的.因此需要把这个句柄给关闭.
于是怎么去获取远程的文件句柄呢?首先想到的是 DuplicateHandle ,
BOOL DuplicateHandle(
  HANDLE hSourceProcessHandle,  // handle to source process
  HANDLE hSourceHandle,         // handle to duplicate
  HANDLE hTargetProcessHandle,  // handle to target process
  LPHANDLE lpTargetHandle,      // duplicate handle
  DWORD dwDesiredAccess,        // requested access
  BOOL bInheritHandle,          // handle inheritance option
  DWORD dwOptions               // optional actions
);

先看最后一个参数:
DUPLICATE_CLOSE_SOURCE
Closes the source handle. This occurs regardless of any error status returned.
DUPLICATE_SAME_ACCESS
Ignores the dwDesiredAccess parameter. The duplicate handle has the same access as the source handle.

也就是说当我们选择DUPLICATE_CLOSE_SOURCE时,远程的句柄就会自动关闭了

第一个参数,我们可以直接OpenProcess(PROCESS_DUP_HANDLE ,XXX)获得,
第二个参数比较难找,就是CrackMeApp进程里打开驱动的句柄,要想获得这个我们得借助个ntdll.dll中的一个API, ZwQuerySystemInformation 这个可以获得整个系统中所有的句柄信息,我们可以全部找出来,然后判断哪些句柄是属于CrackMeApp进程的,并且ObjectTypeNumber类型为文件类型的.关于这个的具体实现可以看我的实现代码.

typedef struct _SYSTEM_HANDLE_INFORMATION { // Information Class 16
        ULONG ProcessId;
        UCHAR ObjectTypeNumber;
        UCHAR Flags;  // 0x01 = PROTECT_FROM_CLOSE, 0x02 = INHERIT
        USHORT Handle;
        PVOID Object;
        ACCESS_MASK GrantedAccess;
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;

这样CrackMeApp进程中通过CreateFile打开的句柄就全找到了,一般有三个,我们可以把它全部都关闭,也可以只关闭最后一个(因为最后就是打开驱动的句柄,打开驱动是最后一次调用CreateFile).

这个我就得到了第二个参数,下面的参数都很简单了~

于是一调用这个 DuplicateHandle ,我们不仅关闭了远程的句柄,而且还获得了驱动的句柄,为所欲为了~~

于是我的第8个方法就是发送IO请求到CrackMeApp的驱动里,请求它修改被保护的进程PID为0,这样我们就可以用常规方法结束它了(Open+Terminate)

9.上面方法的远程句柄关闭了,我们就自然可以去卸载驱动了~于是这个就是去 ZwUnloadDriver或者停止了它的Service.这样再用常规方法结束~~

10.所有的win32子系统的进程都会有一个句柄在csrss.exe进程里面,CrackMeApp.exe自然也在,于是我们就可以把 csrss.exe 里面的句柄给 dup 过来自己使用,DUP过来的方法大致和上面相同,不过判断的进程该为csrss,类型要该为5(进程句柄的类型),然后呢对每个进程句柄做一个ZwQueryInformationProcess() 参数为 BASIC_INFORMATION=0 的查询,看看这个句柄是不是CrackMeApp的 ,如果是就直接拿来用,TerminateProcess之~

---------------以下是用借助驱动来结束的-----------

11.用驱动patch了它的保护的PID值,然后用户空间里常规方法~

12.用驱动恢复SSDT中ZwOpenProcess,这里我偷懒直接硬编码,调用那个驱动自身的恢复SSDT的函数,嘿嘿~~之后用户空间里常规方法(这个和11不算一种的)

13.直接在驱动里调用 NtOpenProcess绕过它的SSDT HOOK就可以了,不过应该注意的是需要先把 KTHREAD 结构体里的 PreviousMode 值改为KernelMode,否则有可能会失败的~
获取句柄后调用ZwTerminateProcess,这个不需要修改PreviousMode,直接用就可以~

14.和13的方法不同的是打开句柄的方法,使用了 PsLookupProcessByProcessId+ObOpenObjectByPointer的方法,然后还是调用ZwTerminateProcess~(这个也要算不同的,,因为规则上曾经说过ObXXX和NtXX算不同的API的)

15.最后一种了,首先获取CrackMeApp线程的TID,然后根据 PsLookupThreadByThreadId 获取 EThread 指针,然后向这个线程插入APC调用,在APC过程函数中,主要是执行的 ZwTerminateProcess( 0xffffffff, 0 );这个东西就是结束自己的意思(嘿嘿,,这个方法是我从IceSword里面抠出来的)~~本来想去调用Nt/ZwTerminateThread,结果那个函数没导出还得自己找,于是索性就简单点ZwTerminateProcess了.

以上讲的不清楚的地方可以参考我的代码就应该能明白了~
雪    币: 211
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
四个螳螂 1 2007-8-31 18:54
0
雪    币: 211
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
四个螳螂 1 2007-8-31 14:09
0
[讨论]对于这次逆向比赛的思考
嘿嘿,,这个是没有完全通用的...只有大部分通用的
雪    币: 211
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
四个螳螂 1 2007-8-31 11:58
0
[讨论]大家还是应该好好地做做第二阶段的第二个题目的
不是~那些太委琐

大家接着想想绝对有方法的~~继续比赛吧~~~

PS:我也不是评委搞的托~~哈哈
雪    币: 211
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
四个螳螂 1 2007-8-31 11:56
0
[讨论]大家还是应该好好地做做第二阶段的第二个题目的
好吧,,等之后我公开来看看..   欠r的fogot    你应该不会有什么疑问的~
雪    币: 211
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
四个螳螂 1 2007-8-31 00:04
0
[讨论]大家还是应该好好地做做第二阶段的第二个题目的
应该有的,,我不用驱动已经搞到了9种了,,再加上驱动的话,,应该绝对足够了
雪    币: 211
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
四个螳螂 1 2007-8-30 21:54
0
[声明]本人退出本次逆向大赛
我买了,,,拿钱出来
雪    币: 211
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
四个螳螂 1 2007-8-30 21:39
0
[声明]本人退出本次逆向大赛
我支持你不玩~~于是TS的希望又大了.
雪    币: 211
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
四个螳螂 1 2007-8-30 20:40
0
T-shirt 尺寸登记
每人都有????这么早登记??
雪    币: 211
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
四个螳螂 1 2007-8-30 19:55
0
[讨论]从原理上来。。。
pjf 那篇 进程终止的内幕    得出进程都是自杀的,,原理根本上都是一样
雪    币: 211
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
四个螳螂 1 2007-8-30 17:09
0
雪    币: 211
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
四个螳螂 1 2007-8-29 21:18
0
[建议]关于T-shirt!



T
S
雪    币: 211
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
四个螳螂 1 2007-8-27 22:27
0
雪    币: 211
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
四个螳螂 1 2007-8-27 22:17
0
[注意]提前通知一下大家,第二阶段第一题是计时题
晕~~~~明天有事,,,这个规则实在是.....
雪    币: 211
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
四个螳螂 1 2007-8-26 20:12
0
[讨论][求助]IceSword1.18初始化失败,INT 2E切换进内核时失败的原因?
0x61 是 ZwLoadDriver ,,加载驱动失败..

一般病毒或者恶意软件阻止他加载...看看 ZwLoadDriver 是不是被HOOK了
雪    币: 211
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
四个螳螂 1 2007-8-24 16:15
0
雪    币: 211
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
四个螳螂 1 2007-8-23 14:50
0
[结束][第一阶段◇第一题]看雪论坛.珠海金山2007逆向分析挑战赛
逆向又成 crackme 了.晕~~~直接又来个 crackme 或者 注册机大赛吧
精华数
RANk
211
雪币
0
活跃值
关注数
粉丝数
0
课程经验
0
学习收益
0
学习时长
基本信息
活跃值  活跃值:活跃值
  在线值:
  浏览人数:251
  最近活跃:0
  注册时间:2007-08-17
勋章
能力值

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册