[原创]PspCidTable杂谈
文章作者:sudami [[email]xiao_rui_119@163.com[/email] ]信息来源:邪恶八进制信息安全团队([url=www.eviloctal.com]www.eviloctal.com[/url])
文章备注:BS炉子,捏他MM,膜拜zhuwg牛ing...
今天再次看了[b]gz1X[/b]牛的文章,回忆了许多知识. 哈哈. 玩了很长时间游戏,写点儿文字算是对自责的一种安慰:lol:
要说R0枚举隐藏进程, 只是对没有抹掉[b]PspCidTable[/b]而言的.[b]gz1X[/b]牛提示了2种方法:
[quote]1. 利用未导出的[b]ExEnumHandleTable[/b]函数
2. 获取PHANDLE_TABLE_ENTRY等,然后[b]PsLookupProcessByProcessId[/b] [/quote]
偶觉得都不是很保险(假设暂且PspCidTable没有被抹掉), [b]ExEnumHandleTable[/b]、[b]PsLookupProcessByProcessId[/b]等都可以做手脚,简单的inline hook之类的.再说这些函数最终还是通过 [b]PHANDLE_TABLE[/b]结构中的[b]TableCode[/b]得到一些[b]HANDLE_TABLE_ENTRY[/b],到其中的Object里,取得相应的进程对象. 还不如自己来完成,嘿嘿. 安全感啊~[img]http://bbs.pediy.com/images/smilies/eek.gif[/img]
"[b]第8个男人[/b]" 的code里面就做的很好,找到[b]PspCidTable[/b]后自己搜索所有的进程对象就行了:
[color=#008000]//----------------------------------------------------------------------[/color]
[color=#0000d0]VOID[/color]
IsValidProcess ()
[color=#008000]/*++
Author : 第8个男人
Leaner : sudami [[email]xiao_rui_119@163.com[/email]]
Time : 08/02/15
参数 : NULL
返回 : NULL
功能 :
给出PspCidTable的地址,结合_EXHANDLE、HANDLE_TABLE、HANDLE_TABLE_ENTRY
搜索到每个进程对象,纪录之.
前提条件: 假设暂且PspCidTable没有被抹掉
--*/[/color]
{
[color=#0000d0]ULONG[/color] PspCidTable;
[color=#0000d0]ULONG[/color] TableCode;
[color=#0000d0]ULONG[/color] table1,table2;
[color=#0000d0]ULONG[/color] object,objectheader;
[color=#0000d0]ULONG[/color] NextFreeTableEntry;
[color=#0000d0]ULONG[/color] processtype,type;
[color=#0000d0]ULONG[/color] flags;
[color=#0000d0]ULONG[/color] i;
PspCidTable = GetCidAddr(); [color=#008000]// 搜索PsLookupProcessByProcessId函中的特征串即可[/color]
processtype = GetProcessType();
[color=#0000d0]if[/color] (PspCidTable == 0) {
[color=#0000d0]return[/color] ;
} [color=#0000d0]else[/color] { [color=#008000]//TableCode的低2位决定句柄表的级数[/color]
TableCode = *([color=#0000d0]PULONG[/color]) ( *([color=#0000d0]PULONG[/color]) PspCidTable );
[color=#0000d0]if[/color] ( (TableCode & 3) == 0 ) { [color=#008000]// 0级[/color]
table1 = TableCode;
table2 = 0;
} [color=#0000d0]else[/color] [color=#0000d0]if[/color] ( (TableCode & 3 ) == 1 ) { [color=#008000]// 1级[/color]
TableCode = TableCode & 0xfffffffc;
table1 = *([color=#0000d0]PULONG[/color])TableCode;
table2 = *([color=#0000d0]PULONG[/color])( TableCode + 4 );
}
[color=#008000]// 对cid从0x0到0x4e1c进行遍历[/color]
[color=#0000d0]for[/color] (i = 0; i < 0x4e1c; i++) {
[color=#0000d0]if[/color] (i <= 0x800) { [color=#008000]// 第一张表中[/color]
[color=#0000d0]if[/color] (MmIsAddressValid( ([color=#0000d0]PULONG[/color])(table1 + i*2) )) {
[color=#008000]// HANDLE_TABLE_ENTRY地址 + PID * 2 ---> 对象的地址[/color]
object = *([color=#0000d0]PULONG[/color])( table1 + i*2 );
[color=#0000d0]if[/color] (MmIsAddressValid( ([color=#0000d0]PULONG[/color])(table1 + i*2 + NEXTFREETABLEENTRY) )) {
[color=#008000]// 验证HANDLE_TABLE_ENTRY的合法性,这在ExEnumHandleTable函数的代码中也有[/color]
[color=#008000]// 正常的_HANDLE_TABLE_ENTRY中NextFreeTableEntry应该为0[/color]
NextFreeTableEntry = *([color=#0000d0]PULONG[/color])(table1 + i*2 + NEXTFREETABLEENTRY);
[color=#0000d0]if[/color] (NextFreeTableEntry == 0) {
[color=#008000]// 去掉低3位掩码标志[/color]
object = ((object | 0x80000000) & 0xfffffff8); [color=#008000]// 转换为对象(体)指针[/color]
objectheader = ([color=#0000d0]ULONG[/color]) \
OBJECT_TO_OBJECT_HEADER(object); [color=#008000]// 获取对象(头)指针[/color]
[color=#0000d0]if[/color] (MmIsAddressValid( ([color=#0000d0]PULONG[/color])(objectheader + TYPE) )) {
type = *([color=#0000d0]PULONG[/color])(objectheader + TYPE);
[color=#0000d0]if[/color] (type == processtype) { [color=#008000]// 是否为进程对象[/color]
flags = *([color=#0000d0]PULONG[/color])( ([color=#0000d0]ULONG[/color])object + \
GetPlantformDependentInfo(OFFSET_EPROCESS_FLAGS) );
[color=#0000d0]if[/color] ((flags&0xc) != 0xc)
RecordInfo( object ); [color=#008000]//flags显示进程没有退出[/color]
}
}
}
}
}
} [color=#0000d0]else[/color] { [color=#008000]// 第2张表[/color]
[color=#0000d0]if[/color] (table2 != 0) {
[color=#008000]// 步骤同上,只是object的获取为: HANDLE_TABLE_ENTRY地址 + (PID- 0x800)*2[/color]
[color=#0000d0]if[/color] (MmIsAddressValid( ([color=#0000d0]PULONG[/color])(table2 + (i - 0x800)*2) )) {
object = *([color=#0000d0]PULONG[/color])(table2 + (i - 0x800)*2);
[color=#0000d0]if[/color] (MmIsAddressValid(([color=#0000d0]PULONG[/color])((table2+(i-0x800)*2)+NEXTFREETABLEENTRY))) {
NextFreeTableEntry=*([color=#0000d0]PULONG[/color])((table2+(i-0x800)*2)+NEXTFREETABLEENTRY);
[color=#0000d0]if[/color] (NextFreeTableEntry==0x0) {
object = ((object | 0x80000000) & 0xfffffff8);
objectheader = ([color=#0000d0]ULONG[/color]) OBJECT_TO_OBJECT_HEADER(object);
[color=#0000d0]if[/color] (MmIsAddressValid( ([color=#0000d0]PULONG[/color])(objectheader + TYPE) )) {
type = *([color=#0000d0]PULONG[/color])(objectheader + TYPE);
[color=#0000d0]if[/color](type == processtype) {
flags = *([color=#0000d0]PULONG[/color]) (([color=#0000d0]ULONG[/color])object + \
GetPlantformDependentInfo(OFFSET_EPROCESS_FLAGS));
[color=#0000d0]if[/color] ((flags&0xc) != 0xc)
RecordInfo(object);
}
}
}
}
}
}
}
}
}
}
当然,用[b]ExEnumHandleTable[/b]也是不错的. Windbg把它的实现看了一遍, 和WRK上的无任何出入[[b]XP SP2[/b]], 实现起来也很方便[s:267]
R3下就更简单了.一阵[b]OpenProcess[/b]就把部分隐藏进程揪出来了:
[color=#0000d0]#include[/color] <iostream.h>
[color=#0000d0]#include[/color] <stdio.h>
[color=#0000d0]#include[/color] <windows.h>
[color=#0000d0]void[/color] main()
{
[color=#0000d0]int[/color] a = 0;
[color=#0000d0]for[/color] ([color=#0000d0]int[/color] i=0;i<=65535;i+=4) {
[color=#0000d0]if[/color]([b][color=#000080]OpenProcess[/color][/b](PROCESS_QUERY_INFORMATION,[color=#0000d0]FALSE[/color],i)!= 0) {
a++;
[color=#ff0000]cout[/color] << [color=#808080]"ProcessID: "[/color] << i << endl;
[b][color=#000080]CloseHandle[/color][/b](&i);
}
}
[color=#ff0000]cout[/color] << [color=#808080]"Total Counts = "[/color] << a << endl;
}
不过俺看了下,好像有些进程没有显示出来,比如SVCHOST.exe、SMSS.EXE...
嘿嘿,结合下面这些就更好搞了 [V大语录]:
[quote]killvxk的驱动查进程:
1.native api获得进程表a
2.通过activelist获得进程表b
3.通过pspCidTable获得进程表c
4.通过handletablelisthead获得进程表d
5.通过csrss的handletable用2种方法枚举获得进程表e和f
6.通过扫描当前进程的handletable获得进程表g
7.遍历表c的每一个进程的SessionProcessLinks获得进程表h
8.遍历表c的每一个进程Vm.WorkingSetExpansionLinks获得进程表i
9.通过Typelist分别取process和thread的表j和表k
10.通过表k得到进程表l
11.搜索内存中的threadobject和processobject得到进程表m
12.通过Wait/Dispatch得到进程表n
13.如果系统是Win2003以上遍历表c的每一个进程的MmProcessLinks得到表o
14.综合上面的进程表得到表p
15.对表p每一个进程做HandleTable,Vm.WorkXX,MmProcessXX,SessionProcessList扫描得到表q
16.枚举HWNDHandle得到进程表r
17.枚举JobObject得到表s
18.综合得表t,此时枚举结束~~
动态部分:
KiReadyThread
和KiSwapContext的钩子
还有KiService钩子
还有CreateProcessNotifyRoutine和CreateThreadNotifyRoutine
NtCreateThread钩子
动态维护一张表,静态枚举结束后综合两表~
[/quote]
其实,隐藏进程越来越难了,保护进程还让其稳定更加不易. 但俺们小菜还是需要掌握这些老掉的技术的,不断学习,不断进步[s:265]
目前通过[b]job[/b]杀进程MS很流行,内存清零也很厉害(就怕attach不上),插APC,杀线程之流的....杀杀IS等不在话下.
不过一般搜索到未导出的[b]PspTerminateProcessByPointer[/b],再深入点儿把这个函数,甚至[b]PspExitThread [/b]都自己实现一遍(用Windbg看了遍PspTerminateThreadByPointer,发现和WRK上的一样.哈哈,没有任何出入 [XP SP2]), Kill掉大部分进程是木有问题的,不过像KV2008这样猥亵的家伙在投递APC上下了手脚,就要先恢复了inline hook再杀了.
炉子牛的R0那个干掉[b]KV2008[/b]的好像就是这样搞的.哈哈, 丢个驱动在这里,供有兴趣的IDA look之(应该无壳). R3下搞KV 炉子出了个录象,很神秘的样子,不过好像是成功了.哈哈
对了.炉子牛(又是炉子...)放了个simple task, R3下的简单管理器 [[b]VB[/b]],---
检测隐藏进程的思路很科普:
一个[b]EnumProcess[/b] or [b]ToolHelp32[/b]来做对照, 一个[b]ZwQuerySsytemInformation[/b]来走过场,一个从0 到65535的遍历[b]OpenProcess[/b]来达到PspCidTable的效果. 3个途径来扫盲式的检测,方法是科普点儿.
结束进程部分很扫盲(原作者: EST的[b]willy123[/b]牛):
[b]ZwCreateJobObject-->ZwAssignProcessToJobObject-->ZwTerminateJobObject[/b]
对付IS这样inlie hook 了[b]NtOpenProcess[/b]等的就用了一种很和谐的方法,FlowerCode提供滴.不过是VB写的, 俺无聊把其转化为了C描述,方便些:
[quote][color=#008000]//--------------------------------------------------------------[/color]
[color=#008000]// btw: 头文件的那些申明自己写咯~[/color]
[color=#008000]// 调用前要有SE_DEBUG权限[/color]
[color=#0000d0]HANDLE[/color]
SDM_OpenProcess (
[color=#0000d0]DWORD[/color] dwDesiredAccess,
[color=#0000d0]BOOL[/color] bInhert,
[color=#0000d0]DWORD[/color] ProcessId,
[color=#0000d0]BOOL[/color] bOpenIt,
[color=#0000d0]LPDWORD[/color] aryPids
)
[color=#008000]/*++
原作者 : FlowerCode | 炉子 [VB]
转换者 : sudami [[email]xiao_rui_119@163.com[/email]] [C]
Time : 08/02/12
参数 :
dwDesiredAccess - 希望以怎样的方式打开进程
bInhert - 是否有继承权限
ProcessId - PID
bOpenIt - 是要打开进程,还是要保存所有进程ID
paryPids - 保存PID的数组
返回 :
成功 - 指定的进程句柄
失败 - 0
功能 :
1. 复制来复制去,总之是要获得指定进程的句柄
2. 用普通方法得到所有进程ID
--*/[/color]
{
[color=#0000d0]ULONG[/color] cbBuffer = 0x1000; [color=#008000]//先设定一个较小的缓冲空间[/color]
[color=#0000d0]ULONG[/color] uRetSzie;
[color=#0000d0]ULONG[/color] NumOfHandle = 0;
[color=#0000d0]PCHAR[/color] pBuffer = [color=#0000d0]NULL[/color];
[color=#0000d0]PVOID[/color] pOneEprocess = 0;
CLIENT_ID cid;
NTSTATUS [color=#ff0000]st[/color];
OBJECT_ATTRIBUTES oa;
PROCESS_BASIC_INFORMATION pbi;
PSYSTEM_HANDLE_TABLE_ENTRY_INFO h_info;
[color=#0000d0]HANDLE[/color] hProcessToDup, hProcessCur, hProcessToRet;
oa.Length = [color=#0000d0]sizeof[/color] (OBJECT_ATTRIBUTES);
oa.RootDirectory = 0;
oa.ObjectName = 0;
oa.Attributes = 0;
oa.SecurityDescriptor = 0;
oa.SecurityQualityOfService = 0;
[color=#0000d0]if[/color] (bInhert) {
oa.Attributes |= OBJ_INHERIT;
}
[color=#0000d0]if[/color] (bOpenIt) {
[color=#008000]// 看能否直接得到句柄[/color]
cid.UniqueProcess = ([color=#0000d0]HANDLE[/color]) (ProcessId + 1);
cid.UniqueThread = 0;
[color=#ff0000]st[/color] = NtOpenProcess (&hProcessToRet, dwDesiredAccess, &oa, &cid);
[color=#0000d0]if[/color] (NT_SUCCESS ([color=#ff0000]st[/color])) {
[color=#0000d0]return[/color] hProcessToRet;
}
::[b][color=#000080]MessageBox[/color][/b] ([color=#0000d0]NULL[/color], [color=#808080]"NtOpenProcess 失败"[/color], [color=#808080]"=。=!"[/color], MB_OK);
}
[color=#008000]// 传递16号获得所有句柄,可能被hook过;不管了,走过场~[/color]
[color=#0000d0]do[/color] {
[color=#ff0000]st[/color] = ZwQuerySystemInformation( [color=#008000]/*SystemHandleInformation*/[/color]16, \
pBuffer, cbBuffer, &uRetSzie );
[color=#0000d0]if[/color] ([color=#ff0000]st[/color] == STATUS_INFO_LENGTH_MISMATCH) {
[b][color=#000080]free[/color][/b]( pBuffer);
cbBuffer *= 2;
pBuffer = ([color=#0000d0]PCHAR[/color]) malloc (cbBuffer);
} [color=#0000d0]else[/color] [color=#0000d0]if[/color] ( !NT_SUCCESS ([color=#ff0000]st[/color]) ) {
[b][color=#000080]free[/color][/b]( pBuffer);
::[b][color=#000080]MessageBox[/color][/b] ([color=#0000d0]NULL[/color], [color=#808080]"ZwQuerySystemInformation失败"[/color], [color=#808080]"."[/color], MB_OK);
[color=#0000d0]return[/color] 0;
}
} [color=#0000d0]while[/color] ([color=#ff0000]st[/color] == STATUS_INFO_LENGTH_MISMATCH);
NumOfHandle = ([color=#0000d0]ULONG[/color]) pBuffer;
h_info = (PSYSTEM_HANDLE_TABLE_ENTRY_INFO) ( ([color=#0000d0]ULONG[/color])pBuffer + 4 );
[color=#008000]/*
// 获得进程对象类型
pOneEprocess = h_info[0].Object;
g_pObjectTypeProcess = *(PULONG) ( (ULONG)pOneEprocess - OBJECT_HEADER_SIZE \
+ OBJECT_TYPE_OFFSET );
*/[/color]
[color=#0000d0]for[/color] ([color=#0000d0]ULONG[/color] i = 0; i < NumOfHandle; i++) {
aryPids[i] = h_info[i].UniqueProcessId;
[color=#0000d0]if[/color] (bOpenIt) {
::[b][color=#000080]MessageBox[/color][/b] ([color=#0000d0]NULL[/color], [color=#808080]"333"[/color], [color=#808080]"=。=!"[/color], MB_OK);
[color=#0000d0]if[/color] ( 5 == h_info[i].ObjectTypeIndex) { [color=#008000]// 是进程的句柄,打开它[/color]
cid.UniqueProcess = ([color=#0000d0]HANDLE[/color])h_info[i].UniqueProcessId;
[color=#ff0000]st[/color] = NtOpenProcess (&hProcessToDup, PROCESS_DUP_HANDLE, &oa, &cid);
[color=#0000d0]if[/color] (NT_SUCCESS ([color=#ff0000]st[/color])) { [color=#008000]// 复制该句柄后赋予全部权限,以便调用ZwQuery*时顺利进行[/color]
[color=#ff0000]st[/color] = ZwDuplicateObject (hProcessToDup, ([color=#0000d0]PHANDLE[/color])h_info[i].HandleValue, ([color=#0000d0]HANDLE[/color])-1,\
&hProcessCur, PROCESS_ALL_ACCESS, 0, DUPLICATE_SAME_ATTRIBUTES);
[color=#0000d0]if[/color] (NT_SUCCESS ([color=#ff0000]st[/color])) { [color=#008000]// 查看复制的句柄是否为我们想要的[/color]
[color=#ff0000]st[/color] = ZwQueryInformationProcess (hProcessCur, ProcessBasicInformation,\
&pbi, [color=#0000d0]sizeof[/color](pbi), 0);
[color=#0000d0]if[/color] (NT_SUCCESS ([color=#ff0000]st[/color])) {
[color=#0000d0]if[/color] (ProcessId == pbi.UniqueProcessId ) {
[color=#008000]// 若是想要的PID,就把该句柄按照希望的访问权限复制,然后返回[/color]
[color=#ff0000]st[/color] = ZwDuplicateObject (hProcessToDup, ([color=#0000d0]PHANDLE[/color])h_info [i].HandleValue,\
([color=#0000d0]HANDLE[/color])-1, &hProcessToRet, dwDesiredAccess,\
OBJ_INHERIT, DUPLICATE_SAME_ATTRIBUTES);
ZwClose (hProcessCur);
ZwClose (hProcessToDup);
[color=#0000d0]return[/color] hProcessToRet;
}
}
}
ZwClose (hProcessCur);
}
ZwClose (hProcessToDup);
}
}
}
[color=#0000d0]return[/color] 0;
}
[/quote]
[i].[/i]
顺便问下: 要抹掉PspCidTable中指定的进程容易,抹[b]CSRSS.exe[/b]的也容易,什么挂SwapContext的,自己实现线程调度rootkit.com上的[b]PHIDE2 engine[/b]也实现了(颇为复杂,引擎写的很漂亮),还有啥改ETHREAD,EPROCESS, flag等DKOM类的...好多好多.但是一个内存暴力搜索不就都出来了.这可怎么隐藏啊:cry: ...
-------------------------------------------------------------------------------------------------------
参考资料:
(1) [url=http://hi.baidu.com/gz1x/blog/item/d99aeefa4d1c92ddb48f31b9.html][b][color=#000000]基于pspCidTable的进程检测技术[/color][/b][/url]
(2) [url=http://hi.baidu.com/sudami/blog/item/47b2ac504302f7581038c206.html][b][color=#000000]句柄啊,3层表啊,ExpLookupHandleTableEntry啊[/color][/b][/url]
(3) [url=http://hi.baidu.com/sudami/blog/item/7773b71fe4545867f624e4f3.html][b][color=#000000]PsLookupProcessByProcessId执行流程[/color][/b][/url]
(4) [url=http://hi.baidu.com/sudami/blog/item/ea1e9107f5c78cc97b894713.html][b][color=#000000]PspTerminateThreadByPointer[/color][/b][/url]
(5) WRK,ReactOS
[[i] 本帖最后由 sudami 于 2008-2-15 21:56 编辑 [/i]] kill2k8.sys?
偶看看…… 偶咋就米印象啊。。
btw:ExEnumHandleTable是导出的(xp sp2)
PspTerminateThreadByPointer在某些xp系统是2参数版不是3参数版。
暴力搜索内存怎么过。。恩。。你自己暴力搜索一次就明白了:lol: 汗。。那个killkv.sys干不掉KV2008 - -! 其实是exe先在r3下恢复了那几个函数的inline - -!
btw:偶的那个r3的那个等你们看到方法的话。。你们会很失望很失望很失望很失望(省略数量级为10^100个‘很失望’)的。 汗,俺这一写东西.错误百出啊.
真不好意思.哈哈:cry: “文章备注:BS炉子,捏他MM”
。。。
我摸死你啊摸死你 R,确实是这样,导出的就更好做小动作了啊...[attach]10985[/attach]
那是g1zx牛写错了,哈哈.
你滴那个sys好像能kill掉KV.俺有时间逆下看看:funk:
[[i] 本帖最后由 sudami 于 2008-2-15 22:14 编辑 [/i]] PHIDE2 engine自己实现了调度? 真黄。
不过应该还得调用SwapContext啊SwapContext。。 看来以后干脆连KiReadyThread之类的统统挂上。。phide2太不和谐了。。
btw:ProcMgr是调用EnumProcess的。。因为Tool32的VB代码网上不好找-___-!
继续摸大米啊摸大米。。 [quote]原帖由 [i]炉子[/i] 于 2008-2-15 22:22 发表 [url=http://forum.eviloctal.com/redirect.php?goto=findpost&pid=138497&ptid=32234][img]images/common/back.gif[/img][/url]
PHIDE2 engine自己实现了调度? 真黄。
不过应该还得调用SwapContext啊SwapContext。。 看来以后干脆连KiReadyThread之类的统统挂上。。phide2太不和谐了。。
[/quote]
是都挂了,看看图就知道了.引擎很强大的说:titter:我陆续看了一个月,笨死了 [s:287]
[attach]10986[/attach]
[attach]10987[/attach]
[[i] 本帖最后由 sudami 于 2008-2-15 22:39 编辑 [/i]] 来个bin吧。。 只关心whether detectable. 简单看了下 很黄很暴力,改天慢慢看。
稳定性估计差了点。 [quote]原帖由 [i]炉子[/i] 于 2008-2-15 22:45 发表 [url=http://forum.eviloctal.com/redirect.php?goto=findpost&pid=138499&ptid=32234][img]images/common/back.gif[/img][/url]
来个bin吧。。 只关心whether detectable. [/quote]
嘿嘿,俺这里的sys好像加载不成功,因为无DDK,也不好重新编译了.
你告诉俺邮箱,把源码给你吧.只有个sys.无exe. (一个月前还在学校时,sys编译出来有部分问题被偶删了,现在在家编译不了啦)[s:284]
[[i] 本帖最后由 sudami 于 2008-2-15 22:50 编辑 [/i]] 汗 米exe怎么隐藏噢? src就不必了 光要bin。。 告诉偶怎么样隐藏。。 偶看看能检测到不:lol:
[email]liulu00001@gmail.com[/email] 现在没有bin了啊.code已经发你邮箱了
RRR
[[i] 本帖最后由 sudami 于 2008-2-15 22:57 编辑 [/i]] 汗.,大米咋搞的只有src米bin呢>
phide2确实不错哇,,自己的线程调度
很暴力
Swap啥啥全部自己实现了
炉子大牛你不用去挂Swap了,.阿哈
另外貌似现在大牛们都不用进程了
dll+sys搞定.,更nb的大牛一个sys搞定一切
恩,防内核内存搜索可以pagecode大法
自己把代码飞出去运行.:loveliness:
或者抹掉内存PE特征也许可以
不过好像rku还能找到--unknown module..:sweat:
[[i] 本帖最后由 zhuwg 于 2008-2-16 12:15 编辑 [/i]] 好文,加个精华先。很欣赏sudami的严谨认真的态度,虽然俺一直想学习这方面的知识,可是苦于基础不太好,所以还是先打基础的好,驱动方面的知识太多俺不知道该看哪些东西。
sudami同学,不知道你是否可以当当俺的启蒙老师啊,嘿嘿:lol:
另外wrk现在的版本是多少啊? [quote]
防内核内存搜索可以pagecode大法
自己把代码飞出去运行
另外貌似现在大牛们都不用进程了
dll+sys搞定.,更nb的大牛一个sys搞定一切
[/quote]
嘿嘿,V大说的也是 page hook大法,赶紧查资料学习.:lol:
mika阿姨好谦虚啊,俺是个菜鸟,驱动学了3个多月,菜啊菜,EST牛人多,驱牛更多了~~
WRK目前是1.2的吧~ 其实用Windgb就能把好多东西搞透彻.:loveliness:
好帖
:smile: 呵呵 刚学习这方面知识,就看到了sudami的帖子,值得学习 ,谢谢页:
[1]