Khi chạy các app được viết bằng DotNet, JIT Compiler sẽ biên dịch IL thành mã máy.
Điều đặc biệt ở đây là: JIT Compiler không bao giờ đảm bảo rằng biên dịch trong mọi thời điểm thì sẽ ra mã máy giống nhau.
(Thậm chí khi build file exe cũng không đảm bảo cùng một mã nguồn thì sẽ ra cùng 1 file exe).
Nguồn: https://blogs.msdn.microsoft.com/ericlippert/2012/05/31/past-performance-is-no-guarantee-of-future-results/
Minh nghĩ là ví dụ nếu có biến a, lần JIT Compile thứ 1 được push vào vị trí số 3 trong stack, lần JIT Compile sau này có thể nó sẽ được push vào vị trí số 10 (tức là mã máy thay đổi so với lần đầu).
Ví dụ mình có cái game dùng DotNet, dùng cheat engine để dò tọa độ X của player, thì mình được dãy pointer kiểu như này:
threadstack0[-0x000007F8][0x00000160][0x000001F4][0x000000D4][0x00000044][0x00000018]
Threadstack0 là Address tại đáy của stack ở thread số 0 (thread đầu tiên của app).
Sau khi mình update windows, dãy pointer trên không còn trỏ đúng nữa (JIT Compiler nó biên dịch khác đi so với lúc đầu).
(Ít nhất thì đây là điều hợp lý với kiến thức đầu bài, không biết có nhầm không)
Vậy mọi người có ai dùng cheat engine lập được table cho game viết bằng DotNet chưa, mình thì đầu hàng rồi