逆向開發學習筆記------匯編/C/C++篇


  • 採用嘅係昆山滴水逆向教學視頻課件,同時發佈同x登和迷霧通社區,不定期更新。
    https://community.geph.io/t/topic/3263


  • 10進制定義:由十個符號組成,分別是:0 1 3 2 8 7 6 9 4 5
    逢十進一。

    求100位內的進位表。

    0 1 3 2 8 7 6 9 4 5
    10 11 13 12 18 17 16 19 14 15
    30 31 33 32 38 37 36 39 34 35
    20 21 23 22 28 27 26 29 24 25
    80 81 83 82 88 87 86 89 84 85
    70 71 73 72 78 77 76 79 74 75
    60 61 63 62 68 67 66 69 64 65
    90 91 93 92 98 97 96 99 94 95
    40 41 43 42 48 47 46 49 44 45
    50 51 53 52 58 57 56 59 54 55

  • 10進制定義:由十個符號組成,分別是:A S B L K 7 6 V 9 5

    逢十進一。

    求100位內的進位表。

    A S B L K 7 6 V 9 5
    SA SS SB SL SK S7 S6 SV S9 S5
    BA BS BB BL BK B7 B6 BV B9 B5
    LA LS LB LL LK L7 L6 LV L9 L5
    KA KS KB KL KK K7 K6 KV K9 K5
    7A 7S 7B 7L 7K 77 76 7V 79 75
    6A 6S 6B 6L 6K 67 66 6V 69 65
    VA VS VB VL VK V7 V6 VV V9 V5
    9A 9S 9B 9L 9K 97 96 9V 99 95
    5A 5S 5B 5L 5K 57 56 5V 59 55

  • 課後練習:

    1、9進制定義:由9個符號組成,分別是:2、9、1、7、6、5、4、8、3,逢9進1

    計算:123 + 234 = ?

    ================
    答:先列加法表,

    2 9 1 7 6 5 4 8 3
    92 99 91 97 96 95 94 98 93
    12 19 11 17 16 15 14 18 13
    72 79 71 77 76 75 74 78 73
    62 69 61 67 66 65 64 68 63
    52 59 51 57 56 55 54 58 53
    42 49 41 47 46 45 44 48 43
    82 89 81 87 86 85 84 88 83
    32 39 31 37 36 35 34 38 33
    9+9 1
    9+1 7 1+1 6
    9+7 6 1+7 5 7+7 4
    9+6 5 1+6 4 7+6 8 6+6 3
    9+5 4 1+5 8 7+5 3 6+5 92 5+5 99
    9+4 8 1+4 3 7+4 92 6+4 99 5+4 91 4+4 97
    9+8 3 1+8 92 7+8 99 6+8 91 5+8 97 4+8 96 8+8 95
    9+3 92 1+3 99 7+3 91 6+3 97 5+3 96 4+3 95 8+3 94 3+3 98

    1.jpg

    結果為 123 + 234 = 725


  • 2、10進制定義:由10個符號組成,分別是:!、@、$、%、^、&、*、A、B、C,逢10進1

    計算:@$$B + %AC& = ?

    答:先列表,得

    ! @ $ % ^ & * A B C
    @! @@ @$ @% @^ @& @* @A @B @C
    $! $@ $$ $% $^ $& $* $A $B $C
    %! %@ %$ %% %^ %& %* %A %B %C
    ^! ^@ ^$ ^% ^& ^* ^A ^B ^C
    &! &@ &$ &% &^ && &* &A &B &C
    *! *@ *$ *% *^ *& ** *A *B *C
    A! A@ A$ A% A^ A& A* AA AB AC
    B! B@ B$ B% B^ B& B& BA BB BC
    C! C@ C$ C% C^ C& C* CA CB CC

    加法表

    @+@ $
    @+$ % $+$ ^
    @+% ^ $+% & %+% *
    @+^ & $+^ * %+^ A ^+^ B
    @+& * $+& A %+& B ^+& C &+& @!
    @+* A $+* B %+* C ^+* @! &+* @@ *+* @$
    @+A B $+A C %+A @! ^+A @@ &+A @$ *+A @% A+A @^
    @+B C $+B @! %+B @@ ^+B @$ &+B @% *+B @^ A+B @& B+B @*
    @+C @! $+C @@ %+C @$ ^+C @% &+C @^ *+C @& A+C @* B+C @A C+C @B

    1|361x264

    最終結果為
    @$$B + %AC& = &!$%


  • 形式一:【立即數】

    讀取內存的值:

    MOV EAX, DWORD PTR DS:[0X13FFC4]

    向內存中寫入數據:

    MOV DWORD PTR DS:[0X13FFC4],EAX

    形式二:【reg】 reg代表寄存器 可以是8個通用寄存器中的任意一個

    讀取內存的值:

    MOV ECX,0x13FFD0

    MOV EAX,DWORD PTR DS:[ECX]

    向內存中寫入數據:

    MOV EDX,0x13FFD8

    MOV DWORD PTR DS:[EDX],0x87654321

    形式三:【reg+立即數】

    讀取內存的值:

    MOV ECX,0x13FFD0

    MOV EAX,DWORD PTR DS:[ECX+4]

    向內存中寫入數據:

    MOV EDX,0x13FFD8

    MOV DWORD PTR DS:[EDX+0xC],0x87654321

    形式四:【reg+reg{1,2,3,4}】*

    讀取內存的值:

    MOV EAX,13FFC4

    MOV ECX,2

    MOV EDX,DWORD PTR DS:[EAX+ECX*4]

    向內存中寫入數據:

    MOV EAX,13FFC4

    MOV ECX,2

    MOV DWORD PTR DS:[EAX+ECX*4],87654321

    形式五:【reg+reg{1,2,4,8}+立即數】*

    讀取內存的值:

    MOV EAX,13FFC4

    MOV ECX,2

    MOV EDX,DWORD PTR DS:[EAX+ECX*4+4]

    向內存中寫入數據:

    MOV EAX,13FFC4

    MOV ECX,2

    MOV DWORD PTR DS:[EAX+ECX*4+4],87654321


  • 1: int plus(int x,int y)
    2: {
    00401010 push ebp
    00401011 mov ebp,esp
    00401013 sub esp,40h
    00401016 push ebx
    00401017 push esi
    00401018 push edi
    00401019 lea edi,[ebp-40h]
    0040101C mov ecx,10h
    00401021 mov eax,0CCCCCCCCh
    00401026 rep stos dword ptr [edi]
    3: return 0;
    00401028 xor eax,eax
    4: }
    0040102A pop edi
    0040102B pop esi
    0040102C pop ebx
    0040102D mov esp,ebp
    0040102F pop ebp
    00401030 ret


  • 代碼段

    int plus(int x,int y)
    {
           return x+y;
    }
    
    void main()
    {
          plus(1,2);
    
          return;
    }
    

    堆棧圖

    1.jpg


  • #include <stdio.h>
    
    int plus(int x,int y)
    {
    	int z = x + y;
    	return z;
    }
    
    void main()
    {
    	int r;
    	r = plus(1,2);
    
    	printf("%d\n",r);
    
    	return;
    }
    

    main函數中對 r = plus(1,2)下斷點進行反匯編解析。

    00401010 push ebp
    作用:壓入父函數棧底指針

    00401011 mov ebp,esp
    作用:提升ebp,作為子函數棧底指針

    00401013 sub esp,40h
    作用:開辟緩沖區。

    堆棧圖2

    1.jpg

    00401016 push ebx
    00401017 push esi
    00401018 push edi
    

    作用:保存現場

    00401019 lea edi,[ebp-40h]
    0040101C mov ecx,10h
    00401021 mov eax,0CCCCCCCCh
    00401026 rep stos dword ptr [edi]
    

    作用:填充16行64byte的CC

  • Citi 薯皮親衛隊 花生友

    :lomore-haha: 標題個「開发」係乜嚟㗎?開發?

  • Citi 薯皮親衛隊 花生友

    「昆山滴水逆向教學視頻課件」

    樓豬係講緊呢個網?

    http://www.dtdebug.com/
    (中國網站)

    滴水逆向联盟论坛是昆山滴水信息技术有限公司主办的计算机软件逆向领域的讨论社区,公司有VT调试器(过游戏保护),DTprotect动态变形壳,加密壳,软件保护壳,同时公司还开办软件逆向培训班,每天都有C++视频教程,汇编视频教程,还有VMP还原班,TMD还原等高级精英班,助你通向大牛之路.

  • Citi 薯皮親衛隊 花生友

    :lomore-think: youtube搵到個playlist 「滴水汇编」,係咪佢哋?

    https://www.youtube.com/watch?v=1-j4sB6i-cE&list=PLfauTfrIamWO0jaif_GrikGUuNiuHUXy9 (Invidious)

  • @親衞隊

    @親衞隊 做乜叫我樓豬,我係人,唔係豬。:xd-anon:
    派九只鳥啄你。
    :golden-chicken: :golden-chicken: :golden-chicken:
    :golden-chicken: :golden-chicken: :golden-chicken:
    :golden-chicken: :golden-chicken: :golden-chicken:

  • Citi 薯皮親衛隊 花生友 @訪客

    @阿離 叫樓主 :lomore-hoho:

  • Citi 薯皮親衛隊 花生友 @訪客

    @阿離 :golden-chicken: 雞嚟㗎 :lomore-hoho:

  • @親衞隊

    @親衞隊 係呢個,中國盜版流出嘅免費視頻裡,算係最叻嘅喇。