코드가 정확하지만 OS가 0x12345678을 읽기 전용으로 정의하면 런타임시 오류가 발생할 수 있습니다.
"일반"OS는 그렇게하지만 "더 가벼운"OS는 그렇지 않습니다.
커널 - 해킹 프로그램을 작성하고 싶습니다.
1)이 모듈을 구축 (예 : 당신이 살펴보고 좋아하면
나는 리눅스를 위해 그것을 해결했다.코) :
#include <linux/module.h>
#include <linux/fs.h> /* for file_operations */
#include <linux/uaccess.h> /* copy_from & copy_to */
char* g_value=0;
size_t size =0;
int driver_open(struct inode *inode, struct file *filp)
{
printk("open driver");
return 0;
}
int driver_write(struct file*, /*ignored*/
const char __user *umem,/*source in user-space's address*/
size_t size, /*max size to be writen*/
loff_t*) /*offset - ignored*/
{
unsigned long ret = 0;
g_value = (char*) kmalloc(size, GFP_KERNEL);
if (!g_value)
{
printk("ERROR:allocation failure\n");
return -ENOMEM;
}
ret = copy_from_user(g_value, /*destination*/
umem, /*source*/
size); /*size*/
if (ret<0)
{
printk("ERROR:copy failure\n");
return -EACCES;
}
return g_size = size;;
}
int driver_read(struct file*, /*ignored*/
char __user *umem, /*destination in user-space's address*/
size_t size, /*max size to be read*/
loff_t*) /*offset - ignored*/
{
/* don't use copy_to_user(umem, &value, size)!!
we want to do exectly what it is made to protect from */
int i = ((g_size>size)?size:g_size)-1; /*MIN(g_size,size)-1*/
for (; i>=0; --i)
{
umem[i]=g_value[i]; /*can be done more effectively, thats not the point*/
}
return size;
}
int driver_close(struct inode *inode, struct file *filp)
{
if (g_value)
free(g_value);
g_value = 0;
printk("close driver");
return 0;
}
/***interface***/
struct file_operations driver_ops = {
open: driver_open,
write: driver_write,
read: driver_read,
release: driver_close
};
/***implementation***/
static int g_driver_fd = 0;
static void driver_cleanup(void)
{
printk("ERROR:driver exit\n");
unregister_chrdev(g_driver_fd, "driver");
}
static int driver_init(void)
{
printk("driver init\n");
g_driver_fd = register_chrdev(0,"ROM-bypass", &driver_ops);
if (g_driver_fd<0)
{
printk("ERROR:failed to register char driver\n");
return -1;
}
return 0;
}
module_init(driver_init);
module_exit(driver_cleanup);
/***documentation***/
MODULE_DESCRIPTION("write on OS's \"read only\" segment");
MODULE_AUTHOR("Elkana Bronstein");
MODULE_LICENSE("GPL");
2) 커널 모듈에 추가 :
$cat /proc/devices
4) 노드와 관련된합니다
$insmod example.ko
3) 목록에서 모듈의 '주요'발견 장치 :
$mknod /dev/rom_bypass c <major> <minor>
'c'는 문자 d evice과 '미성년자') 255
5 중 하나가 될 수있는 파일로 코드에서 장치를 사용할 수 있습니다 : (거의) 불가능 메모리 위치를 작성하는 데 사용할 수있는 알 수있다
int main()
{
int fd;
int value = 0;
fd = open("/dev/rom_bypass",O_RDWR);
if (fd<0)
{
fprintf(stderr,"open failed");
return -1;
}
/*write the desirable value into the device's buffer*/
write(fd,&value,sizeof(value));
/*read the device's buffer into the desirable object - without checking*/
read(fd,0x12345678,sizeof(value));
close(fd);
}
이들은 모두 내 질문에 실제로 적용됩니다. 나는 (열린) 질문에 대해 내가 무엇을 이야기해야 하는지를 알고 싶다. –