最近买了看雪的书,《加密与解密》第三版,但看到第二章的动态分析技术,分析那个TraceMe.exe后有几个地方没看懂,还望热心人给与指点。
源码:len=GetDlgItemText(hDlg,IDC_TXT0,cName,sizeof(cName)/sizeof(TCHAR)+1);
004011AA lea eax, dword ptr [esp+4C]
004011AE push 51 ; /Count = 51 (81.)
004011B0 push eax ; |Buffer
004011B1 push 6E ; |ControlID = 6E (110.)
004011B3 push esi ; |hWnd
004011B4 call edi ; \GetDlgItemTextA
004011B6 lea ecx, dword ptr [esp+9C]
push eax的时候,eax是倒数第二个参数,也就是表示cName,我在执行完上面代码后,发现eax指向的值并不是输入的用户名(照书上输入了用户名pediy),我知道函数会将返回值保存在eax中,所以我知道这里只能去查看[esp+4c]才是cName的值。这一段我能够理解,此处还没发现问题,接下来就会发现有问题了。请看后面。源码:GetDlgItemText(hDlg,IDC_TXT1,cCode,sizeof(cCode)/sizeof(TCHAR)+1);
004011BD push 65 ; /Count = 65 (101.)
004011BF push ecx ; |Buffer
004011C0 push 3E8 ; |ControlID = 3E8 (1000.)
004011C5 push esi ; |hWnd
004011C6 mov ebx, eax ; |
004011C8 call edi ; \GetDlgItemTextA
push ecx,说明ecx保存的是cCode的地址,我在执行完上面这段代码后,查看ecx指向的值,并不是输入的序列号。上一段代码中的不能通过查看eax指向的值来得到用户名cName我还可以理解,因为eax要放函数的返回值len,但这一段代码中,为什么在调用完GetDlgItemTextA后,ecx中的值也会改变呢?
源码:if (cName[0] == 0||len<5)
004011CA mov al, byte ptr [esp+4C]
004011CE test al, al
004011D0 je short 00401248
004011D2 cmp ebx, 5
004011D5 jl short 00401248
源码:GenRegCode(cCode, cName ,len)
004011D7 lea edx, dword ptr [esp+4C]
004011DB push ebx
004011DC lea eax, dword ptr [esp+A0]
004011E3 push edx
004011E4 push eax
004011E5 call 00401340
lea eax, dword ptr [esp+A0]这一句表示将序列号放置到eax中,但前面第一段代码最后明明是[esp+9C]表示的是序列号,为什么在这里又变为了是[esp+A0]是序列号了呢?为什么9C变为了A0呢?我调试后发现esp在执行完了上面的push ebx后,esp的值自动变化了,自动减了4,这是为什么呢?
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课