experiment : 使用OD 调试带启动参数的程序

来源:互联网 发布:多个相同表格数据提取 编辑:程序博客网 时间:2024/04/30 09:00

看到有这样一个问题: 

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


带参数程序的调试

模拟一个需要命令行的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.__winitenv00F21192   .  8901          mov     dword ptr [ecx], eax00F21194   .  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, 0C00F211AE   .  A3 3030F200   mov     dword ptr [F23030], eax00F211B3   .  391D 2430F200 cmp     dword ptr [F23024], ebx00F211B9   .  75 37         jnz     short 00F211F200F211BB   .  50            push    eax                              ; /status00F211BC   .  FF15 8420F200 call    dword ptr [<&MSVCR90.exit>]      ; \exit
F7进入main函数, 可以看到参数检测, argc = 3

00F21000  /$  56            push    esi00F21001  |.  8B35 A020F200 mov     esi, dword ptr [<&MSVCR90.wprint>;  MSVCR90.wprintf00F21007  |.  57            push    edi00F21008  |.  8B7C24 0C     mov     edi, dword ptr [esp+C]           ;  参数数量为300F2100C  |.  57            push    edi                              ; |00F2100D  |.  68 F420F200   push    00F220F4                         ; |format = "argc = %d.."00F21012  |.  FFD6          call    esi                              ; \wprintf00F21014  |.  83C4 08       add     esp, 800F21017  |.  83FF 02       cmp     edi, 200F2101A  |.  7D 10         jge     short 00F2102C                   ;  入参检测, 要求至少带一个参数00F2101C  |.  68 1021F200   push    00F22110                         ;  UNICODE "parameter not enough, sorry :(",CR,LF00F21021  |.  FFD6          call    esi00F21023  |.  83C4 04       add     esp, 400F21026  |.  5F            pop     edi00F21027  |.  83C8 FF       or      eax, FFFFFFFF00F2102A  |.  5E            pop     esi00F2102B  |.  C3            retn00F2102C  |>  68 5421F200   push    00F22154                         ;  UNICODE "do something",CR,LF00F21031  |.  FFD6          call    esi00F21033  |.  68 7421F200   push    00F22174                         ;  UNICODE "END, press any key to quit",CR,LF00F21038  |.  FFD6          call    esi00F2103A  |.  83C4 08       add     esp, 800F2103D  |.  5F            pop     edi00F2103E  |.  33C0          xor     eax, eax00F21040  |.  5E            pop     esi00F21041  \.  C3            retn

命令行不是固定的, 如何捕获参数

如果目标程序是带参数自己启动, 可以用OD带参数调试目标程序, 在目标程序参数检测逻辑中分析参数要求.

如果目标程序是有父进程给定参数启动, 用OD调试该父进程, 找出应给定目标程序什么参数.
然后再用OD给定该参数, 调试目标程序.




原创粉丝点击