hackcatml 2021. 12. 18. 23:51
반응형

모의해킹 업무를 진행하다보면 DRM과 이미지 캡쳐방지 보안으로 인해 업무 효율이 많이 떨어지곤 합니다.

오래전 뉴스(2011년도)이긴 하지만 DRM 업체에서 최종 납품시에는 이용자PC 느려진다는 이유로 API 후킹 방지 기능을 축소한다고도 하는군요.( https://www.boannews.com/media/view.asp?idx=27444 )

실제로 dll 파일을 분석해보니 어렵지 않게 우회 포인트를 찾을 수 있었습니다.

그 후에는 dll 인젝션이나 프리다 후킹을 통해 우회가 가능합니다.

 

간단한 DRM 우회 후킹 예시코드는 다음과 같습니다. 특정 암복호화 관련 dll이 로드 되는걸 기다렸다가, 해당 모듈이 로드되면Interceptor.replace API를 이용하여 "암호화함수"를 replace하여 해당 함수 호출 시 "복호화함수"가 호출되도록 하면, 문서 저장시 복호화된 문서가 저장되도록 하는 것입니다.

var awaitForCondition = function(callback) {
    var module_loaded = 0;
    var int = setInterval(function() {
        Process.enumerateModulesSync()
        .filter(function(m){ return m['path'].toLowerCase().indexOf('암복호화') != -1; })
        .forEach(function(m) {
            console.log("암복호화.dll loaded!");
            return module_loaded = 1;
        })
        if(module_loaded) {
            clearInterval(int);
            callback();
            return;
        }
    }, 0);
}

function replace_function(module_name, function_name){
    // 암호화함수, 복호화함수의 pointer 획득
    var 암호화함수Ptr = Module.getExportByName(module_name, function_name);
    var 복호화함수Ptr = Module.getExportByName(module_name, "복호화함수")
    
    // 원본 복호화함수
    var 복호화함수 = new NativeFunction(복호화함수ptr, 'bool', ['pointer', 'pointer', 'pointer', 'pointer']);

    // 암호화함수 Replace
    Interceptor.replace(암호화함수Ptr, new NativeCallback(function (arg1, arg2, arg3, arg4) {
      console.log("암호화함수 function got replaced");
     // 복호화함수 호출
      var retval = 복호화함수(arg1, arg2, arg3, arg4);
      console.log("복호화함수 retval: " + retval);
      return retval;
    }, 'bool', ['pointer', 'pointer', 'pointer', 'pointer']));
}

function hook() {
    replace_function("암복호화.dll", "암호화함수")
}

awaitForCondition(hook);

 

반응형