部分C庫函式重寫以及反彙編分析之memch

2021-06-08 04:23:07 字數 3408 閱讀 4520

/*

從buf所指記憶體區域的前count個位元組查詢字元ch。   

說明:當第一次遇到字元ch時停止查詢。如果成功,返回指向字元ch的指標;否則返回null。

*//#include "stdafx.h"

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

int main(int argc, char* argv)

else

printf("查詢失敗\n");

return 0;

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

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

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

部分C庫函式重寫以及反彙編分析之memset

函式解釋 將s中前n個位元組替換為ch並返回s memset 作用是在一段記憶體塊中填充某個給定的值,它是對較大的結構體或陣列進行清零操作的一種最快方法。include stdafx.h void pmemset void s char ch int n int main int argc,char...

C 反彙編 if語句分析

include void main std cout hello world 7?1 4 if b 1 std cout b equal 1 判斷語句有幾種 1.條件表示式 表示式1?表示式2 表示式3 2.if語句 3.switch語句 首先來分析if語句吧 debug版 0040117d 68 ...

C 遞迴函式反彙編

源 include using namespace std int sumrecursion int arr,int n return 0 int main int sum sumrecursion arr,5 cout sum sum endl 反彙編 重要部分已經注釋,可以看到.text 004...