lena 2번강의는 lena 강의 01과 같은
![](https://t1.daumcdn.net/cfile/tistory/165336414F6DDB1734)
파일을 CPU레지스터와 어셈블리언어, 진수변환을 이용하여 패치하는 방식이다.
마찬가지로 OllyDbg를 이용하여 열어본당
![](https://t1.daumcdn.net/cfile/tistory/2042453C4F6DE69303)
CreatFileA는 새로운 파일을 생성한다는 의미의 API함수.
파일이름은 "Keyfile.dat"이다. 이 파일이 우리가 원하는 라이센스를 취득할 수 있도록 해주는 키 파일이 되는것으로 보인다.
notepad를 이용하여 "Keyfile.dat" 을 생성해 본다.
![](https://t1.daumcdn.net/cfile/tistory/1241F63B4F6DE9682E)
![](https://t1.daumcdn.net/cfile/tistory/1341F63B4F6DE9682F)
ReadFile은 파일을 읽어오는 API함수.
F8을 눌러 진행한다.
![](https://t1.daumcdn.net/cfile/tistory/157850344F6DE8A72F)
TEST : 두 피연산자 사이에 논리적인 AND연산을 수행하여 플래그 레지스터에 영향을 주지만 결과값은 저장하지 않는다. OF와 CF는 항상 0으로 세트되고 TEST 연산 결과값이 0이면 ZF가 1로, 0이 아니면 ZF가 0으로 세트된다.
EAX와 EAX를 TEST한다. 이때 EAX값은 1이다.
![](https://t1.daumcdn.net/cfile/tistory/142FBE3C4F6DEB3628)
JNZ SHORT reverseM.004010B4
의 ZF가 0이면 빨간 화살표를 따라 점프한다.
F8을 눌러 진행한다.
![](https://t1.daumcdn.net/cfile/tistory/144F5A3F4F6DEDD603)
![](https://t1.daumcdn.net/cfile/tistory/164F5A3F4F6DEDD704)
ESI값은 0이다.
![](https://t1.daumcdn.net/cfile/tistory/153E7F424F6DEE020E)
DWORD PTR DS:[402173]과 10h을 비교한다.
노란 선을 보아, DS:[402173]은 0인 것을 알 수 있다.
(주소값 402173 <<"Keyfile.dat"을 의미함)
여기에서 10h은 HEX값으로, 10진수로 변환시켜주어야 한다.
우리는 계산기를 이용하여 변환시켜줄 것이다.
![](https://t1.daumcdn.net/cfile/tistory/167919444F6DEEA129)
![](https://t1.daumcdn.net/cfile/tistory/147919444F6DEEA12A)
이 결과, 16이다.
즉, DS:[402173]이 0이라는 것은
"Keyfile.dat"의 글자 수가 0이기 때문이고,
주소값의 글자 수와 16을 비교함으로써,
글자 수가 16이라는 것을 알 수 있다.
F8을 눌러 진행시킨다.
![](https://t1.daumcdn.net/cfile/tistory/15288D364F6DEC5E2C)
이번 점프문은 lena (01)에서 봤듯이,
"Keyfile is not valid, Sorry"라는 창을 띄우도록 한다.
우리가 원치 않는 값이므로,
이 부분으로 점프하지 않도록 바꾸어준다.
![](https://t1.daumcdn.net/cfile/tistory/164D2E434F6DF0B416)
"JMP SHORT reverseM.004010F7"의 1인 SF를
![](https://t1.daumcdn.net/cfile/tistory/184D2E434F6DF0B517)
0으로 변경시켜 줌으로써 점프를 방지할 수 있다.
SF(Sign Flag) : 연산 결과가 음수가 되었을 때 세트(1), 양수가 되었을 때 해제.
![](https://t1.daumcdn.net/cfile/tistory/176AC4404F6DF21C11)
DS : [EBX+40211A]의 값을 AL에 대입한다.
원래 AL값은 1이었으나, 0으로 바뀐다.
![](https://t1.daumcdn.net/cfile/tistory/153723414F6DF27616)
AL값과 0을 비교하는 구문.
![](https://t1.daumcdn.net/cfile/tistory/13581F464F6DF4382A)
이전의 JE를 패스하기 위하여, 아까와 같은 방법으로 잠시 패스해준다.
AL값과 47h을 비교하는 구문.
47h는 아스키값으로 "G"
![](https://t1.daumcdn.net/cfile/tistory/12045D3D4F6DF29A27)
AL값과 0이 Equal(같음)이 될 경우, ESI와 8을 비교하도록 점프한다.
![](https://t1.daumcdn.net/cfile/tistory/1327BB454F6DF2C933)
ESI값은 0이다. ("KeyFIle.dat"의 글자 수가 0)
즉, KeyFile.dat이 요구하는 글자 수는 8이라는 것을 알 수 있다.
따라서 G가 8자리 이상이여야 하며, 총 16자리이어야 한다.
![](https://t1.daumcdn.net/cfile/tistory/155F9F3F4F6DF30F04)
역시나 원치 않는 부분으로 점프하는 구문이므로 SF값을 0으로 변경해준다.
![](https://t1.daumcdn.net/cfile/tistory/1279AA3D4F6DF3B834)
![](https://t1.daumcdn.net/cfile/tistory/1379AA3D4F6DF3B835)
우리가 원하는 부분으로 가는 마지막 점프문으로 도달했다!
이제 이 파일의 분석을 끝내고
아까의 KeyFile.dat으로 다시 돌아와서,
![](https://t1.daumcdn.net/cfile/tistory/117D7B444F6DF55B3A)
를 저장한 뒤 ReverseMe파일을 실행시켜보면 된다.
![](https://t1.daumcdn.net/cfile/tistory/150ED73D4F6DF5D826)