首页
社区
课程
招聘
[求助]使用CreateProcess带lpApplicationName和lpCommandLine参数创建的进程如何调试?
发表于: 2013-8-20 12:00 12047

[求助]使用CreateProcess带lpApplicationName和lpCommandLine参数创建的进程如何调试?

2013-8-20 12:00
12047
请问各大虾有木有遇到过一下问题:
父进程通过CreateProcess函数创建子进程,有lpApplicationName和lpCommandLine参数的情况下,ollydbg提示无法定位文件,有办法吗?

先在注册表设置自动启动调试器
在HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\currentversion\image file execution options建debugger=C:\soft\OllyICE_1.10\OllyICE.exe
详细操作,参考http://msdn.microsoft.com/zh-cn/library/vstudio/a329t4ed.aspx 设置的

父进程代码如下:
#include<windows.h>
#include<stdio.h>
main()
{
  PROCESS_INFORMATION x;
  STARTUPINFO startup_info;
  memset((char *)&startup_info, 0, sizeof(STARTUPINFO));
  startup_info.cb = sizeof(STARTUPINFO);
  startup_info.dwFlags = STARTF_USESTDHANDLES;
  startup_info.hStdInput = GetStdHandle(STD_INPUT_HANDLE);

  int a=  CreateProcess("showcmd.exe","abc",0,0,0,0,0,0,&startup_info,&x);//没有abc参数的时候可以调试showcmd.exe进程,有的时候要怎样调试呢?

  LPVOID lpMsgBuf;

  FormatMessage(
  FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
  NULL,
  GetLastError(),
  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
  (LPTSTR) &lpMsgBuf,
  0,
  NULL

  );

  printf("%s",lpMsgBuf);
}

运行父进程后,ollydbg是启动了,但是有一下提示问题,怎么解决呢?


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 112
活跃值: (57)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
2
这种方法不支持带参数的 CreateProcess, 只适合不带参数的 CreateProcess.

可以换种方法来调试

* 用OD实例1载入parent.exe, 走到CreateProcess之前, 将参数记下来.


* 另开一个OD实例2, 带参数启动子进程


* 用OD实例1跳过parent.exe的CreateProcess, 注意堆栈平衡之类的操作,使主程序能继续往下跑.


这样就OK了, 可以完全模拟主进程启动带参数的子进程的调试.

比MS提供的方法麻烦点, 不过MS的方法不支持命令行参数.
在网上找到的资料, 都没有提及带参数启动子进程的细节.
上传的附件:
2013-8-20 14:46
0
雪    币: 78
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
望大牛能指点一下
2013-8-20 14:47
0
雪    币: 78
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢指导,但小弟模仿你的方法尝试,子进程showcmd.exe 里面GetCommandLine()返回的结果是不同的。
通过CreateProcess函数调用,子进程GetCommandLine()返回的是该函数第二个参数的传入值

通过OD打开的是整个命令行


望大虾再帮忙研究一下
上传的附件:
2013-8-20 15:11
0
雪    币: 112
活跃值: (57)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
5
自己将参数拆开吧, 将参数指针指到 "abc" 上.

为了完全模拟主进程CreateProcess的结果, 需要在OD实例2中, 将命令行参数指针,手工改改,指到具体的命令行参数上.

被调试的程序一般都不是我们写的,  为了模拟出和主进程一样的参数给子进程用, 需要找到子进程用命令行参数的地方,手工将参数指针改掉.
例如:

命令行参数 修改前

命令行参数 修改后


这么搞肯定要繁琐一些, 多有不便.
希望路过的同学能有更好的方法调试"主进程建立带参数的子进程".
上传的附件:
2013-8-20 15:53
0
雪    币: 78
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
如果子进程有n个 GetCommandLine()调用的话,这种方法模拟有点不便。望大虾给出更直接的动态调试方法。谢谢!
2013-8-20 16:56
0
雪    币: 112
活跃值: (57)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
7
请路过的同学发表意见,我没有更好的方法.
2013-8-20 16:58
0
雪    币: 44
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
createprocess  resumethread
2013-8-20 17:08
0
雪    币: 112
活跃值: (57)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
9
您能详细讲解下么? 不是很懂.
2013-8-20 18:50
0
雪    币: 78
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
大牛,能否举个例子?
2013-8-20 19:29
0
雪    币: 78
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
自顶一下,望路过的大牛不吝指教,谢谢!
2013-8-21 09:29
0
雪    币: 78
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
再顶一下,望大虾可怜小弟,指点一下,谢谢!
2013-8-22 17:03
0
雪    币: 78
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
再顶一下
2013-8-27 10:54
0
雪    币: 78
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
再顶一下
2013-8-29 16:56
0
游客
登录 | 注册 方可回帖
返回
//