JS 에 eval,Function 등 시스템 함수 주입 동적 코드 캡 처

4364 단어 jsevalfunction
현재 많은 사이트 에서 각종 전단 반전 수단 에 올 랐 습 니 다.수단 이 어떻든 간 에 가장 중요 한 것 은 반전 수단 을 포함 한 전단 자바 script 코드 를 암호 화하 여 숨 긴 다음 에 실행 할 때 실시 간 으로 복호화 동적 으로 실행 하 는 것 입 니 다.
동적 실행 js 코드 는 두 가지 방법,즉 eval 과 Function 이 아 닙 니 다.그러면 사이트 암호 화 코드 가 아무리 많아 도 우 리 는 이 두 가지 방법 을 hook 에 두 면 복호화 후의 실행 가능 한 js 코드 를 얻 을 수 있 습 니 다.
일부 사 이 트 는 eval 과 Function 이라는 두 가지 방법 이 원생 인지 아 닌 지 를 검사 하기 때문에 작은 꽃 들 이 흔 들 리 는 것 이 필요 하 다.
연결 코드
우선 eval 의 연결 코드 입 니 다:

(function() {
  if (window.__cr_eval) return
  window.__cr_eval = window.eval
  var myeval = function (src) {
    console.log("================ eval begin: length=" + src.length + ",caller=" + (myeval.caller && myeval.caller.name) + " ===============")
    console.log(src);
    console.log("================ eval end ================")
    return window.__cr_eval(src)
  }
  var _myeval = myeval.bind(null)
  _myeval.toString = window.__cr_eval.toString
  Object.defineProperty(window, 'eval', { value: _myeval })
  console.log(">>>>>>>>>>>>>> eval injected: " + document.location + " <<<<<<<<<<<<<<<<<<<")
})();
이 코드 가 실 행 된 후에 모든 eval 작업 은 콘 솔 에서 실 행 될 js 소스 코드 를 출력 합 니 다.
같은 이치 로 Function 의 연결 코드 를 쓸 수 있 습 니 다:

(function() {
  if (window.__cr_fun) return
  window.__cr_fun = window.Function
  var myfun = function () {
    var args = Array.prototype.slice.call(arguments, 0, -1).join(","), src = arguments[arguments.length - 1]
    console.log("================ Function begin: args=" + args + ", length=" + src.length + ",caller=" + (myfun.caller && myfun.caller.name) + " ===============")
    console.log(src);
    console.log("================ Function end ================")
    return window.__cr_fun.apply(this, arguments)
  }
  myfun.toString = function() { return window.__cr_fun + "" }
  Object.defineProperty(window, 'Function', { value: myfun })
  console.log(">>>>>>>>>>>>>> Function injected: " + document.location + " <<<<<<<<<<<<<<<<<<<")
})();
eval 과 달리 Function 은 길 어 지 는 매개 변수의 구조 방법 이 므 로 this 를 처리 해 야 합 니 다.
또한 일부 사 이 트 는 비슷 한 메커니즘 으로 페이지 내용 을 암호 화하 고document.write를 통 해 동적 복호화 내용 을 출력 하기 때문에 연결document.write도 할 수 있 고 연결 방법 은 eval 과 유사 하 며 여 기 는 중복 되 지 않 습 니 다.
주입 방식
또 하나의 문 제 는 연결 코드 의 주입 방법 이다.
가장 간단 한 것 은 F12 컨트롤 러 를 꺼 내 서 위의 코드 를 직접 실행 하 는 것 입 니 다.그러나 이것 은 hook 이 머 무 른 후에 만 호출 할 수 있 습 니 다.만약 에 페이지 가 불 러 오 자마자 주입 하려 면 다음 과 같은 몇 가지 방식 을 사용 할 수 있 습 니 다.
  • 오 일 원숭이 가 주입 하면 오 일 원숭이 는 문서 에 로드 된 몇 가지 서로 다른 상 태 를 감청 하고 특정한 시간 에 js 코드 를 집행 할 수 있다.저 는 연 구 를 많이 하지 않 았 습 니 다.구체 적 으로 는 오 일 원숭이 수첩
  • 을 참조 하 십시오.
  • 프 록 시 주입,응답 데 이 터 를 수정 하고탭 의 첫 번 째 위치 에노드 를 삽입 하여 다른 js 로드 실행 전에 주입 하도록 합 니 다.Fiddler,anyproxy 등 은 외부 규칙 을 작성 할 수 있 습 니 다.구체 적 으로 프 록 시 매 뉴 얼
  • 을 참조 하 십시오.
  • chrome-devtools-protocol 을 사용 하여 Page.addScriptToEvaluateOnNewDocument 를 통 해 외부 js 코드 를 주입 합 니 다
  • Fiddler 에이전트 규칙
    많은 사람들 이 프 록 시 규칙 을 사용 하지 않 았 습 니 다.여기에 Fiddler 의 규칙 작성 방법 을 쓰 십시오.
    Fiddler 메뉴 에서 Rules>Customize Rules 스 크 립 트 편집기 열기
    스 크 립 트 편집기 에서 OnBeforeResponse 방법 을 찾 습 니 다.방법 에 다음 코드 를 추가 합 니 다.
    
    if (oSession.oResponse.headers.ExistsAndContains("Content-Type", "html")){
      oSession.utilDecodeResponse(); // Remove any compression or chunking
      var b = System.Text.Encoding.UTF8.GetString(oSession.responseBodyBytes);
      var r = /<head[^>]*>/i;
      var js = "..."; // 要注入的js源码
      b = b.replace(r, "$0<script>" + js + "</script>");
      oSession.utilSetResponseBody(b); // Set the response body back
    }
    이렇게 하면 모든 html 문서 의 머리 에 자동 으로 js 코드 를 추가 합 니 다.
    총결산
    위 에서 말 한 것 은 편집장 이 소개 한 JS 에 eval,Function 등 시스템 함 수 를 주입 하여 동적 코드 를 캡 처 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 은 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

    좋은 웹페이지 즐겨찾기