自毁程序设计:运行n次后自动销毁

需积分: 31 10 下载量 45 浏览量 更新于2024-09-11 1 收藏 54KB DOC 举报
"该资源提供了一个简易自毁程序的实现,该程序在运行指定次数后会自动删除自身。程序通过数据文件中的关键字来隐藏计数基数,以避免轻易被检测到。程序的主要功能是将十进制数转换为二进制,这个功能作为子函数集成在自毁主函数kill()中。用户可以根据需要调整使用次数的限制,程序启动时会显示剩余使用次数。开发环境为VC++6.0,需要原始data.dat文件配合运行。" 此简易自毁程序的核心思路是利用数据文件中的隐藏信息来记录使用次数,以避免直接使用显式的计数器。程序首先读取数据文件,查找关键字并解析出计数基数,然后根据基数判断是否已达到预设的自毁条件。在这个例子中,原始数据文件"data.dat"包含一串字符,其中包含隐藏的计数基数。当程序运行时,它会检查特定位置的字符(如'3'和'0'),并通过这些字符来确定基数。 程序的关键部分是`TranDectoBin()`子函数,它负责将十进制数转换为二进制表示。这个功能虽然不是程序的主要目的,但作为示例,它展示了如何在一个函数中实现特定任务。主函数`kill()`中包含了自毁逻辑,通过检查某些条件(如字符的ASCII值)来判断是否达到自毁条件。例如,如果某个字符的ASCII值不在指定范围内,程序将调用`kill()`函数进行自毁操作。 为了实现自毁,程序在每次启动时会更新数据文件,将使用过的数据文件替换为原始的未使用版本。这样,即使有人试图分析程序的运行情况,也无法直接看到计数器的增加,因为计数信息已经转移到了数据文件中。 需要注意的是,实际的自毁机制可能涉及更复杂的安全措施,如加密、散列或分布式存储,以防止数据被篡改或恢复。此外,由于程序的自毁功能依赖于VC++6.0环境,这意味着它可能不适用于其他编译器或运行环境。在实际应用中,应考虑兼容性和安全性,以及遵守相关的法律法规,确保自毁程序的使用不会侵犯用户隐私或违反相关法规。
2018-09-11 上传
自毁程序是一些电脑高手编写的可执行代码,没有现成的。我给个代码你看一下,如果你能看懂就可以用了。面的代码由Gary Nebbett写就.Gary Nebbett乃是WINDOWS NT/2000 NATIVE API REFERENCE的作者.乃NT系统一等一的高手.下面就分析一些他的这段代码. 这段代码在PROCESS没有结束前就将启动PROCESS的EXE文件删除了. int main(int argc, char *argv[]) { HMODULE module = GetModuleHandle(0); CHAR buf[MAX_PATH]; GetModuleFileName(module, buf, sizeof buf); CloseHandle(HANDLE(4)); __asm { lea eax, buf push 0 push 0 push eax push ExitProcess push module push DeleteFile push UnmapViewOfFile ret } return 0; } 现在,我们先看一下堆栈中的东西 偏移 内容 24 0 20 0 16 offset buf 12 address of ExitProcess 8 module 4 address of DeleteFile 0 address of UnmapViewOfFile 调用RET返回到了UnmapViewOfFile,也就是栈里的偏移0所指的地方.当进入UnmapViewOfFile的流程时,栈里见到的是返回地址DeleteFile和HMODUL module.也就是说调用完毕后返回到了DeleteFile的入口地址.当返回到DeleteFile时,看到了ExitProcess的地址,也就是返回地址.和参数EAX,而EAX则是buffer.buffer存的是EXE的文件名.由GetModuleFileName(module, buf, sizeof buf)返回得到.执行了DeleteFile后,就返回到了ExitProcess的函数入口.并且参数为0而返回地址也是0.0是个非法地址.如果返回到地址0则会出错.而调用ExitProcess则应该不会返回. 这段代码的精妙之处在于: 1.如果有文件的HANDLE打开,文件删除就会失败,所以,CloseHandle(HANDLE(4));是十分巧妙的一手.HANDLE4是OS的硬编码,对应于EXE的IMAGE.在缺省情况下,OS假定没有任何调用会关闭IMAGE SECTION的HANDLE,而现在,该HANDLE被关闭了.删除文件就解除了文件对应的一个句柄. 2.由于UnmapViewOfFile解除了另外一个对应IMAGE的HANDLE,而且解除了IMAGE在内存的映射.所以,后面的任何代码都不可以引用IMAGE映射地址内的任何代码.否则就OS会报错.而现在的代码在UnmapViewOfFile后则刚好没有引用到任何IMAGE内的代码. 3.在ExitProcess之前,EXE文件就被删除了.也就是说,进程尚在,而主线程所在的EXE文件已经没了.(WINNT/9X都保护这些被映射到内存的WIN32 IMAGE不被删除.)