需要帮助解释以下程序

时间:2016-03-08 22:37:05

标签: assembly disassembly

您好我正在拆分程序,我似乎无法确定程序的这一部分是什么意思。我知道eax是一个寄存器,push eax把它放到堆栈上等,但是push offset aTaskmgr做了什么?

非常感谢您的解释。

.text:00404867 loc_404867:                             ; CODE XREF: .text:00404870j
.text:00404867                 mov     cx, [eax]
.text:0040486A                 add     eax, 2
.text:0040486D                 test    cx, cx
.text:00404870                 jnz     short loc_404867
.text:00404872                 sub     eax, edx
.text:00404874                 sar     eax, 1
.text:00404876                 jz      loc_404927
.text:0040487C                 lea     ecx, [esp+1389Ch]
.text:00404883                 push    ecx
.text:00404884                 call    __wcslwr
.text:00404889                 push    offset aTaskmgr ; "taskmgr"
.text:0040488E                 push    eax
.text:0040488F                 call    _wcsstr
.text:00404894                 add     esp, 0Ch
.text:00404897                 test    eax, eax
.text:00404899                 jnz     short loc_404917
.text:0040489B                 lea     edx, [esp+1389Ch]
.text:004048A2                 push    edx
.text:004048A3                 call    __wcslwr
.text:004048A8                 push    offset aProcexp ; "procexp"
.text:004048AD                 push    eax
.text:004048AE                 call    _wcsstr
.text:004048B3                 add     esp, 0Ch
.text:004048B6                 test    eax, eax
.text:004048B8                 jnz     short loc_404917
.text:004048BA                 lea     eax, [esp+1389Ch]
.text:004048C1                 push    eax
.text:004048C2                 call    __wcslwr
.text:004048C7                 push    offset aRegedit ; "regedit"
.text:004048CC                 push    eax
.text:004048CD                 call    _wcsstr
.text:004048D2                 add     esp, 0Ch
.text:004048D5                 test    eax, eax
.text:004048D7                 jnz     short loc_404917
.text:004048D9                 lea     ecx, [esp+1389Ch]
.text:004048E0                 push    ecx
.text:004048E1                 call    __wcslwr
.text:004048E6                 push    offset aMsconfig ; "msconfig"
.text:004048EB                 push    eax
.text:004048EC                 call    _wcsstr
.text:004048F1                 add     esp, 0Ch
.text:004048F4                 test    eax, eax
.text:004048F6                 jnz     short loc_404917
.text:004048F8                 lea     edx, [esp+1389Ch]
.text:004048FF                 push    edx
.text:00404900                 call    __wcslwr
.text:00404905                 push    offset aCmd_exe ; "cmd.exe"
.text:0040490A                 push    eax
.text:0040490B                 call    _wcsstr
.text:00404910                 add     esp, 0Ch
.text:00404913                 test    eax, eax
.text:00404915                 jz      short loc_404920

由于

1 个答案:

答案 0 :(得分:3)

这段代码似乎正在做的是首先计算字符串中的字符,寻找空字符(在这种情况下为两个字节)。它是一个“宽”字符串 - 即16位unicode,基于它每次在循环周围将eax递增2的事实。它将长度存储在eax中,虽然我们看不到它,但看起来edx有一个指向字符串开头的指针。从eax中减去edx以将指针中的eax转换为长度计数。

您提供给我们的其余代码使用wcsstr,这是一个在另一个宽字符串中查找一个宽字符串的函数,返回找到它的位置。它正在与各种提供的字符串进行比较,当它通过测试eax找到匹配项以查看它是否为非零(测试eax,eax; jnz ...)时,它会在您为我们提供的内容之后跳转到代码。

它似乎是根据它所比较的​​字符串遍历一个进程列表。我相信周围的代码会使其余的更清晰。

我希望这会有所帮助。