ida에서 __usercall로 해석되는 함수의 경우는 2~3개 정도의 인자를 불특정 레지스터에 저장하고 사용하기 때문에
C에서 제공하는 calling convention으로 함수를 정의할 수 없었습니다.
(있다면 댓글로 자비좀 베풀어주세요.. )
어쩔 수 없이 naked형태로 후킹 함수를 구현하였습니다.
후킹 대상인 __usercall 함수는 4개의 인자를 사용하고 있습니다.
int __usercall 대상함수(int a1@<edx>, int a2@<esi>, int a3, int a4)
호출 시 레지스터는 유지하고, a3, a4만 push합니다.
호출이 끝나면 push한 만큼 esp를 복원해주고(hook함수 종료 시 mov esp, ebp를 해주니 복원할 필요가 없을듯하나 습관적으로 해주는것이 좋을듯) , 리턴값이 담긴 eax를 백업합니다.
esi와 edx는 __usercall 함수 내부에서 retn전에 pop을 해주기 때문에 따로 백업하지 않아도 됩니다.
이후에 각종 파라미터를 빼내는 함수를 호출하는데, __stdcall로 선언했으므로 따로 스택정리는 하지 않았습니다.
pTrampoline는 jmp 다음 명령어를 가리키도록 해주면 됩니다.
'Windows > Dev' 카테고리의 다른 글
get EIP (gcc / vc) (0) | 2019.04.11 |
---|---|
C용 초경량 XML 파서 : Mini-XML 소개 및 사용법 (0) | 2017.06.29 |
[C] 컴파일러 별 자료형 크기 비교 (0) | 2017.03.14 |
ollydbg plugin - 메모리에서 base64 참조 코드 검색하기 (0) | 2016.12.03 |
RPC 파이프를 이용한 브라우저와의 통신 (0) | 2015.05.21 |