首页
社区
课程
招聘
[求助][求助]菜鸟问题,看雪的《加密与解密》有几个地方不懂,请指点。
发表于: 2013-10-28 11:28 4501

[求助][求助]菜鸟问题,看雪的《加密与解密》有几个地方不懂,请指点。

2013-10-28 11:28
4501
最近买了看雪的书,《加密与解密》第三版,但看到第二章的动态分析技术,分析那个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直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
既然函数都执行完了,寄存器中的值当然会发生变化。
2013-10-28 12:31
0
雪    币: 56
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
楼主的问题是push ebx,esp为什么自动减4?

ESP为栈指针,用于指向栈的栈顶,push ebx 是把ebx压入栈中,ESP为栈指针的值当然要变

因为ebx有4个字节,所以是减4
2013-10-28 14:18
0
游客
登录 | 注册 方可回帖
返回