程序的自我改写
来源:互联网 发布:java反射机制原理 编辑:程序博客网 时间:2024/05/17 04:47
曾经,程序的自动改写是每个黑客必备的知识,因为这样可以有效的节约内存,下面是在现代的GNU/Linux 操作系统上实现的程序自我改写。
列一下环境:
speller@SHELL-LAB:~/code/c$ egrep "model name" /proc/cpuinfo | uniq -c
2 model name : Pentium(R) Dual-Core CPU E6300 @ 2.80GHz
speller@SHELL-LAB:~/code/c$ uname -sr
Linux 2.6.35.10-smp
speller@SHELL-LAB:~/code/c$ gcc --version | grep GCC
gcc (GCC) 4.4.4
speller@SHELL-LAB:~/code/c$
上代码:
效果如下:
speller@SHELL-LAB:~/code/c$ gcc -o self-modification self-modification.c
speller@SHELL-LAB:~/code/c$ ./self-modification
第<1>次执行函数func:
你只能在第<1>次执行函数func 的时候看到这条消息
——因为程序对自身的代码进行了修改。
这条消息应该在每次调用函数func 的时候都被输出到stdout。
第<2>次执行函数func:
这条消息应该在每次调用函数func 的时候都被输出到stdout。
第<3>次执行函数func:
这条消息应该在每次调用函数func 的时候都被输出到stdout。
speller@SHELL-LAB:~/code/c$
程序自身对自身的指令进行修改,有点黑客帝国的味道,不是么 ;p
列一下环境:
speller@SHELL-LAB:~/code/c$ egrep "model name" /proc/cpuinfo | uniq -c
2 model name : Pentium(R) Dual-Core CPU E6300 @ 2.80GHz
speller@SHELL-LAB:~/code/c$ uname -sr
Linux 2.6.35.10-smp
speller@SHELL-LAB:~/code/c$ gcc --version | grep GCC
gcc (GCC) 4.4.4
speller@SHELL-LAB:~/code/c$
上代码:
- /*
- * 文件名: self-modification.c
- * 备注: 一个可以修改自身代码的小程序 ;p
- */
- #include <stdio.h>
- #include <unistd.h>
- #include <sys/mman.h>
- void func (void);
- int main
- (int argc, char *argv[]) {
-
- int count = 0;
- for (count = 0; count < 3; ++count) {
- printf ("第<%d>次执行函数func:\n", count+1);
- func ();
- }
- return 0;
- }
- void func
- (void) {
- __asm__ __volatile__ (
- "slot:\n"
- "nop\nnop\n" /* 这两个nop 指令用来为下面的自动改写留出位置 */
- "after_slot:\n"
- );
- puts ("\t你只能在第<1>次执行函数func 的时候看到这条消息\n"
- "\t\t——因为程序对自身的代码进行了修改。\n");
-
- /* 将函数func 的堆栈属性设置为可读写、可执行 */
- int pagesize = (int)sysconf (_SC_PAGESIZE);
- char *p = (char *)((int)func & ~(pagesize - 1));
- mprotect (p, pagesize * 10, PROT_READ | PROT_WRITE | PROT_EXEC);
-
- /* 进行自我改写 */
- __asm__ __volatile__ (
- ".byte 0xe8, 0, 0, 0, 0\n" /* 0xe8 是call 指令,把popl 指令当作函数调用 */
- "popl %%eax\n" /* popl 出栈的是popl 指令自身的地址 */
- "addl $20, %%eax\n" /* 定位到第二个puts 函数 */
- "subl $after_slot, %%eax\n"/* 得到第二个puts 函数相对于after_slot 标签的偏移 */
- "shl $8, %%eax\n" /* 这里是little endian 系统 */
- "movb $0xeb, %%al\n" /* 0xeb 是jmp 指令,%ax 里现在是 <jmp 偏移 >*/
- "movw %%ax, slot" /* 填充先前两个nop 指令预留出的空间 */
- :
- :
- : "eax"
- );
- puts ("\t这条消息应该在每次调用函数func 的时候都被输出到stdout。\n");
-
- return;
- }
speller@SHELL-LAB:~/code/c$ gcc -o self-modification self-modification.c
speller@SHELL-LAB:~/code/c$ ./self-modification
第<1>次执行函数func:
你只能在第<1>次执行函数func 的时候看到这条消息
——因为程序对自身的代码进行了修改。
这条消息应该在每次调用函数func 的时候都被输出到stdout。
第<2>次执行函数func:
这条消息应该在每次调用函数func 的时候都被输出到stdout。
第<3>次执行函数func:
这条消息应该在每次调用函数func 的时候都被输出到stdout。
speller@SHELL-LAB:~/code/c$
程序自身对自身的指令进行修改,有点黑客帝国的味道,不是么 ;p
0
上一篇:S3C2440A IIC驱动(AT24c04)
下一篇:Linux常用命令(不定期更新)
相关热门文章
- iOS学习之iOS沙盒(sandbox)文...
- windows C 与 linux C区别?...
- C++的异常处理
- Linux V4L2驱动架构 一
- java之路,IO操作
- 承接自动化测试培训、外包、实...
- Solaris PowerTOP 1.0 发布
- For STKMonitor
- busybox的httpd使用CGI脚本(Bu...
- 项目小体会
- 修改默认端口为222,centos自...
- 用PHP做一个ftp登录页面...
- Toad for Oracle工具,为什么在...
- 本地win7安装vmw9系统winserv...
- powermt config是所什么用的...
给主人留下些什么吧!~~
评论热议
- 程序的自我改写
- 程序的自我改写
- 测试程序的改写
- 程序的自动改写
- 改写Hadoop的wordcount程序
- ClamWin杀毒程序的改写
- 程序的自我修改
- 程序的自我修改
- 程序的自我删除
- 自我打印的C程序
- 自我打印的C程序
- 程序的自我修改收藏
- python程序的自我复制
- 程序媛的自我修养
- 程序猿的自我感想
- mfc框架编写的c++程序 要求改写一下
- 用QT改写以前的短信编码程序及心得体会
- 有关The Last Promise的汉化②改写程序
- debian下启动telnet服务
- 在linux内核驱动树中添加自己的驱动
- windows ssh登录debian
- S3C2440A IIC驱动(AT24c04)
- putty远程ssh到linux
- 程序的自我改写
- Linux常用命令(不定期更新)
- java中调用C语言代码
- svn服务器部署
- hdu 1397 Goldbach's Conjecture
- String.prototype实现的一些javascript函数介绍
- apt命令
- debian 5常用软件包名称,及安装方法
- debian NFS服务器架设
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
电脑总蓝屏
系统蓝屏
蓝屏原因
手机蓝屏
启动蓝屏
netio蓝屏
电脑蓝屏怎么一键恢复
电脑蓝屏按f2解决步骤
电脑开机蓝屏一键修复
笔记本电脑蓝屏
电脑开机蓝屏怎么解决
电脑突然蓝屏
电脑老是蓝屏
电脑蓝屏按什么键恢复
电脑蓝屏原因
笔记本蓝屏怎么解决
电脑经常蓝屏
电脑蓝屏代码
电脑蓝屏解决方法
电脑总是蓝屏
电脑一直蓝屏
电脑启动蓝屏
电脑开机就蓝屏
电脑蓝屏重启
电脑开机蓝屏进不去桌面
电脑出现蓝屏
win7电脑蓝屏修复按哪个健
蓝屏解决方法
电脑蓝屏怎么回事
台式电脑蓝屏怎么解决
蓝屏代码大全
一开机就蓝屏怎么解决
笔记本开机蓝屏
电脑蓝屏恢复
电脑开机就蓝屏进不去
蓝屏代码0x000008e
电脑总是蓝屏怎么解决
手提电脑蓝屏怎么解决
电脑频繁蓝屏
蓝屏代码0x000006b
电脑蓝屏代码大全