Hat Dash에서 속이는 방법이 보이십니까?
참조 : Hat Dash White Hat 명예의 전당 및 순위표 새로 고침
업데이트 2021-01-13 : 모든 현상금이 (이 게시물 또는 다른 게시물에서) 수여되었습니다. 참여해 주셔서 감사합니다!
일부 사용자가보고했듯이 일부 의심스러운 점수가 모자 대시에 나타나기 시작했습니다. 자동으로 (또는 몇 가지 수동 단계를 통해) 일부를 포착하기 위해 몇 가지 휴리스틱과 규칙이 있습니다. 즉, 나는 모든 일을 재미 있고 정직하게 유지하는 데 관심이 있습니다.
따라서 (이 질문에 대한 답변으로) 성공적으로 속이는 방법을 재현 할 수 있다면, 점수가 보드에 표시되는 방식으로 (그리고 이미 살펴 봐야 할 항목 목록에는 포함되지 않습니다. 20 초 만에 999K를 기록한 사람) 또는 부정 행위를 감지하기 위해 이미 적용된 것 이상의 새로운 효과적인 휴리스틱을 제안한 경우 다음을 수행합니다.
- 답변에 현상금 지급 (심각도에 따라 미정)
- 모자 대시 리더 보드 하단에서 소리를 지르세요.
부정 행위 = API를 직접 조작하거나 실제로 점프하지 않고 게임을 작동하도록 속일 수있는 클라이언트 측을 통해.
또한 귀하가 화이트 햇 테스트에 관여하고 그로 인해 귀하를 차단하는 경우 (의심스러운 행동을 보며) WB 채팅방 에서 저에게 알려주십시오 .
답변
네 저도 그렇습니다!

이 과정은 매우 간단합니다. 갔다https://winterbash2020.stackexchange.com/run-with-the-hatshd.min.js
크롬 디버거로 cdn.sstatic.net JS 파일 을 열었습니다 .
(접근성을 위해 텍스트에 줄 번호를 포함했습니다. 순전히 Chrome이 파일을 아름답게 꾸미는 느낌과 관련이 있으며 이미 FF와 Chrome간에 차이가 있습니다.)
먼저 여기에 중단 점을 추가했습니다 (이전에 언급 한 JS 파일의 526 행).

... 무의미한 것으로 판명되었지만 시작 시간을 변경했습니다. 나와 Chrome 디버거가 약간 싸웠는데, 이는 사용 된 67 초의 대부분을 차지할 것입니다. 나중에 여기에 시간이 있음을 알게되었으므로 나중에 수정할 수 있었을 것입니다. 나는 startedAt 시간을 수정하고 90000을 뺍니다. 이 수정은 표준 디버깅 시스템을 사용하여 콘솔에서 수행되었습니다. -=
내가 그것을 수정할 때 잊었을 수도 있습니다. /어깨를 으쓱하다
둘째, 여기에 중단 점을 추가했습니다 (이전에 언급 한 JS 파일의 629 행).

재미가 시작되는 곳입니다. 왜 안된다는 distanceRan
이유로 변수를 9 백만으로 올렸습니다 . 계속 진행하기 위해 Chrome과 싸운 후 (약간 버그가있을 수 있으며, 분명히 내 잘못 인 Flatpak 아티팩트 일 수 있음) 코드가 계속 실행되어 점수를 제출했습니다.
.trigger("gameStarted/gameEnded")
기능을 사용해 보았지만 아무 효과가 없습니다. 또한 XHR 요청 (다른 중단 점 포함-Firefox의 "XHR 중단"제공)을 수정하려고 시도했지만 유효성 검사로 인해 두 엔드 포인트를 모두 쳤음에도 불구하고 저를 방해하는 것 같습니다.
2 라운드, 이것은 실제로 재미 있기 때문에 : D
다른 세 가지 답변과 같은 줄을 따라 다시 시작합니다. 이것은 AFK 옵션이며 거의 시간이 필요합니다. 어리석은 점수를 얻을 수 있습니다.
- 디버거 열기
- 점프하여 게임을 시작하고 공중에서 실행을 일시 중지합니다.
- 콘솔,
this.config.GRAVITY = 0
.
중력을 0으로 설정하면 유니콘이 야생으로 다시 방출되기 때문에 이제 게임을 배경에 두어 점수를 갈 수 있습니다. 이 버그의 테스트에서 유니콘은 손상되지 않았습니다. 아마
점수가 만족 스러우면 게임을 다시 중지하고을 호출하십시오 this.gameOver()
. GRAVITY
를 0으로 설정 하면 버그로 인해 게임을 중지하는 유일한 방법은 수동으로 함수를 호출하는 것입니다. 보너스로, 어떤 유형의 변조 확인을 추가하지 않으면 확인할 수 없습니다. 예상대로 시간과 점수가 증가하지만 게임을 할 필요가 없다는 유일한 차이가 있습니다.
내 조언을 원한다면 콘솔이 열려있는 경우 보낸 점수를 수락하지 마십시오. 그러나 콘솔이 열려 있는지 감지하는 것은 까다 롭습니다. 같은 뭔가 이 첫 번째 시도에서 작동 할 수 있지만, 지금까지 볼 수 있듯이, JS에서 아무것도 넣어은 콘솔을 가진 사람은 수정할 수 있습니다. 시간을 사용하는 것은 첫 번째 시도에서 작동 할 수 있지만 누군가가 쉽게 중단 점을 설정하고 시간을 임계 값 미만으로 수정 한 다음이 테스트를 우회하여 계속할 수 있습니다.
예, 영원히!
나는 당신이 리더 보드의 최상위에 있는지 지속적으로 확인하고 당신을 거기에 넣을 점수를 제출하지 않는지 지속적으로 확인하는 스크립트를 작성했습니다.

나는 이것이 다른 사람들과 동일한 기본 접근 방식이라고 생각하지만 내가 한 것은 소스 코드를 최소화하고 약간 수정 한 다음 탭에서 실행하는 것뿐이었습니다.
휴리스틱 스를 우회하기 위해 원하는 점수와 초를 현재 리더보다 하나 더 많이 설정하여 정상에 올랐습니다.
요점 -실행 상태로두면 리더 보드의 최상위에 있는지 지속적으로 확인합니다. 그렇지 않은 경우 게임을 실행하여 정상에서 떨어 뜨린 다음 확인으로 돌아갑니다.
설계된대로 API를 사용하여 알 수있는 한 이러한 종류의 부정 행위를 방지 할 수있는 방법은 없지만 훨씬 더 어렵게 만들 수있는 것은 점프 시간 (시작 이후 밀리 초) 목록을 보내는 것입니다. 즉, 각 프레스에 대한 타임 스탬프 스페이스 바의. 효과적으로 시뮬레이션하기가 훨씬 더 어렵습니다.
4 라운드! 어제부터하고 싶었지만 방법을 알 수 없었습니다. 그리고 그것은 정확히 XHR 요청은 아니지만 하나 더 잘 할 것입니다.
이 게임에는 하나의 큰 결점이 있습니다. 장애물은 영광스러운 유니콘을 두려워하지 않습니다! 그래서 어, 네, 당신을 위해 게임을 고쳤 습니다 : p 또한 고양이와 유니콘이 협력하고 있다는 소문을 들었습니다 .
이 버그를 테스트 할 때 여러 고양이가 유니콘의 자유를위한 싸움에 합류했습니다.
(200ms마다 충분하다고 생각했을 때 돌아 왔지만 게임이 가속됨에 따라 너무 가까워 져서 10ms마다 부딪 혔습니다)
var intv2 = setInterval(() => {
Runner.instance_.horizon.obstacles = []
}, 10);
그리고 승리 할 준비가되면 clearInterval(intv2);
하지만 어떤 이유에서인지 10k 포인트를 너무 많이 넘으면이 방법을 사용할 수 없습니다. 이유가 확실하지 않거나, 너무 공격적인 무효화이거나, 그 누구도 합법적으로 높은 점수를받을 수 없다고 생각했습니다.
이 리더 보드 항목이 최소한 :

참고 : 어떤 이유로이 작업을 https://winterbash2020.stackexchange.com/run-with-the-hats
보너스 : 이제 모자를 쓰고 뛰어 다니는 대신 유니콘 필드에서 달릴 수 있습니다.
네!

Zoe가 한 것과 비슷한 작업을 수행 하고 Chrome의 디버거를 열었습니다. Runner
객체를 탐색하기 시작했고 distanceRan
Chrome 콘솔을 사용하여 직접 조작 할 수 있음을 확인했습니다 . 그것이 제가 2 등을 위해 한 일이었습니다. 하지만 단순히 Runner.instance_.distanceRan
원하는대로 설정할 수는 없습니다. 시도하면 0.025를 곱하고 (100,000으로 설정하면 2,500으로 감소합니다) 왜 그런지 확신 할 수 없었 Runner.instance_.distanceRan = 100000 / 0.025
습니다. "실행 취소"하면 내 점수가 내가 원래 원했던 100,000 점으로 올바르게 변경되는 것 같았습니다.
두 번째 실행은 약간 다르게 수행되었습니다. Zoe가 답변에서 지적했듯이 gameOver()
장애물에 부딪 힐 때마다 호출 되는 함수가 있습니다. 멋지네요 ... 그래서 그냥 무효화를 시도했지만 Runner.instance_.gameOver = null
장애물에 부딪히면 게임이 충돌했습니다. 그래서 대신에, 나는 빈으로 설정 function
하여 Runner.instance_.gameOver = function() { /*nothing*/ }
저를 계속 잃지 않고 장애물로 실행할 수 있도록한다.
하지만 문제는 이제 게임을 끝낼 수 없어서 내가 나가서 술을 마시면서 얻은 우스꽝스러운 점수를 현금으로 바꿀 수 있다는 것입니다. 그래서 js 파일에서 함수의 내용을 복사하고 함수를 gameOver
이전 내용으로 되 돌리면 게임을 끝낼 수 있습니다 ... 잔인하게 추가 할 수 있습니다. 나는 그 시점에서 너무 빨리 움직여서 전환 할 수 없었고 자신을 구 하려고 했습니다. 그래도 다음 런스 루에서 두 번째로 순위표에 오르기 위해 점수를 50k로 설정하기로 결정했습니다.
아름다운 속임수 방법을 찾았습니다.
재현 단계 :
- Run with the Hats 페이지로 이동하여 아무 곳이나 마우스 오른쪽 버튼으로 클릭하고 "요소 검사"를 클릭합니다.
- "콘솔"탭을 클릭합니다.
- 복사하여 콘솔에이 명령을 붙여 공격 Enter:
var original = Runner.prototype.gameOver
. - 다음 명령을 제외하고 # 3 단계에서도 동일하게 수행하십시오
Runner.prototype.gameOver = function (){}
.. - 다음 줄에
f (){}
Enter 키를 누르면 표시됩니다. 내가 확신하는 것은gameOver
유니콘이 장애물에 부딪 힐 때 호출 되는 함수를 빈 함수 (f (){}
) 로 대체하는 것이므로 현재 유니콘은 끈에서 벗어납니다. - 명령
Runner.prototype.gameOver = original
을 복사 하여 콘솔에 붙여 넣어 정상으로 돌아가서 최고 점수를 게시하십시오 (중지하는 데 1 초가 걸릴 수 있음).
3 라운드, 고정 된 중력을 보았 기 때문에 다시 부수고 싶은 강한 충동이있었습니다. import antigravity, 맞습니까? :피
어떤 이유로 든 항상 일관되게 작동하는 것은 아니기 때문에 다소 동적 인 시스템입니다. 나는 그것을 사용하여 몇 가지 점수를 얻었습니다.

또한 30k가 있었지만 어떤 이유로 서버에서 버렸습니다. 거기에서 무슨 일이 일어 났는지 완전히 확신하지 못하지만, 당시에 적절하게 다듬어지지 않은이 방법으로 귀결되었을 수 있습니다.
이 버그 테스트에서 여러 유니콘이 해제되었습니다. #SaveTheUnicorns
다른 시도와 마찬가지로 점프하여 게임을 시작하고 실행을 일시 중지하고 콘솔을 엽니 다.
this.tRex.config.DROP_VELOCITY = 0
this.tRex.config.GRAVITY = 0
this.tRex.config.INITIAL_JUMP_VELOCITY = -100
내 테스트에서 이것은 다양한 성공을 거두었습니다. 어떤 경우에는 유니콘이 사라집니다. 다른 경우에는 멈추고 다시 떨어지지 않고 여전히 일부 장애물의 범위에 있습니다. 이 경우 게임을 다시 일시 중지하고 DROP_VELOCITY = -1
. 창은 초점을 유지해야하고 웹 사이트 자체는 건드릴 수 없지만 그 덕분에 리더 보드에 2.4k가 추가되었습니다.
네거티브를 설정 한 후 날아 가기DROP_VELOCITY
위해 다시 점프해야 할 수도 있지만 다시 시작하는 것도 지속되므로 1 라운드에 실패하면 2 라운드에서 다시 시작하고 날아 가기가 쉽습니다.
첫 번째 옵션 (유니콘이 사라짐)의 경우 이전 답변의 마지막 중력 브레이크 단계가 여전히 적용됩니다. 점수가 만족 스러우면 실행을 일시 중지 this.gameOver()
하고 콘솔에서. 게임을 중지하고 점수를 제출해야합니다.
자바 스크립트 자체를 해킹하자!
1 단계. 리소스 재정의 설치
Microsoft Edge (Chromium 기반)에서도 작동합니다.
면책 조항 : 나는이 Chrome 확장 프로그램과 관련이 없습니다.
2 단계. Microsoft Visual Studio Code (또는 원하는 경우 JetBrains WebStorm)를 엽니 다.
여기에서 자바 스크립트 파일을 가져옵니다. https://cdn.sstatic.net/Winterbash/js/hd.min.js. 어딘가에 저장하십시오.
권장 사항 : 보다 쉬운 탐색을 위해 코드에 포맷터 (예 : VSCode Prettier )를 사용합니다.
면책 조항 2 : 저는 Microsoft VSCode 또는 JB WS와 관련이 없으며 VSCode Prettier 확장과도 관련이 없습니다.
3 단계. 2 단계에서 다운로드 한 JavaScript 파일 편집
파일을 미리 설정했다고 가정하면 다음 코드가 126 행에 있어야합니다.
function s(n, t, i, r, u, f, e)
이 함수로 이동 (프로 팁에 대한 검색 s(
과 일치하는 모든 단어 , 다음과 같은 문에 대해 살펴 켜져) :
this.xPos = r.WIDTH + (e || 0);
변경 (e || 0)
을 0
하고 파일 저장.
4 단계. 리소스 재정의 열기
구어 적으로이 확장을 RO라고합니다.
Add Rule오른쪽 클릭
을 선택
URL → File
하면 아래에 새 줄이 표시됩니다.URL 표시 줄에 다음을 입력하십시오.
https://cdn.sstatic.net/Winterbash/js/hd.min.js?*
선택
Edit File
URL 표시 줄의 오른쪽에, 그리고 3 단계에서 편집 한 파일을 붙여 넣습니다. 선택Save & Close
오른쪽 아래에.
단계 5. Hat Dash로 이동하여 페이지를 새로 고칩니다. 플레이 시작
RO는 JS를 편집 한 버전으로 대체합니다. 이제 장애물이 없습니다.
5.1 단계. 원하는 점수를 얻을 때까지 잠시 기다리십시오. 브라우저가 아닌 다른 것으로 전환하십시오.
현재 점수로 게임이 종료됩니다. 즐기세요!
더 빠른 방법. 내 다른 치트 방법의 모든 단계를 복사 하되 이번에는 다른 명령을 입력 Runner.instance_.setSpeed(10000)
합니다.. 그것은 유니콘의 속도를 크게 높여줍니다. 그래도 라인에서 빠르게 도약하므로 롤링하려면 위쪽 화살표를 눌러야합니다.
Uni가 장애물을 뒤덮는 것을보고 싶다면 다음 줄을 추가하면됩니다 Runner.instance_.setSpeed(-1)
..
참고 : 새로운 부정 행위 방지 휴리스틱을 사용하면이 답변이 더 이상 작동하지 않습니다. 작동 방법 은 이것을 참조하십시오 .
TL; DR :
(async () => {
Runner.gameStarted();
Runner.setCurrentScore(someScore);
await new Promise(resolve => setTimeout(resolve, seconds * 1000));
Runner.gameEnded();
})();
교체 someScore
및 seconds
그에 따라.
손으로
이것은 내가 속인 방법이며 나중에 깨달았습니다. 위의 코드와 똑같습니다.
첫째, 어떤 것을 관찰 POST
게임이 시작하고 끝나는 경우 요청이 완료 : /hat-dash/start
와 /hat-dash/end
.
첫 번째 요청은
startedAt
시간 (Epoch 이후 밀리 초) 인 매개 변수 를 보냅니다 . 응답은 인증 키입니다 :{"auth":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}
.두 번째 요청에는 여러 매개 변수가 있습니다.
startedAt
: 시간, 이전 요청과 동일해야합니다.score
: 게임의 총점.authKey
: 이전 요청에서받은 인증 키입니다.durationMs
: 게임 시간 (밀리 초).- 에서 얻은 최신
histKeys[]
인증 키를 포함 하여 이전 인증 키를 보유하는 많은 매개 변수localStorage
. 자신의 것을 보려면을 실행하십시오localStorage.getItem('Game_AuthKeys').split('|');
.
그런 다음 매우 쉬웠습니다.
이러한 요청이 완료되도록 짧은 게임을하십시오.
네트워크 탭으로 이동 → 최신
/hat-dash/start
요청을 마우스 오른쪽 버튼으로 클릭 → 복사 → 가져 오기로 복사. 콘솔과 변화가 붙여 넣기"body": "startedAt=xxxxxxx"
로"body": "startedAt=" + new Date().getTime()
.나중에 입력 할 점수가 실제처럼 보이고 Yaakov가 😇를 알아 차리지 못하도록 몇 초 동안 기다리십시오.
다음으로 최신
/hat-dash/end
요청을 복사 하고 :- 을 받기
startedAt
이전부터/hat-dash/start
요청 (당신이 양식 데이터가 표시 될 때까지 네트워크 → 신청 → 스크롤)이 이전에 도착 날짜로 대체합니다. - 점수를 원하는 점수로 바꿉니다.
authKey
이전 요청의 응답에서 얻은 값으로 바꿉니다 .- 변경
...&durationMs=xxxxx...
에...&durationMs=" + (new Date().getTime() - previousStartedAt) + "...
. - 나머지는
histKeys[]
변경하지 말고&histKeys%5B%5D=newestAuthKey
문자열 에만 추가 하십시오.
- 을 받기
Javascript를 편집하는 대신 POST
요청을 보내지 않는 이유는 무엇입니까? (브라우저의 콘솔에 복사하여 붙여 넣기)
var startedAtNow = Date.now();
var authkey = "";
var n = {};
$.ajax({ type: "POST", url: "hat-dash/start", data: { startedAt: Date.now() }, dataType: "json", success: function(t) { authkey = t.auth }, error: function(n) { console.log("error starting game"); console.log(n) }, done: function() { this.pendingGameStart = null } }) function doend() { $.ajax({
type: "POST",
url: "hat-dash/end",
data: {
startedAt: startedAtNow,
score: Number(6942069420), // You can change this
authKey: authkey,
durationMs: 12345, // You can change this
histKeys: localStorage.getItem("Game_AuthKeys").split("|")
},
dataType: "html",
success: function(t) {
authkey = null;
n.pendingGameEnd = !1;
n.pendingGameStartedAt && ($.ajax({ type: "POST", url: "hat-dash/start", data: { startedAt: Date.now() }, dataType: "json", success: function(t) { authkey = t.auth }, error: function(n) { console.log("error starting game"); console.log(n) }, done: function() { this.pendingGameStart = null } }))(); $(".js-stats-data").remove();
$(".js-personal-stats").append(localStorage.getItem("Game_AuthKeys"))
},
error: function(n) {
console.log("error ending game");
console.log(n)
}
})
}
setTimeout(doend, 12345); // 12345 should be >= durationMs
방금 소스 코드를 살펴보고 찾았습니다. 주석은 변경해야 할 사항을 설명합니다. 점수에 대한 현실적인 시간을 설정하는 것이 좋습니다.
기본적으로, score: Number(x)
x는 원하는 점수입니다. durationMs: y
실행을 원하는 시간, y는 밀리 초 수입니다. 실행이 실제로 실시간으로 발생했다는 사실을 시뮬레이션하는 setTimeout(doend, z)
것보다 몇 밀리 초 더 기다려야합니다 durationMs
. 나머지 코드는 실제 자바 스크립트 에서 가져온 것 입니다. 데이터를 가져와 jQuery AJAX POST를 통해 Stack Exchange 서버로 보냅니다.
증명:

즐거운 시간 보내 주셔서 감사합니다 :-)
내 접근 방식은 다음과 같습니다.
const origGameOver = Runner.prototype.gameOver;
Runner.prototype.gameOver = function() {
if (this.runningTime > 133700) {
this.lastSurrentScoreText = "9001";
this.currentStartedAt = Date.now() - 133700;
return origGameOver.call(this);
}
}
나는 장애물과 계속 충돌하지만 (물론 우연히!) 게임은 내가 133.7 초 동안 플레이 할 때까지 끝나지 않습니다. 그렇지 않으면 키 누름을 수집하고 표준 요청을 보내기 위해 원래 코드를 사용하여 정상적으로 재생합니다.
클라이언트에서 무작위로 장애물이 생성되므로 서버 측에서이를 감지 할 기회가 없습니다.
불행히도 첫 번째 테스트에서 예상 시간을 올바르게 서버로 보내는 방법을 아직 파악하지 못했지만 (134 초로 표시됨) 최고 점수를 너무 많이 엉망으로 만들지 않도록 후속 조치를 취하지 않았습니다.
다음 명령을 사용할 수도 있습니다.
Runner.instance_.distanceRan = 100000 / Runner.instance_.distanceMeter.config.COEFFICIENT
특정 점수에서 유니콘을 시작하려면이 경우 10 만 달러입니다.
키보드 속임수로 태블릿을 사용하는 것을 고려하는지 아니면 메커니즘의 영리한 조합을 고려하는지는 잘 모르겠지만 다음과 같은 경우를 대비하여 링크 할 것이라고 생각했습니다.
https://meta.stackexchange.com/a/358130/718314
키보드를 사용하여 터치 스크린에서 게임을 플레이하면 아래로 날아가는 화살표가 더 쉽게 구성되므로 게임이 조금 더 쉬워집니다.
(이게 부정 행위라면 내 점수를 지우지 마세요! 지난 30 분 동안 만 발견했기 때문에 가장 최근의 실행 만이 작업으로 완료되었습니다 😅 그들 중 누구도 전체 순위표를 만들지 않았습니다)
먼저 l()
잘못된 URL ( /bam-me...
) 을 요청하도록 함수의 치트 방지 코드를 수정하여 실수를해도 금지되지 않도록했습니다.
그런 다음 충돌시 게임을 종료하는 코드 ( f ? (this.gameOver(), this.crashed || l('rewrote gameOver function')) : ...
)를 변경하여 조건을 변경했습니다 f && !1
. 이는 장애물에 부딪혀도 게임이 종료되지 않음을 의미합니다.
다음으로, 서버 측 분석이 나를 알아 차리지 않도록 평소처럼 게임을했습니다. 내가 죽고 싶을 때, 나는 Alt- 오른쪽을 눌러 탭을 나가면 gameOver()
(포커스를 잃었 기 때문에) 호출 하고 서버에 내가 죽었다고 알립니다.
물론, 위의 모든 사항은 사용자 지정 JS를 페이지에 가져와야했습니다. 이벤트 핸들러 다시로드와 관련된 잠재적 인 문제를 방지하기 위해 모든 요청에 대한 응답을 변경할 수있는 FF 확장 'Request Injector'를 사용했습니다. 물론 로컬 파일을 사용하여 HTML을 수정할 수 있었지만 모든 상대 URL이 깨져서 페이지에 사용 된 자산이로드되지 않았고 유니콘을 볼 수 없었습니다. 원격 HTML의 로컬 JS 파일은 file : /// URL 보호로 인해 실패하므로 del.dog을 사용하여 새 JS 코드를 호스팅했습니다.
이것을 차단하는 제 제안 은 HTML integrity=...
의 <script src="sstatic...">
태그에 속성 을 추가하는 것입니다. 이는 최소한 사람들이 JS를 수정하기 위해 모든 상대 URL을 찾아서 바꾸는 노력을해야한다는 것을 의미합니다.
서버 /run-with-the-hats
는 올바른을 가지고 있지 않는 한 모든 요청을 차단할 수 Referrer
있으며 클라이언트 측 검사도 JS에 추가 할 수 있습니다 document.referrer
(이는 요청 인터셉터에 최대 페이지 수를 넣어야하므로 유용합니다. JS를 수정하는 것이 더 짜증나게 함)

나는 이것을 답으로 쓰지 말아야한다고 생각하지만 그것을 쓸 다른 곳을 찾지 못했습니다. 2 일 전에 점프 속도를 변경하여 속임수를 썼습니다 (지금은 수정되었습니다). 하지만 내 점수는 리더 보드에 있습니다.

그냥 제거하고 싶어
지금 바로을 누른 직후 실수로 브라우저 탭을 변경했습니다 Space. 나는 다시 합류했고 유니콘은 사라졌습니다. 그러나 게임이 실행되고 소리가납니다.
Google Chrome, Windows 10에서.
여기에서 볼 수 있습니다. https://youtu.be/8MZrcbZttHY
코딩이 필요없는 간단한 치트 방법을 찾았습니다.
- 게임 열기 : 모자를 쓰고 달리기
- 재생을 시작하고 잠시 후 페이지를 확대 / 축소합니다. 이로 인해 게임이 중지됩니다.
- 잠시 기다렸다가 스페이스 바를 눌러 게임을 다시 시작하십시오. 게임이 재개되면 점수가 더 높아집니다. (더 많이 기다릴수록 높아집니다)
예! 기본 이벤트 리스너와 객체를 제거하고 클라이언트 측 자바 스크립트를 수정 된 버전으로 덮어 쓸 수있었습니다. 수정 된 버전에는 다음 줄이 추가되었습니다.
n.livesLeft = 1000;
(값이 다소 임의로 설정 될 수있는 곳) 다음에 넣은 (다시, 다소 임의로)
n.defaultDimensions = {
WIDTH: y,
HEIGHT: 150
};
충돌 감지 로직을 교체했습니다.
if (f && ut(f, a, v), y) return [a, v]
와
if (f && ut(f, a, v), y) {
n.livesLeft--;
if(n.livesLeft<=0) {
return [a,v];
}
}
이것은 대부분 작동하지만 결국 게임에 버그가 발생합니다. 구체적으로 업데이트 기능에는
this.currentSpeed < this.config.MAX_SPEED && (this.currentSpeed += this.config.ACCELERATION))
시작 속도와 최대 속도의 차이는 기본 ACCELERATION 매개 변수의 정확한 배수가 아니기 때문에 속도가 최대 값을 초과 할 수 있습니다. 그런 다음 점프 할 때 startJump () 함수는 현재 속도를 MAX_SPEED에 대해 확인하고 너무 빨리 점프하는 경우 자동 금지를 트리거합니다. 원본에 있어야하는 이에 대한 수정은 해당 세그먼트를 다음과 같이 변경하는 것입니다.
(this.currentSpeed + this.config.ACCELERATION) < this.config.MAX_SPEED && (this.currentSpeed += this.config.ACCELERATION))
스크립트 수정에서 자동 금지 코드를 무력화 할 수 있지만, 특히 버그 수정 이후에 반드시 그렇게해야하는 것은 아닙니다.
이 수정을 통해 여전히 게임을 플레이해야하며 최종 점수는 플레이 능력과 관련이 있습니다. 차이점은 첫 번째 충돌에서 게임이 끝나지 않는다는 것입니다. 게임이 끝나기 전에 얼마나 많은 충돌을 가질 수 있는지는 매우 관대합니다.
이 기술이 현재의 아키텍처와 서버로 전송되는 정보의 양으로 어떻게 쉽게 방어 될 수 있는지 잘 모르겠습니다.
때로는 서버 측 유효성 검사 코드가 게임을 의심으로 표시하지만 "너무 좋은"일반 범주에 속하거나 점프 수를 예상 장애물 수와 비교하는 것일 수 있습니다. 올바른 점프 빈도가 무엇인지 알아 내기 위해 약간의 실험이나 서버 측 코드를 살펴본 다음, 체크 포인트와 게임 종료시 점프 횟수를 보내는 코드를 수정해야합니다. 이 글을 마치기 전에 그 부분을하려고했지만 충분한 수의 주와 Winter Bash의 남은 시간이 그렇게 할 시간을 찾지 못한 채 지나갔습니다. 그래서 마지막 단계를 건너 뛸 것입니다. 항상 시간의. 나는 그것이 게시물이 찾고 있던 것을 여전히 만족한다고 생각합니다.
Number
기능 을 편집하여 점수를 변경할 수 있습니다 . 대체 될 때 코드는 Firefox의 예쁘게 인쇄 된 코드의 1168 행에있는 점수 문자열을 숫자로 변환하려고 시도하고 대신 사용자 지정 함수를 실행합니다. 이 코드를 JavaScript 콘솔에 붙여 넣으십시오.
function Number(n) {
return 1000000;
}