需要帮助解释以下程序

问题描述:

嗨,我正在拆解程序的过程中,我似乎无法确定该程序的这一部分是做什么的。我知道eax是一个寄存器,并且推送eax把它放到堆栈等等,但是推动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 

感谢

+0

看起来像讨厌的Windows代码 - 似乎是将目标Unicode字符串转换为小写字母,然后搜索字符串,如“taskmgr”,“regedit”等。可能是来自恶意软件扫描程序的东西? –

+2

您的反汇编程序足够友好,可以将该字符串打印为注释。因此,'push offset aTaskmgr'只是将字符串'taskmgr'的地址推送到堆栈,在这种情况下作为'_wcsstr'的​​参数。 – Jester

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

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

它似乎正在遍历基于它所比较的​​字符串的进程列表。我相信周围的代码会让这个更清晰。

我希望这会有所帮助。

+1

第一段:空字符或“终止空”,不为空*字节*。 –

+0

好,彼得。 Mea culpa。 – querist

+0

你可以也应该编辑你的答案,以便在人们指出事情时改进它。我有时只是自己编辑旧的答案,但是对于人们来说,像我这样留下评论就更为典型了,尤其是,对于海报可能还在附近的新帖子。欢迎来到SO,BTW。 :) –