성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Roll A Lisp In C - Reading ; https...
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>windbg - 특정 Win32 API에서 BP가 안 걸리는 경우 (2)</h1> <p> 전에 알아본 방법이,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > windbg - 특정 Win32 API에서 BP가 안 걸리는 경우 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12429'>https://www.sysnet.pe.kr/2/0/12429</a> </pre> <br /> WS2_32.dll의 함수들에는 제법 많이 틀리군요. ^^; 예를 들어 다음과 같이 간단한 예제도,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > using System; using System.Net; using System.Net.Sockets; class Program { static void Main(string[] args) { Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); byte[] buf = new byte[4]; socket.GetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, buf); Console.ReadLine(); socket.GetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, buf); socket.Bind(new IPEndPoint(IPAddress.Any, 0)); } } </pre> <br /> Console.ReadLine 단계에서 windbg로 연결해 bp를 이렇게 걸어보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 0:000> <span style='color: blue; font-weight: bold'>bp WS2_32!bind</span> 0:000> <span style='color: blue; font-weight: bold'>bp WS2_32|getsockopt</span> 0:000> <span style='color: blue; font-weight: bold'>bp WS2_32|socket</span> </pre> <br /> bind 빼고는 엉뚱한 곳에 걸립니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 0:000> <span style='color: blue; font-weight: bold'>bl</span> 0 e Disable Clear 00007ff9`0bc209c0 0001 (0001) 0:**** ws2_32!bind 1 e Disable Clear 00007ff9`0bebee90 0001 (0001) 0:**** sechost!ControlLookup+0x84a0 2 e Disable Clear 00007ff9`0bdd81f0 0001 (0001) 0:**** IMM32!SendIMEMessageAll+0x24 </pre> <br /> 문제는, 지난번과는 달리 이번엔 다른 DLL의 API를 호출하는 유형이 아니라서 IAT 검색도 도움이 안 됩니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 할 수 없군요, 기존에 만들어 두었던 windbg 확장 DLL에,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Windbg 확장 DLL 만들기 (3) - C#으로 만드는 방법 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12119'>https://www.sysnet.pe.kr/2/0/12119</a> </pre> <br /> 다음과 같은 ubp 함수를 추가했습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > // <a target='tab' href='https://github.com/stjeong/DotNetSamples/blob/master/WinConsole/Debugger/NetDbgExt/UnmanagedMain.cs#L66'>https://github.com/stjeong/DotNetSamples/blob/master/WinConsole/Debugger/NetDbgExt/UnmanagedMain.cs#L66</a> [DllExport(CallingConvention = CallingConvention.StdCall)] public static uint <span style='color: blue; font-weight: bold'>ubp</span>(IDebugClient pDebugClient, [MarshalAs(UnmanagedType.LPStr)] string args) { if (!(pDebugClient is IDebugControl dbgControl)) { return 0; } string[] arg = args.Split('!'); if (arg.Length != 2) { dbgControl.Output(DEBUG_OUTPUT.NORMAL, $"Invalid argument\n"); return 0; } string dllPath = arg[0]; string apiName = arg[1]; IntPtr ptrDllAddress = LoadLibrary(dllPath); if (ptrDllAddress == IntPtr.Zero) { dbgControl.Output(DEBUG_OUTPUT.NORMAL, $"DLL not found\n"); return 0; } IntPtr ptrApiAddress = GetProcAddress(ptrDllAddress, apiName); if (ptrApiAddress == IntPtr.Zero) { dbgControl.Output(DEBUG_OUTPUT.NORMAL, $"API not found\n"); return 0; } string text = (IntPtr.Size == 4) ? ptrApiAddress.ToInt32().ToString("x") : ptrApiAddress.ToInt64().ToString("x"); dbgControl.Execute(DEBUG_OUTCTL.THIS_CLIENT, $"bp {text}", DEBUG_EXECUTE.DEFAULT); return 0; } </pre> <br /> 그래서 다음과 같이 사용할 수 있어,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 0:000> <span style='color: blue; font-weight: bold'>!NetDbgExt.ubp ws2_32.dll!getsockopt</span> 0:000> <span style='color: blue; font-weight: bold'>bl</span> 0 e Disable Clear 00007ff9`0bc21b80 0001 (0001) 0:**** ws2_32!getsockopt 0:000> <span style='color: blue; font-weight: bold'>!ubp ws2_32.dll!bind</span> 0:000> <span style='color: blue; font-weight: bold'>bl</span> 0 e Disable Clear 00007ff9`0bc21b80 0001 (0001) 0:**** ws2_32!getsockopt 1 e Disable Clear 00007ff9`0bc209c0 0001 (0001) 0:**** ws2_32!bind </pre> <br /> 조금 편해졌군요. <br /> <br /> <hr style='width: 50%' /><br /> <br /> 하지만 ubp 확장 명령어에는 알아둬야 할 문제가 2가지 있습니다.<br /> <br /> 1) 우선, windbg.exe 프로세스 내에 대상 DLL들이 적재되어 올라온다는 점인데, 디버깅 중에 저렇게 써야 할 경우가 많지 않을 것이라는 점을 감안했을 때 크게 문제가 되지는 않습니다<br /> <br /> 2) <a target='tab' href='https://www.sysnet.pe.kr/2/0/545'>ASLR</a>에 의해 시스템 부팅 후 매번 주소가 달라지겠지만, 디버깅 중에는 같은 시스템 내에서 바뀔 일이 없으므로 대부분의 경우에 안전하게 사용할 수 있습니다. 하지만, (가령 이미 다른 DLL이 점유하고 있다거나 하는 등의 이유로) 대상 프로세스의 dll 로딩 주소가 windbg 내에서는 다른 로딩 주소로 매핑될 수 있기 때문에 ubp 명령어가 100% 동작할 거라는 기대를 해서는 안 됩니다.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1513
(왼쪽의 숫자를 입력해야 합니다.)