需要帮助解释以下程序
嗨,我正在拆解程序的过程中,我似乎无法确定该程序的这一部分是做什么的。我知道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
感谢
什么这一段代码似乎是在做一个字符串第一字符计数,找一个空字符(在这种情况下两个字节)。它是一个“宽”字符串 - 也就是16位unicode,它基于每次在循环中递增eax两次的事实。它将长度存储在eax中,虽然我们看不到它,但看起来像edx有一个指向字符串开头的指针。从eax中减去edx以将eax从指针变为长度计数。
您为我们提供的其余代码使用wcsstr,它是一个函数,它在另一个宽字符串中查找一个宽字符串,并返回找到的位置。它正在与各种提供的字符串进行比较,当它通过测试eax来发现匹配以查看它是否非零时(测试eax,eax; jnz ...),它会在您为我们提供的内容后跳转到代码。
它似乎正在遍历基于它所比较的字符串的进程列表。我相信周围的代码会让这个更清晰。
我希望这会有所帮助。
第一段:空字符或“终止空”,不为空*字节*。 –
好,彼得。 Mea culpa。 – querist
你可以也应该编辑你的答案,以便在人们指出事情时改进它。我有时只是自己编辑旧的答案,但是对于人们来说,像我这样留下评论就更为典型了,尤其是,对于海报可能还在附近的新帖子。欢迎来到SO,BTW。 :) –
看起来像讨厌的Windows代码 - 似乎是将目标Unicode字符串转换为小写字母,然后搜索字符串,如“taskmgr”,“regedit”等。可能是来自恶意软件扫描程序的东西? –
您的反汇编程序足够友好,可以将该字符串打印为注释。因此,'push offset aTaskmgr'只是将字符串'taskmgr'的地址推送到堆栈,在这种情况下作为'_wcsstr'的参数。 – Jester