(특히 46:30부터 57:30까지) .NET 코드 보호 http://secureteam.net/lidnug_recording/Untitled.swf에 대해, LIDNUG에서이 비디오를 시청 후, 나는 EXE에서 MessageBox.Show에 전화를 찾을 것 내가 만들었다.
내 "TrialApp.exe"의 유일한 논리는 다음과 같습니다
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
MessageBox.Show("This is trial app");
}
}
가 릴리스 구성에 컴파일 :
http://rapidshare.com/files/392503054/TrialApp.exe.html
나는 전화
실행을 찾기 위해 무엇을 WinDBG의 응용 프로그램을 열고 메시지 상자가 나타나면 중단하십시오.
는!clrstack
와 CLR 스택하세요 :
0040e840 5e21350b [InlinedCallFrame: 0040e840] System.Windows.Forms.SafeNativeMethods.MessageBox(System.Runtime.InteropServices.HandleRef, System.String, System.String, Int32)
0040e894 5e21350b System.Windows.Forms.MessageBox.ShowCore(System.Windows.Forms.IWin32Window, System.String, System.String, System.Windows.Forms.MessageBoxButtons, System.Windows.Forms.MessageBoxIcon, System.Windows.Forms.MessageBoxDefaultButton, System.Windows.Forms.MessageBoxOptions, Boolean)
0040e898 002701f0 [InlinedCallFrame: 0040e898]
0040e934 002701f0 TrialApp.Form1.Form1_Load(System.Object, System.EventArgs)
를 MethodDesc 구조 (를 Form1_Load의 주소를 사용하여) !ip2md 002701f0
MethodDesc: 001762f8
Method Name: TrialApp.Form1.Form1_Load(System.Object, System.EventArgs)
Class: 00171678
MethodTable: 00176354
mdToken: 06000005
Module: 00172e9c
IsJitted: yes
CodeAddr: 002701d0
Transparency: Critical
Source file: D:\temp\TrialApp\TrialApp\Form1.cs @ 22
(MethodDesc 의해)이 방법의 IL 덤프 !dumpil 001762f8
IL_0000: ldstr "This is trial app"
IL_0005: call System.Windows.Forms.MessageBox::Show
IL_000a: pop
IL_000b: ret
그래서 비디오에 언급 된대로 Show
에 대한 호출은 메소드 구현의 시작부터 5 바이트입니다.
이제 CFFExplorer를 열고 (비디오 에서처럼) Form1_Load 메서드의 RVA를 얻습니다 : 00002083
.
이 후 주소 변환기 (다시 CFF 탐색기)로 이동하여 오프셋 00002083
으로 이동합니다. 거기에서 우리는이 : 비디오에서
32 72 01 00 00 70 28 16 00 00 0A 26 2A 7A 03 2C
13 02 7B 02 00 00 04 2C 0B 02 7B 02 00 00 04 6F
17 00 00 0A 02 03 28 18 00 00 0A 2A 00 03 30 04
00 67 00 00 00 00 00 00 00 02 28 19 00 00 0A 02
를위한 오피해야한다 그래서 구현의 처음부터 그들에게
2A 7A 03 2C
13 02 7B 02 00 00 04 2C 0B 02 7B 02 00 00 04 6F
17 00 00 0A 02 03 28 18 00 00 0A 2A 00 03 30 04
00 67 00 00 00 00 00 00 00 02 28 19 00 00 0A 02
5 바이트를 건너 처음 12 바이트 방법 헤더에 대한 것을 언급 메서드 호출 (28). 불행히도, 거기 있지 않습니다.
02 7B 02 00 00 04 2C 0B 02 7B 02 00 00 04 6F
17 00 00 0A 02 03 28 18 00 00 0A 2A 00 03 30 04
00 67 00 00 00 00 00 00 00 02 28 19 00 00 0A 02
질문 : 내가 잘못 뭐하는 거지
- ?
- 파일의 해당 위치에서 메서드 호출이없는 이유는 무엇입니까? 또는 비디오에 일부 정보가 누락되었을 수 있습니다 ...
- 왜 비디오의 녀석이 통화를 9 개의 0으로 대체합니까?
안녕하세요! 귀하의 답변에 감사드립니다. 컴파일러로 코드를 컴파일하셨습니까? 네가 다른 RVA를 가지고 있기 때문에. 문제는 VS2010 (대상 플랫폼은 .NET 4.0)에서 컴파일러를 사용했기 때문에 발생했을 수 있습니까? –
물론 CLR 버전 4에서 내부 구조가 완전히 변경되었을 수도 있습니다. 문서화되지 않은 CLR 데이터 구조를 해킹하고 있다면 무엇이든 가능합니다. SSCLI 2.0 소스 코드 덕분에 무엇인가 알려진 유일한 이유가 있습니다. 이미 5 세 이상입니다. –
발견 (전화)! 제가 제거한 12 바이트에있었습니다. (처음부터 6 바이트 : 28 16 00 00 0A). Hans Passant, 유용한 답변을 주셔서 대단히 감사합니다! –