30/09/2018, 19:03

Biến cục bộ (local variable) hoạt động như thế nào khi ra khỏi scope?

Mình có đoạn code đơn giản như sau để test biến cục bộ.

#include <stdio.h>
  int *a = NULL;
  
  int call () {
       int b = 9;
       a = &b;
       return 1;
  }
  
  int main () {
       call ();
       printf ("%d
", *a);
       return 0;
 }

Từ trước tới giờ mình nghĩ là khi thoát ra khỏi hàm hoặc là gặp câu lệnh return thì vị trí bộ nhớ đó sẽ được gán là 0 và không sử dụng được nữa. Nhưng trong trường hợp này thì vị trí bộ nhớ cũ của biến b vẫn có giá trị cũ như khi đang còn ở trong hàm call. Mọi người có thể giải thích cho mình hiểu cách cấp phát và xóa tự động của biến cục bộ được không ạ? Mình xin cảm ơn.

while (!(sucesecd = try())) viết 21:06 ngày 30/09/2018

theo mình biết thì khi thực hiện xong một hàm các biến được định nghĩa trong hàm sẽ được giải phóng. giair phóng ở đây không có nghĩa là gán nó bằng 0(không cần thiết làm điều đó) mà vùng nhớ của biến đó sẽ không còn đc trỏ trong stack nữa, tức là bến khác có thể chiếm chỗ .

kiểu như bạn bạn được cấp mảnh đất cầm sổ đỏ của mảnh đát đó, bán có toàn quền với mảnh đất đó cho đến khi bạn trả lại sổ đỏ (return ) lúc đó mảnh đất vẫn còn nguyên vện nhưng k còn là của bạn nữa, thằng khác có thể tự do làm gì với mảnh đất đó. tất nhiên nếu vẫn giữ địa chỉ mảnh đát (*a) bạn có thể lôi nó ra đung thoải mái , cái này nguy hiểm lắm

Nguyễn Văn Dũng viết 21:12 ngày 30/09/2018

Cái này thì minh cũng biết. Nhưng mình nghĩ tới trường hợp bằng cách nào đó người khác biết được địa chỉ mà mình đã dùng trong chương trình. và dùng được dữ liệu đó (dò rỉ thông tin). Liệu có thể nào có trường hợp đó không nhỉ?

while (!(sucesecd = try())) viết 21:05 ngày 30/09/2018

theo lý tuyết là có, cái này còn tùy trình compile. nếu có 1 chương trình đã dịch, có các công cụ dịch ngược chương trình (reveser) sau đó suer dụng mmọt số tool debug như Onlydbg để theo dõi các biến được khởi tạo trong qúa trình chạy. từ đó có thể theo dõi gía trị các biến.

các trình dịch bây giờ có các cơ chế riêng để hạn chế điều này

Thành Phạm viết 21:16 ngày 30/09/2018

Mình nghĩ chưa cần dịch ngược đã có thể theo dõi được giá trị biến rồi ấy chứ:smile: kiểu giống mấy cái cheat game off á:smile:

while (!(sucesecd = try())) viết 21:12 ngày 30/09/2018

thì bạn có code mà cần gì dịch ngược , ừ đấy chính là cơ chế hoạt động của mấy tool cheat game như CheatEnngine

Nguyễn Văn Dũng viết 21:19 ngày 30/09/2018

Thế có cách nào để hạn chế được người dùng xâm nhập được vào phần mềm của mình không? Hay là do trình độ mình chưa đủ nên mình không biết cách nhỉ?

while (!(sucesecd = try())) viết 21:19 ngày 30/09/2018

cách thì có nhiều ban có thể tham khảo ở quyên sách này: http://www.codeproject.com/Articles/30815/An-Anti-Reverse-Engineering-Guide.

cái này thuộc về các chuyên gia bảo mật rồi dev quản không nổi. mà người pro mấy cái dịch ngược này cũng không nhiều (không nghiều nhưng phần mềm nào cũng bị crack ). những chương trình bình thường thì dịch ra là an toàn chán rồi, còn nếu bạn muốn làm về bảo mật thì mới cần tìm hiểu sâu. mình cũng chỉ biết sợ sơ vậy

Bài liên quan
0