首页
社区
课程
招聘
[原创]通用版本EXE自删除代码..TASM代码..学习使用堆践存储数据
2006-4-3 15:35 10951

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

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


阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

收藏
免费 7
打赏
分享
最新回复 (15)
雪    币: 159
活跃值: (339)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
Lenus 3 2006-4-3 17:32
2
0
呵呵,原来原理是这样!C:\WINDOWS\system32\cmd.exe /c del "E:\CODE_T~1\asm\del_self.exe"
测试成功,谢谢
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
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);
}
雪    币: 159
活跃值: (339)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
Lenus 3 2006-4-4 12:39
4
0
最初由 dwing 发布
我认为还是这样的代码看起来方便:
[CODE]
#include <windows.h>
void main()
{
........

原来可以少写一个引号的
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
GMest 2006-4-4 12:49
5
0
值得收藏,好帖
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
dwing 1 2006-4-5 10:43
6
0
这个程序必须在执行WinExec之后马上退出,否则就会删除失败.
雪    币: 1272
活跃值: (746)
能力值: ( LV13,RANK:810 )
在线值:
发帖
回帖
粉丝
Anskya 20 2006-4-7 11:59
7
0
写个过程扔在程序最后面~没办法暂时没有找到程序还在运行.他就可以删除的方法~~
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xinix 2006-4-7 19:00
8
0
让程序放出批处理来删除不是更方便

雪    币: 159
活跃值: (339)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
Lenus 3 2006-4-8 15:07
9
0
最初由 xinix 发布
让程序放出批处理来删除不是更方便


批处理,不是有个console吗...这样不是很好看...
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
北极星2003 25 2006-4-17 14:25
10
0
最初由 dwing 发布
我认为还是这样的代码看起来方便:
[CODE]
#include <windows.h>
void main()
{
........


简洁、清晰的代码!
值得学习,收藏
雪    币: 179
活跃值: (131)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
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);
}
雪    币: 1272
活跃值: (746)
能力值: ( LV13,RANK:810 )
在线值:
发帖
回帖
粉丝
Anskya 20 2006-4-17 17:20
12
0
这也算??
那我还有更简单的..
begin
  WinExec(Pchar('cmd /c del ' + GetCommandLine),0);
end;
雪    币: 179
活跃值: (131)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
WAKU 7 2006-4-17 17:28
13
0
这什么语言?
雪    币: 291
活跃值: (208)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
thebutterfly 5 2006-4-18 14:38
14
0
Delphi
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
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);
}
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
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.
游客
登录 | 注册 方可回帖
返回