Sau một năm rưỡi, cuối cùng tôi cũng đưa ra một phiên bản sửa đổi mới! So với phiên bản trước ( https://tieba.baidu.com/p/9062268166 ) và phiên bản sửa đổi của @RH_QDG ( https://tieba.baidu.com/p/9578466942 ), cải tiến lớn nhất trong phiên bản này là giảm 8 biến ban đầu xuống còn 4, giúp tiết kiệm đáng kể thời gian tiêm. Trước đây, với 8 biến, nửa đầu được dành để sao chép mã vùng biến vào một vị trí an toàn vì vùng biến còn quá sớm trong mã và việc mở trực tiếp 2950E ở đó sẽ gây ra sự cố. Lần này, mã được lưu trữ trong phần ảo, ở phía sau hơn, do đó loại bỏ thao tác sao chép. Một tính năng khác là chương trình chính cần được sao chép; trong phiên bản cũ, thao tác sao chép này được đặt trong mã vùng biến, trong khi ở phiên bản mới, nó được tích hợp vào đầu chương trình chính được tiêm. Chương trình này đã được thử nghiệm trên trình giả lập và thiết bị thực. Cách sử dụng: Trước tiên, hãy gán giá trị cho các biến sau ở chế độ ảo. Lưu ý rằng mỗi biến là một số ảo! B = 102EE1F123410D101i(__ 02 EE 1F _2 __ 10 D1 __ __) C Bỏ qua D = CE.F012345670281(0C EF _1 __ __ __ 02 81 _1 __) E = 180101055D680D1(__ 80 10 __ 55 D6 80 D1 __ __) F = 123BC7301(__ __ BC 73 _1 __ __ __ __ __) Tiếp theo, ở chế độ phức tạp tuyến tính, nhập: @0³M@1(FD 24 30 D6 40 07 31) và nhấn dấu bằng. Lúc này, màn hình sẽ hiển thị giao diện "Phạm vi bảng". Nhấn AC để vào giao diện nhập. Sau đó, nhập trực tiếp chương trình chính sau. [E0 E9] đại diện cho vị trí mục tiêu tiêm. Vui lòng thay thế bằng mục tiêu tiêm của riêng bạn khi sử dụng và chú ý đến thứ tự little-endian. __ __ __ __ 32 07 _2 __ (AC EF) 70 D6 C8 EB _0 __ 52 __ __ __ __ __ __ __ 80 10 __ <2F D9> 80 D1 0E 95 _2 __ BC 73 _1 __ (D2 EF) __ __ C2 8F _0 __ 60 00 24 8F _0 __ [E0 E9] C0 __ C2 8F _0 __ <38 D9> 90 FF _1 __ 60 00 __ __ 34 61 _1 __ BC D6 50 __ D2 03 _2 __ 34 61 _1 __ 70 D6 (B0 EF) CE EB 70 D6 02 Sau khi nhập 00 , nhấn [Menu][3] để vào quickcpy++. Do ngăn xếp sâu, quickcpy++ không tương ứng với một chế độ. Nội dung được đưa vào phải ghi đè lên bản sao lưu chương trình chính của quickcpy++ trước khi thoát. Bản sao lưu nằm ở EFB0 đến EFFF, đây là điểm cuối của toàn bộ vùng nhớ. Nó cũng có thể được điều chỉnh khi cần bằng cách đồng thời tăng hoặc giảm địa chỉ của ba dấu ngoặc đơn trong đoạn mã trên. Hãy cẩn thận để tránh các địa chỉ vùng lưu trữ tạm thời của dấu ngoặc nhọn. Cuối cùng, nguyên lý của chương trình được giải thích. Khi bạn nhập FD 24 30 D6 40 07 31 và nhấn dấu bằng, 10740 đặt sp thành D630 và bật er14. er14 mới là __ 02 và ROP được thực thi bắt đầu từ D632. Tiện ích 21FEE rất hữu ích. Đầu tiên, bật er12 và đặt er12 thành D110, sau đó lưu er14 vào [er12], do đó vào chế độ cơ số. Nó cũng sẽ bật xr4 và bật qr8, bỏ qua trực tiếp biến C. 1EF0C nằm trong hàm chính 1EE58 của chế độ bảng. Địa chỉ này được chọn thay vì 2950E trước đó vì hàm cần bật hai byte khi trả về, trong khi 2950E bật bốn byte, điều này là không đủ. Ngoài ra, điều kiện nửa đầu của byte đầu tiên của biến phải là 0. Số ảo không hỗ trợ biểu diễn góc, vì vậy 4 không sử dụng được. Kiểm tra cho thấy các hàm chính cho chế độ ma trận, vectơ và thống kê không thể chạy mà không có khởi tạo. 18102 bật qr8 và xr4, đặt r9 = 80 và r10 = 10. Lý do là r9 là bộ đếm cho hàm 171F0, thường được khởi tạo thành 0; hàm thoát khi r9> 64. Ở đây, nó được đặt thành -80 để cho phép ghi nhiều số hơn. r10 là bộ đếm cho hàm con 160D2 của nó, thường được khởi tạo là 0; khi r10 = F, việc ghi dữ liệu dừng lại. Tại đây, nó được đặt thành 10 để đảm bảo dữ liệu luôn có thể được ghi. 173BC nằm trong hàm xử lý số 171F0. Quá trình khởi tạo của bộ đếm bên trong có thể được bỏ qua tại đây. Lưu ý rằng dữ liệu sẽ được ghi vào D65E, đây chính xác là vị trí ngăn xếp. Sau đó, bốn byte được bật lên, vừa kịp lúc cho lệnh được tiêm tiếp theo, 20732. Cần phải để lại bốn byte; nếu không, ngăn xếp sẽ quá gần ER12, khiến dữ liệu bên trong bị ghi đè và chương trình bị sập. 20732 bật xr12. Tại đây, er14 được đặt thành D670, do đó er12 không được sử dụng. 0EBC8 sao chép nội dung được trỏ tới bởi er14-04 đến vị trí được trỏ tới bởi *(er14-0A). er14-04 = D66C, *(er14-0A) = *(D666) = EFAC. Thao tác này sao chép toàn bộ chương trình chính vào vùng sao lưu của EFB0. Cuối cùng, tiện ích 0EBC8 trả về qua 09D2A, bật xr4, bật qr8 và đến lệnh tiếp theo, D67C, thiết lập r9, r10, er12 và er14. 2950E là chức năng chính của chế độ tính toán. Sau khi chọn một chế độ trong menu, chức năng này sẽ thoát, do đó, nhấn [Menu][3] sẽ trả lại quyền điều khiển cho ROP. Tiếp theo, 173BC xử lý dữ liệu và đặt er8 thành EFD2. 08FC2 đặt er2 thành 60, sau đó 08F24 thêm er2 vào giá trị được trỏ bởi er8, hoàn thành việc tăng địa chỉ. Tuy nhiên, việc tăng xảy ra trong vùng sao lưu; địa chỉ của chương trình chính vẫn không thay đổi. Nó cũng đặt er8 vào vùng mục tiêu cần được tiêm. 08FC2 đặt er2 thành D938, vị trí của dữ liệu đã được xử lý. 1FF90 sao chép dữ liệu vào vùng mục tiêu. 16134 đặt er0 thành D6BC và R2 thành 50. Sau đó, 203D2 ghi R2 vào vị trí được trỏ bởi ER0, do đó đặt lại độ dài bản sao khi kết thúc chương trình. Tiếp theo, 16134 đặt er0 thành D670, er2 thành EFB0 và 0EBCE sao chép chương trình từ vùng sao lưu vào vùng thời gian chạy. Lưu ý rằng ngăn xếp của hàm 22DC4 lưu trữ er14. Trong quá trình sao chép, er14 được ghi đè bằng D670. Khi thoát tại 0EBCE, nó đi qua 09D2A, đặt sp thành er14 và bật xr4 và qr8, do đó hoàn thành vòng lặp. Tóm lại, phiên bản mới này sử dụng không gian ngăn xếp đặc biệt cho số phức để đơn giản hóa mã vùng biến đổi, giúp giảm thêm số lần nhấn phím khoảng 1/4 so với phiên bản trước và cải thiện hiệu quả đưa vào các chương trình vừa và nhỏ.