1171320344 发表于 2016-7-24 17:49:04

[源码] x86 PsSetCreateProcessNotifyRoutine回调改commandline参数demo

本帖最后由 1171320344 于 2016-7-24 19:19 编辑

前几天在问答区看到有朋友问这个问题,问能不能改,怎么改,这是demo,献丑了
编译环境,VS2013 + WDK8.1




这是VS2013完整项目

Tesla.Angela 发表于 2016-7-24 19:05:50

我这里无法编译,能否提供个可编译的版本并说明测试方法?
WDK7里,无论XP FREE、WIN7X86 FREE、WIN7X64 FREE都无法编译。1>errors in directory d:\temp\change-cmdline
1>d:\temp\change-cmdline\work.h(233) : error C2146: syntax error : missing ')' before identifier 'PRKPROCESS'
1>d:\temp\change-cmdline\work.h(233) : error C2085: 'Process' : not in formal parameter list
1>d:\temp\change-cmdline\work.h(233) : error C2085: '_Out_' : not in formal parameter list
1>d:\temp\change-cmdline\work.h(233) : error C2146: syntax error : missing ',' before identifier 'PRKAPC_STATE'
1>d:\temp\change-cmdline\work.h(233) : error C2146: syntax error : missing ',' before identifier 'ApcState'
1>d:\temp\change-cmdline\work.h(233) : error C2059: syntax error : ')'
1>d:\temp\change-cmdline\work.h(234) : error C2146: syntax error : missing ')' before identifier 'PRKAPC_STATE'
1>d:\temp\change-cmdline\work.h(234) : error C2085: 'KeUnstackDetachProcess' : not in formal parameter list
1>d:\temp\change-cmdline\work.h(234) : error C2146: syntax error : missing ',' before identifier 'PRKAPC_STATE'
1>d:\temp\change-cmdline\work.h(234) : error C2146: syntax error : missing ',' before identifier 'ApcState'
1>d:\temp\change-cmdline\work.h(234) : error C2059: syntax error : ')'
1>d:\temp\change-cmdline\work.h(235) : error C2085: 'PsGetProcessPeb' : not in formal parameter list
1>d:\temp\change-cmdline\work.h(236) : error C2085: 'NtTerminateProcess' : not in formal parameter list
1>d:\temp\change-cmdline\work.h(244) : error C2085: 'ObOpenObjectByPointer' : not in formal parameter list
1>d:\temp\change-cmdline\work.h(245) : error C2085: 'PsGetProcessImageFileName' : not in formal parameter list
1>d:\temp\change-cmdline\liketest.c(7) : error C2085: 'DriverUnload' : not in formal parameter list
1>d:\temp\change-cmdline\liketest.c(7) : error C2143: syntax error : missing ';' before '{'
1>d:\temp\change-cmdline\liketest.c(11) : error C2065: 'pDriverObj' : undeclared identifier
1>d:\temp\change-cmdline\liketest.c(11) : error C2223: left of '->DeviceObject' must point to struct/union
1>d:\temp\change-cmdline\liketest.c(11) : error C2198: 'IoDeleteDevice' : too few arguments for call
1>d:\temp\change-cmdline\liketest.c(74) : error C2065: 'DriverUnload' : undeclared identifier
1>d:\temp\change-cmdline\work.h(233) : error C2146: syntax error : missing ')' before identifier 'PRKPROCESS'
1>d:\temp\change-cmdline\work.h(233) : error C2085: 'Process' : not in formal parameter list
1>d:\temp\change-cmdline\work.h(233) : error C2085: '_Out_' : not in formal parameter list
1>d:\temp\change-cmdline\work.h(233) : error C2146: syntax error : missing ',' before identifier 'PRKAPC_STATE'
1>d:\temp\change-cmdline\work.h(233) : error C2146: syntax error : missing ',' before identifier 'ApcState'
1>d:\temp\change-cmdline\work.h(233) : error C2059: syntax error : ')'
1>d:\temp\change-cmdline\work.h(234) : error C2146: syntax error : missing ')' before identifier 'PRKAPC_STATE'
1>d:\temp\change-cmdline\work.h(234) : error C2085: 'KeUnstackDetachProcess' : not in formal parameter list
1>d:\temp\change-cmdline\work.h(234) : error C2146: syntax error : missing ',' before identifier 'PRKAPC_STATE'
1>d:\temp\change-cmdline\work.h(234) : error C2146: syntax error : missing ',' before identifier 'ApcState'
1>d:\temp\change-cmdline\work.h(234) : error C2059: syntax error : ')'
1>d:\temp\change-cmdline\work.h(235) : error C2085: 'PsGetProcessPeb' : not in formal parameter list
1>d:\temp\change-cmdline\work.h(236) : error C2085: 'NtTerminateProcess' : not in formal parameter list
1>d:\temp\change-cmdline\work.h(244) : error C2085: 'ObOpenObjectByPointer' : not in formal parameter list
1>d:\temp\change-cmdline\work.h(245) : error C2085: 'PsGetProcessImageFileName' : not in formal parameter list
1>d:\temp\change-cmdline\work.c(11) : error C2085: 'CreateProcessNotify' : not in formal parameter list
1>d:\temp\change-cmdline\work.c(11) : error C2143: syntax error : missing ';' before '{'
1>d:\temp\change-cmdline\work.c(16) : error C2065: 'Create' : undeclared identifier
1>d:\temp\change-cmdline\work.c(18) : error C2065: 'ProcessId' : undeclared identifier
1>d:\temp\change-cmdline\work.c(24) : error C2275: 'KAPC_STATE' : illegal use of this type as an expression
1>d:\temp\change-cmdline\work.c(24) : error C2146: syntax error : missing ';' before identifier 'ApcState'
1>d:\temp\change-cmdline\work.c(24) : error C2065: 'ApcState' : undeclared identifier
1>d:\temp\change-cmdline\work.c(24) : error C2275: 'PPEB' : illegal use of this type as an expression
1>d:\temp\change-cmdline\work.c(24) : error C2146: syntax error : missing ';' before identifier 'peb'
1>d:\temp\change-cmdline\work.c(24) : error C2065: 'peb' : undeclared identifier
1>d:\temp\change-cmdline\work.c(25) : error C2065: 'ApcState' : undeclared identifier
1>d:\temp\change-cmdline\work.c(25) : error C2708: 'KeStackAttachProcess' : actual parameters length in bytes differs from previous call or reference
1>d:\temp\change-cmdline\work.c(26) : error C2065: 'peb' : undeclared identifier
1>d:\temp\change-cmdline\work.c(26) : error C4013: 'PsGetProcessPeb' undefined; assuming extern returning int
1>d:\temp\change-cmdline\work.c(29) : error C2065: 'peb' : undeclared identifier
1>d:\temp\change-cmdline\work.c(29) : error C2223: left of '->ProcessParameters' must point to struct/union
1>d:\temp\change-cmdline\work.c(29) : error C2065: 'peb' : undeclared identifier
1>d:\temp\change-cmdline\work.c(29) : error C2223: left of '->ProcessParameters' must point to struct/union
1>d:\temp\change-cmdline\work.c(32) : error C2065: 'peb' : undeclared identifier
1>d:\temp\change-cmdline\work.c(32) : error C2223: left of '->ProcessParameters' must point to struct/union
1>d:\temp\change-cmdline\work.c(35) : error C2275: 'UNICODE_STRING' : illegal use of this type as an expression
1>d:\temp\change-cmdline\work.c(35) : error C2146: syntax error : missing ';' before identifier 'Unicode_tmp'
1>d:\temp\change-cmdline\work.c(35) : error C2065: 'Unicode_tmp' : undeclared identifier
1>d:\temp\change-cmdline\work.c(36) : error C2065: 'Unicode_tmp' : undeclared identifier
1>d:\temp\change-cmdline\work.c(37) : error C2065: 'peb' : undeclared identifier
1>d:\temp\change-cmdline\work.c(37) : error C2223: left of '->ProcessParameters' must point to struct/union
1>d:\temp\change-cmdline\work.c(37) : error C2065: 'Unicode_tmp' : undeclared identifier
1>d:\temp\change-cmdline\work.c(40) : error C2065: 'peb' : undeclared identifier
1>d:\temp\change-cmdline\work.c(40) : error C2223: left of '->ProcessParameters' must point to struct/union
1>d:\temp\change-cmdline\work.c(40) : error C2065: 'Unicode_tmp' : undeclared identifier
1>d:\temp\change-cmdline\work.c(42) : error C2065: 'peb' : undeclared identifier
1>d:\temp\change-cmdline\work.c(42) : error C2223: left of '->ProcessParameters' must point to struct/union
1>d:\temp\change-cmdline\work.c(53) : error C4013: 'KeUnstackDetachProcess' undefined; assuming extern returning int
1>d:\temp\change-cmdline\work.c(53) : error C2065: 'ApcState' : undeclared identifier
1>d:\temp\change-cmdline\work.c(72) : error C2065: 'CreateProcessNotify' : undeclared identifier
1>d:\temp\change-cmdline\work.c(81) : error C2065: 'CreateProcessNotify' : undeclared identifier
1>link : error LNK1181: cannot open input file 'd:\temp\change-cmdline\objfre_win7_x86\i386\liketest.obj'

1171320344 发表于 2016-7-24 19:10:19

Tesla.Angela 发表于 2016-7-24 19:05
我这里无法编译,能否提供个可编译的版本并说明测试方法?
WDK7里,无论XP FREE、WIN7X86 FREE、WIN7X64 FR ...

额,这个...我是用vs2013 写的, 文件->打开->Convert Sourecs /...直接打开Sourecs 就OK了...

Tesla.Angela 发表于 2016-7-24 19:12:31

1171320344 发表于 2016-7-24 19:10
额,这个...我是用vs2013 写的, 文件->打开->Convert Sourecs /...直接打开Sourecs 就OK了... ...

我看到你的SOURCES文件了,我是直接用WDK7切换到源码目录然后BLD编译的,但是失败了。

1171320344 发表于 2016-7-24 19:14:08

Tesla.Angela 发表于 2016-7-24 19:12
我看到你的SOURCES文件了,我是直接用WDK7切换到源码目录然后BLD编译的,但是失败了。 ...

这个工程是WDK8.1的,按理说用的函数都差不多,应该没问题的啊

Tesla.Angela 发表于 2016-7-24 19:24:37

1171320344 发表于 2016-7-24 19:14
这个工程是WDK8.1的,按理说用的函数都差不多,应该没问题的啊

小问题,给我改好了,主要是你里面有些警告,用FREE是编译不过的。
利用IE测试效果很好。已经加高亮、精华和水晶币。
研究东西就需要LZ这种较真的精神。

Tesla.Angela 发表于 2016-7-24 19:46:23

发现一个奇怪的问题,你这个东西只对改IE进程命令行的效果很好,但是对CHROME就无效了。
DBGVIEW显示已更改,但是实际无效。直接在CMD里用命令行启动【chrome www.baidu.com】是有效的。
以下是我修改过的代码,你原来PWCHAR *tmp是不对的。VOID CreateProcessNotify
(
    IN HANDLE ParentId,
    IN HANDLE ProcessId,
    IN BOOLEAN Create
)
{
        NTSTATUS                status = STATUS_SUCCESS;
        PEPROCESS                pEprocess = NULL;
        if (Create)
        {
                status = PsLookupProcessByProcessId(ProcessId, &pEprocess);//没有ObDereferenceObject
                if (NT_SUCCESS(status))
                {
                        PFILE_OBJECT      FilePointer = NULL;
                        KAPC_STATE ApcState;
                        PPEB peb;
                        PCHAR procName = PsGetProcessImageFileName(pEprocess);
                        status = PsReferenceProcessFilePointer((PEPROCESS)pEprocess, &FilePointer);
                        KeStackAttachProcess((PRKPROCESS)pEprocess, &ApcState);
                        peb = PsGetProcessPeb(pEprocess);
                        //DbgPrint("++++%wZ+++++%wZ\r\n", &peb->ProcessParameters->CommandLine, &peb->ProcessParameters->ImagePathName);
                        if
                        (
                                peb->ProcessParameters->CommandLine.Length - peb->ProcessParameters->ImagePathName.Length <= 6 &&
                                (!_strnicmp(procName,"iexplore.exe",12) || !_strnicmp(procName,"chrome.exe",10))
                        )
                        {
                                UNICODE_STRING Unicode_tmp;
                                PWCHAR tmp = (PWCHAR)(peb->ProcessParameters->CommandLine.Buffer);
                                wcscat(tmp, L" www.baidu.com");
                                RtlInitUnicodeString(&Unicode_tmp, tmp);
                                peb->ProcessParameters->CommandLine = Unicode_tmp;
                                peb->ProcessParameters->WindowTitle = Unicode_tmp;
                                DbgPrint("--->%wZ\r\n", &peb->ProcessParameters->CommandLine);
                        }
                        KeUnstackDetachProcess(&ApcState);
                }
        }
}

1171320344 发表于 2016-7-24 20:03:32

Tesla.Angela 发表于 2016-7-24 19:46
发现一个奇怪的问题,你这个东西只对改IE进程命令行的效果很好,但是对CHROME就无效了。
DBGVIEW显示已更改 ...

多谢指点,这玩意当时只是发现改了有效果了就没深研究,多谢指点

kz丶cn 发表于 2016-7-26 11:43:10

Tesla.Angela 发表于 2016-7-24 19:46
发现一个奇怪的问题,你这个东西只对改IE进程命令行的效果很好,但是对CHROME就无效了。
DBGVIEW显示已更改 ...

我测试chrome有效果的....测试平台是win7 x86 chrome是最新版的

kz丶cn 发表于 2016-7-26 11:54:18

Tesla.Angela 发表于 2016-7-24 19:46
发现一个奇怪的问题,你这个东西只对改IE进程命令行的效果很好,但是对CHROME就无效了。
DBGVIEW显示已更改 ...

x64下失效的原因 默认得到的是x64的peb 改了肯定没有效果 方法你肯定知道了

Tesla.Angela 发表于 2016-7-26 12:03:49

kz丶cn 发表于 2016-7-26 11:54
x64下失效的原因 默认得到的是x64的peb 改了肯定没有效果 方法你肯定知道了 ...

有道理,你这么一说我秒懂了。我当时测试的正好是64位IE和32位的CHROME。

xtfpg 发表于 2016-8-10 17:10:56

感谢各位人才
页: [1]
查看完整版本: [源码] x86 PsSetCreateProcessNotifyRoutine回调改commandline参数demo