`
yuanlanjun
  • 浏览: 1176737 次
文章分类
社区版块
存档分类
最新评论

部分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

总是反汇编这种简单的没意思,打算加大难度了。噎死。。。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics