PDA

View Full Version : Cách chống kill thread cho phần mềm anticheat có cơ chế hoạt động giống một chương trình antivirus?



quyen194
17-02-2013, 01:26 AM
Đầu tiên xin cảm ơn các bạn đã chiếu cố, dành thời gian quý báu để ngó qua topic này!

Vấn đề mình muốn thảo luận và xin các bạn giúp đỡ ở đây là làm sao để chống kill một thread do mình tạo ra!
Mình xin mô tả sơ qua cái gọi là phần mềm anti-cheat của mình!
Thực chất nó là một dll được đính kèm với một game online, mỗi khi game khởi động sẽ gọi đến cái dll này, trong dll sẽ gọi lên một vài thread với vài chức năng khác nhau:
-Quét tiêu đề cửa sổ các chương trình đang chạy => phát hiện theo tên (kém chính xác)
-Quét bộ nhớ RAM xem có chương trình cheat nào đang chạy không => phát hiện theo "chữ ký của chương trình" cái này tương tự như cái quét file của phần mềm anti của a Dũng nhưng khác ở chỗ là các offset và đoạn code mẫu lấy khi chương trình được load vào RAM (tức là khác so với ở file chưa thực thi)
Với mỗi phát hiện sẽ dẫn đến thoát Game

Vấn đề ở đây của mình là chỉ cần dùng một chương trình quản lý tác vụ, soi process của game lên, kill bỏ cái thread anticheat là lại cheat ầm ầm được!
Mình đã thử sử dụng cách hide process nhưng cũng không ăn thua vì vẫn có tool có thể chống hide được :(

Mình có nghĩ đến cách sau mỗi một lượt quét lại tạo một thread mới và kết thúc thread cũ nhưng nếu pause hay suspense cái process game thì vẫn kill thread được như thường :(

quangnh89
18-02-2013, 09:19 AM
Đầu tiên xin cảm ơn các bạn đã chiếu cố, dành thời gian quý báu để ngó qua topic này!

Vấn đề mình muốn thảo luận và xin các bạn giúp đỡ ở đây là làm sao để chống kill một thread do mình tạo ra!
Mình xin mô tả sơ qua cái gọi là phần mềm anti-cheat của mình!
Thực chất nó là một dll được đính kèm với một game online, mỗi khi game khởi động sẽ gọi đến cái dll này, trong dll sẽ gọi lên một vài thread với vài chức năng khác nhau:
-Quét tiêu đề cửa sổ các chương trình đang chạy => phát hiện theo tên (kém chính xác)
-Quét bộ nhớ RAM xem có chương trình cheat nào đang chạy không => phát hiện theo "chữ ký của chương trình" cái này tương tự như cái quét file của phần mềm anti của a Dũng nhưng khác ở chỗ là các offset và đoạn code mẫu lấy khi chương trình được load vào RAM (tức là khác so với ở file chưa thực thi)
Với mỗi phát hiện sẽ dẫn đến thoát Game

Vấn đề ở đây của mình là chỉ cần dùng một chương trình quản lý tác vụ, soi process của game lên, kill bỏ cái thread anticheat là lại cheat ầm ầm được!
Mình đã thử sử dụng cách hide process nhưng cũng không ăn thua vì vẫn có tool có thể chống hide được :(

Mình có nghĩ đến cách sau mỗi một lượt quét lại tạo một thread mới và kết thúc thread cũ nhưng nếu pause hay suspense cái process game thì vẫn kill thread được như thường :(

Không rõ tất cả các yêu cầu của bạn hoạt động ở hệ điều hành nào, nếu windows 7 trở lên, bạn có thể tìm hiểu ObRegisterCallback

quyen194
19-02-2013, 10:17 AM
Không rõ tất cả các yêu cầu của bạn hoạt động ở hệ điều hành nào, nếu windows 7 trở lên, bạn có thể tìm hiểu ObRegisterCallback

Cám ơn bạn nhiều!
Của mình là từ win xp trở lên bạn ạ :( có thể dùng cái trên hay phải cách khác vậy bạn?(?)

quangnh89
19-02-2013, 01:37 PM
Cám ơn bạn nhiều!
Của mình là từ win xp trở lên bạn ạ :( có thể dùng cái trên hay phải cách khác vậy bạn?(?)

với windows xp thì có thể dùng SSDT hook. bạn cần xây dựng một driver để hook SSDT, ObRegisterCallback chỉ hỗ trợ từ VistaSP1 trở lên.
Khi hook cần tránh các hàm gọi lồng nhau, chương trình bị re-entry, sẽ dump hệ thống.
Còn 1 tình huống khác, bạn bị antivirus nhận nhầm là rootkit.

quyen194
19-02-2013, 03:02 PM
với windows xp thì có thể dùng SSDT hook. bạn cần xây dựng một driver để hook SSDT, ObRegisterCallback chỉ hỗ trợ từ VistaSP1 trở lên.
Khi hook cần tránh các hàm gọi lồng nhau, chương trình bị re-entry, sẽ dump hệ thống.
Còn 1 tình huống khác, bạn bị antivirus nhận nhầm là rootkit.

Cám ơn bạn rất nhiều! Tuy vẫn hơi hơi mơ hồ nhưng mình sẽ tìm hiểu trước, nếu có vẫn chưa làm được mình sẽ reply lại ở topic này, hi vọng lại nhận được sự giúp đỡ của bạn ^o^

puss
20-02-2013, 09:58 AM
Nếu bạn muốn chống kill thread theo đúng nghĩa thì theo mình biết có một số phương pháp nhưng chủ yếu thực hiện ở kernelmode
1. Hook ssdt function NtTerminateThread
2. Unlink thread list -> Hide thread
.....
Các phương pháp này có thể chống tốt các chương trình từ usermode, nhưng nếu gặp mấy bác powertool, xuetr... thì tắt điện.

Hầu hết các hệ thống anti cheat hiện đại ngày này không sử dụng phương pháp này để chống bị kill. Thay vào đó nó tạo ra một kênh liên lạc riêng với game kiểu kiểu như:
Game: mày có đó không anti cheat?
Anti Cheat: tao có
Game: mày đang làm gì thế?
Anti Cheat: tao đang chơi điện tử
........
Tất nhiên cuộc nói chuyện giữa 2 đứa này đã bị mã hóa rồi, ta không dễ mà hiểu được nó đang nói cái gì với nhau. Nếu ta kill hoặc suppend thằng anti cheat thì thằng anti cheat sẽ không trả lời lại thằng game, do đó thằng game biết thằng anti cheat đã bỏ đi nên nó sẽ bỏ đi theo luôn. Kiểu như chàng không còn thiếp chẳng thiết sống nữa ấy.

Ở mức độ đơn giản thì bạn có thể hiểu như vậy.

trungkien45
20-02-2013, 11:32 AM
Tức là nếu tắt anti Cheat thì game cũng out luôn?

Vậy có thể giả Anti Cheat không nhỉ?

Mình đặt giả thiết vậy, chứ mình chưa sờ đến mấy cái này...

quyen194
21-02-2013, 09:39 AM
Nếu bạn muốn chống kill thread theo đúng nghĩa thì theo mình biết có một số phương pháp nhưng chủ yếu thực hiện ở kernelmode
1. Hook ssdt function NtTerminateThread
2. Unlink thread list -> Hide thread
.....
Các phương pháp này có thể chống tốt các chương trình từ usermode, nhưng nếu gặp mấy bác powertool, xuetr... thì tắt điện.

Hầu hết các hệ thống anti cheat hiện đại ngày này không sử dụng phương pháp này để chống bị kill. Thay vào đó nó tạo ra một kênh liên lạc riêng với game kiểu kiểu như:
Game: mày có đó không anti cheat?
Anti Cheat: tao có
Game: mày đang làm gì thế?
Anti Cheat: tao đang chơi điện tử
........
Tất nhiên cuộc nói chuyện giữa 2 đứa này đã bị mã hóa rồi, ta không dễ mà hiểu được nó đang nói cái gì với nhau. Nếu ta kill hoặc suppend thằng anti cheat thì thằng anti cheat sẽ không trả lời lại thằng game, do đó thằng game biết thằng anti cheat đã bỏ đi nên nó sẽ bỏ đi theo luôn. Kiểu như chàng không còn thiếp chẳng thiết sống nữa ấy.

Ở mức độ đơn giản thì bạn có thể hiểu như vậy.

Cám ơn bạn rất nhiều!
Thật ra game này mình hiện đang không có source :D và làm ra Anticheat thì game cũng không biết đến sự tồn tại của Anticheat vậy nên mình mới phải tìm cách để tự nó có thể chống kill :D

laudaicat
12-05-2013, 12:44 AM
Trong game có một vòng lặp vô hạn, thay vì bạn tự tạo thread, hãy lấy thread của chính game để chống, hki đó kill thread chính là kill game.
Chúc bạn may mắn :)