❶ 一段反匯編代碼求高手指點
004B7380 8B4C24 08 mov ecx,dword ptr ss:[esp+0x8] // ecx = A
004B7384 53 push ebx
004B7385 55 push ebp
004B7386 56 push esi //入棧保存現場
004B7387 8B7424 10 mov esi,dword ptr ss:[esp+0x10] // esi = B 應該也是一個地址
004B738B 57 push edi //
004B738C 33FF xor edi,edi // 0
004B738E 8B2E mov ebp,dword ptr ds:[esi] //ebp保存基址
004B7390 8B56 04 mov edx,dword ptr ds:[esi+0x4] // edx = C
004B7393 8B46 08 mov eax,dword ptr ds:[esi+0x8] // eax = D
004B7396 3BCF cmp ecx,edi // 判斷 ECX(A) 是否 > 0
004B7398 897C24 14 mov dword ptr ss:[esp+0x14],edi //esp+0x14 = 0
004B739C 76 3A jbe Xserver_c.004B73D8 // 不是的話則跳轉到 004B73D8
004B739E 83F8 01 cmp eax,0x1 // 否則比較 eax(D) 是否比 1 小
004B73A1 72 35 jb Xserver_c.004B73D8 //是的話 跳到 004B73D8
004B73A3 B9 07000000 mov ecx,0x7 // 否則 ecx(A) = 7
004B73A8 BB 01000000 mov ebx,0x1 // ebx = 1
004B73AD 2BCA sub ecx,edx // ecx = 7 - edx (C)
004B73AF D3E3 shl ebx,cl // ebx 向←移動 cl 位(Byte/最後一位進入CF位)
004B73B1 8A4D 00 mov cl,byte ptr ss:[ebp] // 也就是 B 地址的第一個位元組 呵呵~~
004B73B4 22D9 and bl,cl // bl cl 兩個 Byte 寄存器 & 操作
004B73B6 F6DB neg bl // bl 求補 用 0 - bl
004B73B8 1BDB sbb ebx,ebx // 看 CF 位 CF 位 = 0 那麼 ebx = 0 否則 ebx = 0xFFFFFFFF
004B73BA F7DB neg ebx // ebx 求補
004B73BC 42 inc edx // ebx++
004B73BD 83E2 07 and edx,0x7 // ebx 與 7 與操作 ..ebx最高只能為 7
004B73C0 8D3C7B lea edi,dword ptr ds:[ebx+edi*2] // edi = ds:[ebx+edi*2] 的地址
004B73C3 75 02 jnz Xserver_c.004B73C7 // 若 and 結果不為 0 則跳轉 到 004B73C7
004B73C5 48 dec eax // D--
004B73C6 45 inc ebp // ebp ++
// 004B73C7 //
8B4C24 14 mov ecx,dword ptr ss:[esp+0x14] // ecx = 0 (esp+0x14 = 0)
004B73CB 8B5C24 18 mov ebx,dword ptr ss:[esp+0x18] // ebx = esp+0x18
004B73CF 41 inc ecx // ecx ++ ecx = 1
004B73D0 3BCB cmp ecx,ebx // 1 - ebx
004B73D2 894C24 14 mov dword ptr ss:[esp+0x14],ecx // esp+0x14 = 1
004B73D6 ^ 72 C6 jb Xserver_c.004B739E // ebx 是否 > 1 大於 則 轉移 004B739E
// 004B73D8 //
8946 08 mov dword ptr ds:[esi+0x8],eax // D = eax
004B73DB 8BC7 mov eax,edi // 看之前的跳轉分支 ... 決定 eax 是什麼 ..
004B73DD 892E mov dword ptr ds:[esi],ebp
004B73DF 8956 04 mov dword ptr ds:[esi+0x4],edx // C = edx
004B73E2 5F pop edi // 出棧 恢復現場
004B73E3 5E pop esi
004B73E4 5D pop ebp
004B73E5 5B pop ebx
004B73E6 C3 retn //子程序返回
❷ 反匯編MOV DWORD PTR DS:[ESI+62C],EDI是什麼意思
dwore ptr 表示佔用兩個位元組的大小
ds:[esi+62c] 表示內存的地址 其中ds是段地址 [esi+62c]是偏移地址
edi 它就是寄存器了內
所以 MOV DWORD PTR DS:[ESI+62C],EDI 就是將 edi 中的數據容存儲到內存中 地址為ds:[esi+62c]到 ds:[esi+62e]
❸ 匯編語言中的rep指令的作用
重復執行後面的指令
rep stos dword ptr [edi]
是將edi指向的區域初始化為0CCCCCCCCh
應該是12h*4個位元組,可以理解為一個函數,傳來的回某個參數為指針,然後將答這個指針指向的區域初始化
void fun(long *p)
{
int i;
// 12h=18
for(i=0;i<18;i++)
{
p[i]=0CCCCCCCCh;
}
}
相當於這個函數的功能
❹ 匯編 xor dword ptr [edi], ebp 是什麼意思啊
al寄存器的數字減去31,也就是計算a1寄存器中存儲的數據與"1"的ASCII之差
❺ 匯編語言mov [ebx+18],edi什麼意思大俠解釋下。。
1。將ebx的值拿出來加上18,結果記為X
2。將edi的值復制給內存地址為X的空間
比如ebx = 2, ebx+18 = 20(這里姑且理解18為十進制), edi = 6
假設內存數據全是0,
內存地址 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
內存數據 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
因為edi是32位寄存器,所以edi=0x00000006,而Intel或AMD的CPU都是little endian的,little endian理解起來就是把32位按8位分組,再顛倒,比如0x12345678在內存里就是78 56 34 12,所以存入內存地址20的空間就是(佔用20 21 22 23,因為一個位元組8位):
內存地址 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 |20 21 22 23| 24 25
內存數據 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |06 00 00 00| 00 00
mov [ebx+18],edi在反匯編里一般就是將一個對象的成員值改為edi
相當於c++里的:
obj->shift18 = edi;
或者c里的:
arr[shift18] = edi;
❻ 反匯編!!!求高手解釋呀!!!謝了呀!
因為在我們現實編程的時候很多時候都需要使用局部變數....
push ebp ebp入棧,將來要用ebp來操作堆棧,所以要保存他的地址
mov ebp,esp 如上所說,esp是堆棧指針寄存器,吧它賦給ebp,這樣就可以用ebp來操作堆棧了
sub esp,48h 表示開辟48個位元組的地址空間供局部變數使用
......
sub之後esp指向了棧的更低的地址...這樣就可以用esp來操作局部變數了, ebp來操作參數了..互不影響
當然在函數返回時必須要平衡堆棧
ret 48h
或者
add ,esp,48h
ret