整个程序的流程是--判断用户输入参数--判断输入的条件,以此判断操作系统--写脚本对注册表操作执行。下面我挑一小段主要的来分析:
.text:004014C9 mov [esp+0A8h+var_A4], offset s_0 ; "0"
.text:004014D1 mov eax, [eax]
.text:004014D3 mov [esp+0A8h+var_A8], eax
.text:004014D6 call strcmp
;参数直接放在寄存器里传递,而不是同过堆栈。对比一下作者的命令是否0
;dec的编译器使用的是不同于Intel的命令
.text:004014D6
.text:004014DB test eax, eax ;返回值,然后跳到loc_401514
.text:004014DD jnz short loc_401514
.text:00401514 loc_401514:
.text:00401514 mov [esp+0A8h+var_A8], offset s_EchoWindowsRe ; "echo Windows ;Registry Editor Version 5."...
.text:0040151B call system
.text:0040151B
.text:00401520 mov [esp+0A8h+var_A8], offset s_Echo_>>amethy ; "echo. ;>>amethyst.reg"
.text:00401527 call system
.text:00401527
重组代码:
#include <stdio.h>
#include <windows.h>
void main(int argc, char *argv[])
{
char buff[]="0";
if(argc!=2)
{
printf("Usage: %s 0 \n",argv[0]);
printf("Example: %s 0\n",argv[0]);
exit(0);
}
int ret = strcmp(buff,argv[1]);
if (ret=NULL)
{
system("echo Windows Registry Editor Version 5.00 >>amethyst.reg");
system("echo. >>amethyst.reg");
return;
}
}