能力值:
( 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给定该参数, 调试目标程序.
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
谢谢o(∩_∩)o
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
谢谢,我也学了一招.
|