Giả sử tôi có một chức năng:C: Ghi đè lên một chức năng byte bởi byte
int f1(int x){
// some more or less complicated operations on x
return x;
}
Và rằng tôi có chức năng khác
int f2(int x){
// we simply return x
return x;
}
Tôi muốn để có thể làm điều gì đó như sau :
char* _f1 = (char*)f1;
char* _f2 = (char*)f2;
int i;
for (i=0; i<FUN_LENGTH; ++i){
f1[i] = f2[i];
}
Tức là Tôi muốn giải thích f1
và f2
làm mảng byte thô và "ghi đè f1
byte theo byte" và do đó, thay thế bằng f2
.
Tôi biết rằng mã thường có thể gọi được bảo vệ chống ghi, tuy nhiên, trong trường hợp cụ thể của tôi, bạn chỉ cần ghi đè vị trí bộ nhớ nơi đặt f1
. Tức là, tôi có thể sao chép các byte lên trên f1
, nhưng sau đó, nếu tôi gọi f1
, toàn bộ sự cố sẽ bị treo.
Vì vậy, phương pháp tiếp cận của tôi có thể về nguyên tắc không? Hoặc có một số máy/thực hiện/bất kỳ vấn đề phụ thuộc nào mà tôi phải cân nhắc không?
Tôi tin rằng "mã có thể gọi được bảo vệ chống ghi" là câu trả lời cho lý do tại sao nó không thành công. Tôi nghi ngờ tôi là người đầu tiên nói điều này, nhưng tự sửa đổi mã thường là một ý tưởng khủng khiếp hoặc một triệu chứng của một lỗi. – DwB
@DwB Như tôi đã đề cập trong câu hỏi của mình, tôi phát hiện ra rằng tôi * có thể * ghi vào phần mà các chức năng được lưu trữ. Chỉ cần * gọi * biến thể ghi đè dẫn đến sự cố. – phimuemue
Ngoài ra, hãy xem xét rằng f1 có lẽ dài hơn f2 ... tức là được tạo thành từ nhiều byte –