部分C庫函數重寫以及反彙編分析之memch()

/*////////////////////////////////////////////////////////////////////////////////////

從buf所指內存區域的前count個字節查找字符ch。   
說明:當第一次遇到字符ch時停止查找。如果成功,返回指向字符ch的指針;否則返回NULL。 

*//////////////////////////////////////////////////////////////////////////////////////


#include "stdafx.h"
#include <stdio.h>

void *pmesch(void *buf , int ch , int count);

int main(int argc, char* argv[])
{
	char a1[]="abcdef";

	int a2=99;

	if (pmesch(a1,a2,4))
	{
		printf("查找成功\n");
	}
	else
		printf("查找失敗\n");

	return 0;
}

void *pmesch(void *buf , int ch , int count)
{
	char temp_ch=(char)ch;

	char *temp_buf=(char *)buf;

	while (count--)
	{
		if (*temp_buf==temp_ch)
		{
			return temp_buf;
		}

		temp_buf++;
	}

	return 0;
}


函數很簡單,不說了,直接OD反彙編分析:

00401000  /$  83EC 08       sub esp,8                                 ;  移動棧頂指針,給變量分配內存空間
00401003  |.  A1 48704000   mov eax,dword ptr ds:[407048]
00401008  |.  66:8B0D 4C704>mov cx,word ptr ds:[40704C]               ;  cx=ef
0040100F  |.  8A15 4E704000 mov dl,byte ptr ds:[40704E]               ;  設置控制檯終端類型
00401015  |.  894424 00     mov dword ptr ss:[esp],eax
00401019  |.  6A 04         push 4
0040101B  |.  8D4424 04     lea eax,dword ptr ss:[esp+4]              ;  將eax由存放abcd的值變爲存放abcd的首地址
0040101F  |.  6A 63         push 63
00401021  |.  50            push eax
00401022  |.  66:894C24 10  mov word ptr ss:[esp+10],cx               ;  將ef存到abcd地址後面
00401027  |.  885424 12     mov byte ptr ss:[esp+12],dl
0040102B  |.  E8 30000000   call memch.00401060
00401030  |.  83C4 0C       add esp,0C                                ;  堆棧平衡
00401033  |.  85C0          test eax,eax
00401035  |.  74 13         je short memch.0040104A
00401037  |.  68 3C704000   push memch.0040703C
0040103C  |.  E8 4F000000   call memch.00401090
00401041  |.  83C4 04       add esp,4
00401044  |.  33C0          xor eax,eax
00401046  |.  83C4 08       add esp,8
00401049  |.  C3            retn
0040104A  |>  68 30704000   push memch.00407030
0040104F  |.  E8 3C000000   call memch.00401090
00401054  |.  83C4 04       add esp,4
00401057  |.  33C0          xor eax,eax
00401059  |.  83C4 08       add esp,8
0040105C  \.  C3            retn
0040105D      90            nop
0040105E      90            nop
0040105F      90            nop
00401060  /$  8B4C24 0C     mov ecx,dword ptr ss:[esp+C]              ;  count=4
00401064  |.  8B4424 04     mov eax,dword ptr ss:[esp+4]              ;  eac存放a地址
00401068  |.  8BD1          mov edx,ecx                               ;  while(count--) edx=4
0040106A  |.  49            dec ecx                                   ;  ecx=3
0040106B  |.  56            push esi
0040106C  |.  85D2          test edx,edx                              ;  while循環的判斷條件,只要edx!=0,zf=0;
0040106E  |.  74 10         je short memch.00401080
00401070  |.  8A5424 0C     mov dl,byte ptr ss:[esp+C]                ;  dl=c
00401074  |>  3810          /cmp byte ptr ds:[eax],dl                 ;  判斷指針所指位置值是否爲c
00401076  |.  74 0A         |je short memch.00401082
00401078  |.  40            |inc eax
00401079  |.  8BF1          |mov esi,ecx
0040107B  |.  49            |dec ecx
0040107C  |.  85F6          |test esi,esi
0040107E  |.^ 75 F4         \jnz short memch.00401074
00401080  |>  33C0          xor eax,eax
00401082  |>  5E            pop esi
00401083  \.  C3            retn

總是反彙編這種簡單的沒意思,打算加大難度了。噎死。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章