首页
社区
课程
招聘
[旧帖] [求助]怎么调试需要命令行启动的软件?? 0.00雪花
发表于: 2013-7-12 12:02 1849

[旧帖] [求助]怎么调试需要命令行启动的软件?? 0.00雪花

2013-7-12 12:02
1849
怎么调试需要命令行启动的软件??没有命令行启动程序就自动关闭,命令行不是固定的,用od怎么调试这种软件?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 112
活跃值: (57)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
2
问题分解为2步:
* 带参数程序的调试
* 如何捕获参数

带参数程序的调试
模拟一个需要命令行的Demo
// srcCmdParamProg.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
    _tprintf(L"argc = %d\r\n", argc);

    /// 检测命令行参数
    if (argc < 2)
    {
        _tprintf(L"parameter not enough, sorry :(\r\n");
        return -1;
    }

    _tprintf(L"do something\r\n");

    _tprintf(L"END, press any key to quit\r\n");
	return 0;
}


直接打开OD, 找到该程序, 填写命令行参数, 运行.

F8往下走, 到main函数
00F21187   > \A1 1C30F200   mov     eax, dword ptr [F2301C]
00F2118C   .  8B0D 8020F200 mov     ecx, dword ptr [<&MSVCR90.__wini>;  MSVCR90.__winitenv
00F21192   .  8901          mov     dword ptr [ecx], eax
00F21194   .  FF35 1C30F200 push    dword ptr [F2301C]
00F2119A   .  FF35 2030F200 push    dword ptr [F23020]
00F211A0   .  FF35 1830F200 push    dword ptr [F23018]
00F211A6   .  E8 55FEFFFF   call    00F21000                         ;  main函数
00F211AB   .  83C4 0C       add     esp, 0C
00F211AE   .  A3 3030F200   mov     dword ptr [F23030], eax
00F211B3   .  391D 2430F200 cmp     dword ptr [F23024], ebx
00F211B9   .  75 37         jnz     short 00F211F2
00F211BB   .  50            push    eax                              ; /status
00F211BC   .  FF15 8420F200 call    dword ptr [<&MSVCR90.exit>]      ; \exit


F7进入main函数, 可以看到参数检测, argc = 3
00F21000  /$  56            push    esi
00F21001  |.  8B35 A020F200 mov     esi, dword ptr [<&MSVCR90.wprint>;  MSVCR90.wprintf
00F21007  |.  57            push    edi
00F21008  |.  8B7C24 0C     mov     edi, dword ptr [esp+C]           ;  参数数量为3
00F2100C  |.  57            push    edi                              ; |
00F2100D  |.  68 F420F200   push    00F220F4                         ; |format = "argc = %d.."
00F21012  |.  FFD6          call    esi                              ; \wprintf
00F21014  |.  83C4 08       add     esp, 8
00F21017  |.  83FF 02       cmp     edi, 2
00F2101A  |.  7D 10         jge     short 00F2102C                   ;  入参检测, 要求至少带一个参数
00F2101C  |.  68 1021F200   push    00F22110                         ;  UNICODE "parameter not enough, sorry :(",CR,LF
00F21021  |.  FFD6          call    esi
00F21023  |.  83C4 04       add     esp, 4
00F21026  |.  5F            pop     edi
00F21027  |.  83C8 FF       or      eax, FFFFFFFF
00F2102A  |.  5E            pop     esi
00F2102B  |.  C3            retn
00F2102C  |>  68 5421F200   push    00F22154                         ;  UNICODE "do something",CR,LF
00F21031  |.  FFD6          call    esi
00F21033  |.  68 7421F200   push    00F22174                         ;  UNICODE "END, press any key to quit",CR,LF
00F21038  |.  FFD6          call    esi
00F2103A  |.  83C4 08       add     esp, 8
00F2103D  |.  5F            pop     edi
00F2103E  |.  33C0          xor     eax, eax
00F21040  |.  5E            pop     esi
00F21041  \.  C3            retn


当命令行不是固定的, 如何捕获参数
如果目标程序是带参数自己启动, 可以用OD带参数调试目标程序, 在目标程序参数检测逻辑中分析参数要求.

如果目标程序是有父进程给定参数启动, 用OD调试该父进程, 找出应给定目标程序什么参数.
然后再用OD给定该参数, 调试目标程序.
上传的附件:
2013-7-13 13:30
0
雪    币: 9
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢o(∩_∩)o
2013-7-19 14:32
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢,我也学了一招.
2013-7-20 10:29
0
游客
登录 | 注册 方可回帖
返回
//