第一次用堆践存放数据..学了一点花招..
比如如何不用声明压入一个字符串
push 000434550h
push 0534d4f43h
mov eax,esp
这里是压入一个
ASCII "COMSPEC"

代码:
callw      macro   x      extern C x:DWORD      call x endm .586 .model flat locals @@ public C Start .data      msg      db ' /c del "',0      Cmd dd 0 .code Start:      pushad      mov ebp,esp            ;从VC中学来的~保存当前堆践寄存器            sub esp,150h               mov esi,esp            ;申请一块空间来用               push 000434550h      push 0534d4f43h      mov eax,esp            ;压入ASCII "COMSPEC"         push 100h      push esi      push eax      callw GetEnvironmentVariableA  ;取环境变量...cmd的路径            push offset msg      push esi      callw lstrcatA          ;连接字符串      mov Cmd,eax            sub esp,150h      mov edi,esp      push 100h      push edi      push 0      callw GetModuleFileNameA  ;取自身路径            push 100h      push edi      push edi      callw GetShortPathNameA   ;取段文件名            push edi      push Cmd      callw lstrcatA             ;还是连接字符串            push 0022h      mov eax,esp                ;字符串最后+上一个"            push eax      push Cmd      callw lstrcatA            push 0      push eax      callw WinExec              ;执行自删除指令                        mov esp,ebp                ;恢复ESP数值..感谢VC      popad                      ;恢复个寄存器的数值      ret                         end Start

  • 标 题:答复
  • 作 者:Lenus
  • 时 间:2006-04-03 17:32

呵呵,原来原理是这样!C:\WINDOWS\system32\cmd.exe /c del "E:\CODE_T~1\asm\del_self.exe"
测试成功,谢谢

  • 标 题:答复
  • 作 者:dwing
  • 时 间:2006-04-04 09:05

我认为还是这样的代码看起来方便:

代码:
#include <windows.h> void main() {     char cmd[1024];     GetEnvironmentVariable("ComSpec",cmd,1024);     GetModuleFileName(GetModuleHandle(0),cmd+lstrlen(lstrcat(cmd," /c del \"")),512);     WinExec(cmd,0); }

  • 标 题:答复
  • 作 者:Anskya
  • 时 间:2006-04-17 17:20

这也算??
那我还有更简单的..

代码:
begin   WinExec(Pchar('cmd /c del ' + GetCommandLine),0); end;

  • 标 题:答复
  • 作 者:dwing
  • 时 间:2006-04-20 09:03

我也来个一行的:

代码:
#include<windows.h> #include<string> void main() {     WinExec((std::string("cmd /c del ")+_pgmptr).c_str(),0); }

  • 标 题:答复
  • 作 者:dwing
  • 时 间:2006-04-20 09:16

引用: 最初由 Anskya 发布
 WinExec(Pchar('cmd /c del ' + GetCommandLine),0);

小心如果其它文件名作参数会连那个文件一起删除.
如果有其它非文件名作参数,删除可能失败.

引用: 最初由 WAKU 发布
wsprintfA(str, "cmd /c del %s", _pgmptr);

自定义入口的程序不能外部变量_pgmptr.