首页
论坛
专栏
课程

[原创]通用版本EXE自删除代码..TASM代码..学习使用堆践存储数据

2006-4-3 15:35 9130

[原创]通用版本EXE自删除代码..TASM代码..学习使用堆践存储数据

2006-4-3 15:35
9130
第一次用堆践存放数据..学了一点花招..
比如如何不用声明压入一个字符串
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



[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最新回复 (15)
Lenus 3 2006-4-3 17:32
2
0
呵呵,原来原理是这样!C:\WINDOWS\system32\cmd.exe /c del "E:\CODE_T~1\asm\del_self.exe"
测试成功,谢谢
dwing 1 2006-4-4 09:05
3
0
我认为还是这样的代码看起来方便:
#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);
}
Lenus 3 2006-4-4 12:39
4
0
最初由 dwing 发布
我认为还是这样的代码看起来方便:
[CODE]
#include <windows.h>
void main()
{
........

原来可以少写一个引号的
GMest 2006-4-4 12:49
5
0
值得收藏,好帖
dwing 1 2006-4-5 10:43
6
0
这个程序必须在执行WinExec之后马上退出,否则就会删除失败.
Anskya 20 2006-4-7 11:59
7
0
写个过程扔在程序最后面~没办法暂时没有找到程序还在运行.他就可以删除的方法~~
xinix 2006-4-7 19:00
8
0
让程序放出批处理来删除不是更方便

Lenus 3 2006-4-8 15:07
9
0
最初由 xinix 发布
让程序放出批处理来删除不是更方便


批处理,不是有个console吗...这样不是很好看...
北极星2003 25 2006-4-17 14:25
10
0
最初由 dwing 发布
我认为还是这样的代码看起来方便:
[CODE]
#include <windows.h>
void main()
{
........


简洁、清晰的代码!
值得学习,收藏
WAKU 7 2006-4-17 16:55
11
0
再来个更简单的:
#include <windows.h>

void main()
{
        char str[1024];
        wsprintfA(str, "cmd /c del %s", _pgmptr);
        WinExec(str, 0);
}
Anskya 20 2006-4-17 17:20
12
0
这也算??
那我还有更简单的..
begin
  WinExec(Pchar('cmd /c del ' + GetCommandLine),0);
end;
WAKU 7 2006-4-17 17:28
13
0
这什么语言?
thebutterfly 5 2006-4-18 14:38
14
0
Delphi
dwing 1 2006-4-20 09:03
15
0
我也来个一行的:
#include<windows.h>
#include<string>
void main()
{
    WinExec((std::string("cmd /c del ")+_pgmptr).c_str(),0);
}
dwing 1 2006-4-20 09:16
16
0
最初由 Anskya 发布
WinExec(Pchar('cmd /c del ' + GetCommandLine),0);

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

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

自定义入口的程序不能外部变量_pgmptr.
游客
登录 | 注册 方可回帖
返回