Ctrl + N
현재 실행파일에서 사용하겠다고 말한 함수들의 이름을 볼 수있다.
IsDebugger
1. IsDebuggerPresent 를 검색해서 찾는다.
즉 , 안티리버싱에 관한 함수를 알아내서 그 함수를 알고, 이름을 통해 그 분기를 찾아 가는 것이다.
이러한 안티리버싱에 관련된 함수를 구글에 검색해서 무슨 함수인지 알아본다.
https://docs.microsoft.com/en-us/windows/desktop/api/debugapi/nf-debugapi-isdebuggerpresent
소스로 짜기위해서는
_WIN32_WINNT 매크로를 0x0400 이상을 정의해야한다.
StdAfx.h에 #define _WIN32_WINNT 0x0501 을 정의
소스.
함수안에 코드 분석
MOV EAX,DWORD PTR FS:[18]
FS의 값에 18을 더한 값을 EAX에 넣는다.
MOV EAX,DWORD PTR DS:[EAX+30]
위의 값에 30을 넣은 값이 EAX에 저장
MOVZX EAX,BYTE PTR DS:[EAX+2]
__asm은 어셈블리어를 사용하게 해주는 함수이다.
ntqueryinformationprocess 함수
함수에 대한 설명
https://docs.microsoft.com/en-us/windows/desktop/api/winternl/nf-winternl-ntqueryinformationprocess
ntqueryinformationprocess를 사용하려면 LoadLibrary GetProcAddress함수를 사용해야한다.
이 함수는 디버거 포트를 통해 판단한다.
ntqueryinformationprocess
위의 함수에서 사용하는 GetProcAddress와 LoadLibrary를 통해 확인할 수 있다.
nt함수는 위의 2개함수를 사용한다.
LoadLibrary함수가 먼저실행되고, GetPorcAddress가 실행된다.
ntqueryinformationprocess는 바로 호출이 되지 않기 때문에 zwQueryinformationprocess먼저 호출하고 호출된다.
이함수의 인자값은 5개
0번부터 세는 것이다. 즉 , 7번째는 ProcessDebugPort
그냥 실행 시
CheckRemoteDebuggerPresent 함수
https://docs.microsoft.com/en-us/windows/desktop/api/debugapi/nf-debugapi-checkremotedebuggerpresent
매개변수가 2개인 함수이다.
지정된 프로세스가 디버깅되고 있는지 여부를 결정하는 함수이다.
함수가 성공하면(디버깅중이면) 반환값이 0이아니고, 실패하면 반환값이 0이다.
똑같이 Ctrl+ N을 통해 위의 함수를 찾는다.
위의 주소를 break를 걸고 그 주소로 찾아간다.
값이 1 즉, 0이 아니면 디버깅중이라 판단.
JE를 JMP로 변경해 흐름분기를 우회한다.
SetLastError
GetLastError
OutPutDebugString
표시를 위해 문자열을 디버거에 보내는 함수
https://docs.microsoft.com/en-us/windows/desktop/api/debugapi/nf-debugapi-outputdebugstringw
Ctrl + N 으로 OutPutString을 찾아 온다.
GetLastError 는 LastError의 값을 가져온다. EAX로 가져옴
디버거가 있으면 에러가 일어나지 않고, 디버거가 없으면 에러가난다. 이것으로 판별.
LastError -> 마지막 에러를 캐치함. 즉 , 에러가 있으면 디버거가 없다 판단.
에러가 없으면 디버거가 있다판단.
즉 , 같으면 디버깅이 있다고 판단하므로 안티디버깅 활성화
따라서 JNZ를 JMP로 변경해 우회
findWindow
활성화 중인 창에서 OllyDbg를 찾는다.
Ctrl + n 을통해 들어간다. 이번에는 2군데라 2군데 전부 break Point 를 건다.
OLLYDBG라는 창을 찾으면(0이 아니면) EAX에 값이 담겨 점프가 되어 OllyDBG Detected가 뜨고
창을 찾지 못하면 EAX값은 0이되어 점프를 하지 않아, Not Detected가 뜬다.
따라서 JNZ를 NOP 으로 변경하면된다.
AnitQuiz1
디버깅을 실행시켜 Strat를 누르면, 메모장이 뜨면 성공
winexec는 응용프로그램을 실행시키는 함수.
https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-winexec
-1 나 자신
1E -> 30번 째 ProcessDebugObjectHandle을 의미