위 사진을 보면 읽기 모드이고 OPEN_EXISTING으로 열었다는 사실을 알 수 있다. 그리고 경로도 따로 지정되어 있지 않고 파일 이름만 정해져 있으면 현재 실행 중인 프로그램이 있는 폴더 내에서 찾는다.
함수를 실행하는데 여러개의 인자가 필요하므로 인자 값을 전달한다.
현재는 JNZ조건문이 수행되도록 하기 위한 2가지 방법이 있다.
1
2
hFile : 정상적으로 파일을 열었을 때 핸들링한 것을 반환하는데 그 핸들을 통해 파일을 제어할 수 있다. hFile에는 핸들에 대한 ID(숫자 정보)가 들어간다.
Buffer : 어디에 이 데이터를 쓸 것이지를 세팅해준다.
BytesToRead : 몇바이트나 읽을 것인지를 저장한다. 사진에 46은 16진수 70은 10진수를 의미
pBytesRead : 실질적으로 읽어 들인 바이트의 개수
1. JNZ조건문은 EAX가 0이라서 4010B4로 분기되지 않고 다음 주소로 이동한다.
2. JMP조건문을 수행하면 4010F7번지의 "Keyfile is not valid. Sorry."라는 문구가 뜨는 MessageBoxA 함수가 뜨고
ExitProcess로 인해 프로그램이 종료되기 때문에 JNZ조건문에서는 강제로 JMP 시켜야 한다.
3. "XOR EBX,EBX", "XOR ESI,ESI" 명령어는 EBX와 ESI를 각각 0으로 초기화시키는 명령어이다.
4. CMP비교문을 수행하면 JL조건문의 조건이 충족되기 때문에 분기가 진행되는데 분기되는 주소는 MessageBoxA 함수가 동작해 오류가 발생하는 부분이기 때문에 패치가 필요하다.
디버거를 재시작하고 40107B번지와 4010B0번지를 Break Point 지정하고 ZF를 0으로 바꿔준다.
문제는 해결했으나 이렇게 파일을 만들면 항상 했던 일들을 반복해야 하는 단점이 있어서 파일을 수정해서 저장하는 것이 좋다.
JMP로 패치하면 무조건 분기되는 주소로 이동한다.
JMP 하면 안 되기 때문에 NOP(=NO OPERATION)으로 채워준다.