我正在控制台Windows可执行文件上工作。到目前为止,我知道的是可执行文件检查了命令行参数的数量。然后,它根据传递的参数数量(argv)分支。使用某种动态构建的跳转表来查找跳转。找出所有可能的命令行参数似乎是一项艰巨的任务。看起来二进制文件仅在特定数量的特定参数被解析时才执行。我已经使用strings实用程序收集了一些可能的选项。

是否存在用于反转命令行参数的一般路线图?有什么可能的方法来扭转它们?有没有可以使用的工具?

评论

如果仅基于数字,则尝试每个小数字。

#1 楼

如果您确定了argv和argc以及其中的值,那么您就走了一半。从argc的值中,您可以了解应该传递多少个参数,从argv的值中,您可以确定“应”传递的内容。 />
70 _main           proc near               ; CODE XREF: _main_0j
.text:00401070
.text:00401070 var_44          = byte ptr -44h
.text:00401070 var_4           = dword ptr -4
.text:00401070 arg_0           = dword ptr  8
.text:00401070 arg_4           = dword ptr  0Ch
.text:00401070
.text:00401070                 push    ebp
.text:00401071                 mov     ebp, esp
.text:00401073                 sub     esp, 44h
.text:00401076                 push    ebx
.text:00401077                 push    esi
.text:00401078                 push    edi
.text:00401079                 lea     edi, [ebp+var_44]
.text:0040107C                 mov     ecx, 11h
.text:00401081                 mov     eax, 0CCCCCCCCh
.text:00401086                 rep stosd
.text:00401088                 cmp     [ebp+arg_0], 2
.text:0040108C                 jge     short loc_4010A0
.text:0040108E                 push    offset aCheckUsage ; "check usage"
.text:00401093                 call    _printf
.text:00401098                 add     esp, 4
.text:0040109B                 or      eax, 0FFFFFFFFh
.text:0040109E                 jmp     short loc_4010DB


如您所见,存在cmp [ebp+arg_0], 2,这意味着至少我们必须传递一个“参数”,然后才有jqe(如果大于或等于则跳转)。所以我们将使用一个参数调用程序以传递此条件,因此我们将位于loc_4010A0中,这是代码。这一次使用strcmp,在此之前,我们将推入str和arg_4,这是我们实际的参数向量。

您可以真正轻松地使用静态和动态分析来分析参数,但是您需要牢记一些注意事项。传递
参数的类型
参数的位置(argv)

这里还有一些附加说明,有时我们“请勿”使用argc / argv获取命令行参数我们也可以使用Windows API,例如GetCommandLine等。您还必须检查参数的接收和解析方式。