【逆向工具】IDA使用4-控制台逆向分析 Reverse004.exe 獲取密碼


工具

吾愛破解版本OD、IDA6.8

OD使用-動態分析

OD快捷方式

F2 下斷點,也就是指定斷點的地址F3加載一個可執行程序,進行調試分析F4程序執行到光標處
F5 縮小、還原當前窗口
F7 單步步入
F8 單步步過
F9 直接運行程序,遇到斷點處,程序暫停
Ctrl+F2 重新運行程序到起始處,一般用於重新調試程序
Ctrl+F9 執行到函數返回處,用於跳出函數實現
Alt+F9 執行到用戶代碼處,用於快速跳出系統函數
Ctrl+G 輸入十六進制地址,快速定位到該地址處
+/- 前一個后一個函數

一:找用戶入口main函數-字符串查找

根據程序運行時的界面,找字符串關鍵字

在OD的字符串搜索插件中選擇智能搜索

得到字符串進入到用戶入口main函數

在printf字符串處F2下一個斷點

二、分析反匯編

F9將程序運行起來,程序會在printf輸入處停下來

012F8BD8   .  68 883C3601    push Reverse0.01363C88                   ;  please input Name:
012F8BDD   .  E8 B0E7FFFF    call Reverse0.012F7392                   ;  printf函數
012F8BE2   .  83C4 04        add esp,0x4
012F8BE5   .  6A 78          push 0x78
012F8BE7   .  8D45 80        lea eax,dword ptr ss:[ebp-0x80]          ;  name[]數組
012F8BEA   .  50             push eax
012F8BEB   .  68 A03C3601    push Reverse0.01363CA0                   ;  %s
012F8BF0   .  E8 98DDFFFF    call Reverse0.012F698D                   ;  scanf函數
012F8BF5   .  83C4 0C        add esp,0xC
012F8BF8   .  68 1C3F3601    push Reverse0.01363F1C                   ;  please input Id:
012F8BFD   .  E8 90E7FFFF    call Reverse0.012F7392                   ;  printf函數
012F8C02   .  83C4 04        add esp,0x4
012F8C05   .  6A 78          push 0x78
012F8C07   .  8D85 00FFFFFF  lea eax,dword ptr ss:[ebp-0x100]         ;  id[]數組
012F8C0D   .  50             push eax
012F8C0E   .  68 A03C3601    push Reverse0.01363CA0                   ;  %s
012F8C13   .  E8 75DDFFFF    call Reverse0.012F698D                   ;  scanf函數

這里想要查看內存中數據時,可以在OD中選擇要查看數據的反匯編指令處-【數據窗口中跟隨】-【內存地址】,查看到我們輸入的數值。

012F8C28地址處的cmp指令含義是將數組下標索引[0]的元素與0x68對比。
如果相等就執行je指令的跳轉,跳到下一條指令處繼續比對。

繼續往下執行就到達012F8C2D地址處,會彈出一個提示錯誤信息的MessageBoxW對話框。這里可以將ZF標志位改成1執行跳轉或者在跳轉的下一個位置設為新的EIP。

第一次CMP對比,反匯編代碼注釋如下:

012F8C1B   .  B8 01000000    mov eax,0x1                              ;  eax=00000001
012F8C20   .  6BC8 00        imul ecx,eax,0x0                         ;  imul,第三個操作數是乘數,第二個操作數是被乘數,運算結果存放在第一個操作數
012F8C23   .  0FBE540D 80    movsx edx,byte ptr ss:[ebp+ecx-0x80]     ;  取出數組name[0]
012F8C28   .  83FA 68        cmp edx,0x68                             ;  比對H
012F8C2B   .  74 32          je short Reverse0.012F8C5F               ;  ;  如果不相等,密碼錯誤,跳轉到012F8C5F處,為了防止它跳轉,可以修改zf=1,讓它跳轉
012F8C2D   .  8BF4           mov esi,esp
012F8C2F   .  6A 00          push 0x0                                 ; /Style = MB_OK|MB_APPLMODAL
012F8C31   .  68 AC3C3601    push Reverse0.01363CAC                   ; |提示
012F8C36   .  68 B43C3601    push Reverse0.01363CB4                   ; |錯誤
012F8C3B   .  6A 00          push 0x0                                 ; |hOwner = NULL
012F8C3D   .  FF15 DCE13701  call dword ptr ds:[<&USER32.MessageBoxW>>; \MessageBoxW

從第一次cmp edx,0x68對比后je跳轉到012F8C5F這個地址。mov操作后,eax等於1,執行shl指令相當於左移1位的計算,反匯編中每左移一位相當於乘以2,左移4位相當於乘以16每右移一位相當於除以2,而數組存儲在堆棧的方向是由高地址向低地址進行延伸,012F8C5F至012F8C67的三條指令結合起來的意思就是取值出數組[1]索引的值。

012F8C5F   > \B8 01000000    mov eax,0x1                              ;  eax=00000001
012F8C64   .  c1e0 00        shl eax,0x0                              ;  相當於左移動1位
012F8C67   .  0FBE4C05 80    movsx ecx,byte ptr ss:[ebp+eax-0x80]     ;  取數組name[1]的位置
012F8C6C   .  83F9 38        cmp ecx,0x38
012F8C6F   .  74 32          je short Reverse0.012F8CA3
012F8C71   .  8BF4           mov esi,esp
012F8C73   .  6A 00          push 0x0                                 ; /Style = MB_OK|MB_APPLMODAL
012F8C75   .  68 AC3C3601    push Reverse0.01363CAC                   ; |提示
012F8C7A   .  68 B43C3601    push Reverse0.01363CB4                   ; |錯誤
012F8C7F   .  6A 00          push 0x0                                 ; |hOwner = NULL
012F8C81   .  FF15 DCE13701  call dword ptr ds:[<&USER32.MessageBoxW>>; \MessageBoxW

F7向下跟隨,我遇到相同條件的跳轉為6次,而0x80是name數組中的地址。把每次對比的十六進制數值提取出來分別是0x68、0x38、0x67、0x32、0x79、0x77

第一次比較

012F8C1B   .  B8 01000000    mov eax,0x1                              ;  eax=00000001
012F8C20   .  6BC8 00        imul ecx,eax,0x0                         ;  imul,第三個操作數是乘數,第二個操作數是被乘數,運算結果存放在第一個操作數。0乘以任何數等於0
012F8C23   .  0FBE540D 80    movsx edx,byte ptr ss:[ebp+ecx-0x80]     ;  取出數組name[0]賦值到edx
012F8C28   .  83FA 68        cmp edx,0x68                             ;  比對十六進制
012F8C2B   .  74 32          je short Reverse0.012F8C5F               ;  ;  如果不相等,密碼錯誤,跳轉到012F8C5F處,為了防止它跳轉,可以修改zf=1,讓它跳轉
012F8C2D   .  8BF4           mov esi,esp
012F8C2F   .  6A 00          push 0x0                                 ; /Style = MB_OK|MB_APPLMODAL
012F8C31   .  68 AC3C3601    push Reverse0.01363CAC                   ; |提示
012F8C36   .  68 B43C3601    push Reverse0.01363CB4                   ; |錯誤
012F8C3B   .  6A 00          push 0x0                                 ; |hOwner = NULL
012F8C3D   .  FF15 DCE13701  call dword ptr ds:[<&USER32.MessageBoxW>>; \MessageBoxW

第二次比較

012F8C5F   > \B8 01000000    mov eax,0x1                              ;  eax=00000001
012F8C64   .  c1e0 00        shl eax,0x0                              ;  相當於左移動0位,
012F8C67   .  0FBE4C05 80    movsx ecx,byte ptr ss:[ebp+eax-0x80]     ;  取的是eax的位置,所以上面的那條shl指令沒起作用,這里代表取數組name[1]的位置
012F8C6C   .  83F9 38        cmp ecx,0x38
012F8C6F   .  74 32          je short Reverse0.012F8CA3
012F8C71   .  8BF4           mov esi,esp
012F8C73   .  6A 00          push 0x0                                 ; /Style = MB_OK|MB_APPLMODAL
012F8C75   .  68 AC3C3601    push Reverse0.01363CAC                   ; |提示
012F8C7A   .  68 B43C3601    push Reverse0.01363CB4                   ; |錯誤
012F8C7F   .  6A 00          push 0x0                                 ; |hOwner = NULL
012F8C81   .  FF15 DCE13701  call dword ptr ds:[<&USER32.MessageBoxW>>; \MessageBoxW

第三次比較

012F8CA3   > \B8 01000000    mov eax,0x1                              ;  eax=00000001
012F8CA8   .  D1E0           shl eax,1                                ;  左移動1,eax=00000002
012F8CAA   .  0FBE4C05 80    movsx ecx,byte ptr ss:[ebp+eax-0x80]     ;  取數組name[2]的位置
012F8CAF   .  83F9 67        cmp ecx,0x67                             ;  比對十六進制
012F8CB2   .  74 32          je short Reverse0.012F8CE6
012F8CB4   .  8BF4           mov esi,esp
012F8CB6   .  6A 00          push 0x0                                 ; /Style = MB_OK|MB_APPLMODAL
012F8CB8   .  68 AC3C3601    push Reverse0.01363CAC                   ; |提示
012F8CBD   .  68 B43C3601    push Reverse0.01363CB4                   ; |錯誤
012F8CC2   .  6A 00          push 0x0                                 ; |hOwner = NULL
012F8CC4   .  FF15 DCE13701  call dword ptr ds:[<&USER32.MessageBoxW>>; \MessageBoxW

第四次比較

012F8CE6   > \B8 01000000    mov eax,0x1                              ;  eax=00000001
012F8CEB   .  6BC8 03        imul ecx,eax,0x3                         ;  eax * 0x3的值給ecx,ecx=00000003
012F8CEE   .  0FBE540D 80    movsx edx,byte ptr ss:[ebp+ecx-0x80]     ;  取出數組name[3]
012F8CF3   .  83FA 32        cmp edx,0x32                             ;  比對十六進制
012F8CF6   .  74 32          je short Reverse0.012F8D2A
012F8CF8   .  8BF4           mov esi,esp
012F8CFA   .  6A 00          push 0x0                                 ; /Style = MB_OK|MB_APPLMODAL
012F8CFC   .  68 AC3C3601    push Reverse0.01363CAC                   ; |提示
012F8D01   .  68 B43C3601    push Reverse0.01363CB4                   ; |錯誤
012F8D06   .  6A 00          push 0x0                                 ; |hOwner = NULL
012F8D08   .  FF15 DCE13701  call dword ptr ds:[<&USER32.MessageBoxW>>; \MessageBoxW

第五次比較

012F8D2A   > \B8 01000000    mov eax,0x1                              ;  eax=00000001
012F8D2F   .  C1E0 02        shl eax,0x2                              ;  左移動2位,eax=00000004
012F8D32   .  0FBE4C05 80    movsx ecx,byte ptr ss:[ebp+eax-0x80]     ;  相當於取數組name[4]
012F8D37   .  83F9 79        cmp ecx,0x79                             ;  比對十六進制
012F8D3A   .  74 32          je short Reverse0.012F8D6E
012F8D3C   .  8BF4           mov esi,esp
012F8D3E   .  6A 00          push 0x0                                 ; /Style = MB_OK|MB_APPLMODAL
012F8D40   .  68 AC3C3601    push Reverse0.01363CAC                   ; |提示
012F8D45   .  68 B43C3601    push Reverse0.01363CB4                   ; |錯誤
012F8D4A   .  6A 00          push 0x0                                 ; |hOwner = NULL
012F8D4C   .  FF15 DCE13701  call dword ptr ds:[<&USER32.MessageBoxW>>; \MessageBoxW

第六次比較

012F8D6E   > \B8 01000000    mov eax,0x1                              ;  eax=00000001
012F8D73   .  6BC8 05        imul ecx,eax,0x5                         ;  ecx = eax * 0x5,ecx=00000005
012F8D76   .  0FBE540D 80    movsx edx,byte ptr ss:[ebp+ecx-0x80]     ;  相當於取數組name[5]
012F8D7B   .  83FA 77        cmp edx,0x77                             ;  比對十六進制
012F8D7E   .  74 32          je short Reverse0.012F8DB2
012F8D80   .  8BF4           mov esi,esp
012F8D82   .  6A 00          push 0x0                                 ; /Style = MB_OK|MB_APPLMODAL
012F8D84   .  68 AC3C3601    push Reverse0.01363CAC                   ; |提示
012F8D89   .  68 B43C3601    push Reverse0.01363CB4                   ; |錯誤
012F8D8E   .  6A 00          push 0x0                                 ; |hOwner = NULL
012F8D90   .  FF15 DCE13701  call dword ptr ds:[<&USER32.MessageBoxW>>; \MessageBoxW

這里有個小的技巧,雖然輸入的是123456,abcdefg。但是其實每次遇到跳轉的時候,我都是可以在數據面板修改每一次cmp對比的十六進制值。在要修改的地方單擊空格就可以修改了,就不必一個個ascii碼讀取了。這里可以看到name數組正確的密碼應該是【h8y2yw】。

判斷完name[]數組后,還有ID[]數組需要得到正確的密碼,那么繼續往下跟進。得到id[]的相關反匯編代碼如下:

012F8DB2   > \B8 01000000    mov eax,0x1                              ;  eax=00000001
012F8DB7   .  6BC8 00        imul ecx,eax,0x0                         ;  ecx=00000000
012F8DBA   .  0FBE540D 80    movsx edx,byte ptr ss:[ebp+ecx-0x80]     ;  edx=00000068,取name[0]的值賦值到edx
012F8DBF   .  83FA 68        cmp edx,0x68                             ;  對比十六進制數
012F8DC2   .  0F85 F8010000  jnz Reverse0.012F8FC0                    ;  zeroflag標志為1說明結果為0,則說明兩個數相等,這條jnz指令在zf不為0才跳轉
012F8DC8   .  B8 01000000    mov eax,0x1                              ;  eax=00000001
012F8DCD   .  6BC8 00        imul ecx,eax,0x0                         ;  ecx=00000000,0乘以任何數都為0
012F8DD0   .  C6440D 80 61   mov byte ptr ss:[ebp+ecx-0x80],0x61      ;  把0x61賦值給name[0]
012F8DD5   .  B8 01000000    mov eax,0x1                              ;  eax=00000001
012F8DDA   .  6BC8 00        imul ecx,eax,0x0                         ;  ecx=00000000,0乘以任何數都為0
012F8DDD   .  0FBE940D 00FFF>movsx edx,byte ptr ss:[ebp+ecx-0x100]    ;  取出數組id[0]的當前值給edx
012F8DE5   .  B8 01000000    mov eax,0x1
012F8DEA   .  6BC8 00        imul ecx,eax,0x0
012F8DED   .  0FBE440D 80    movsx eax,byte ptr ss:[ebp+ecx-0x80]     ;  取出數組name[0]賦值到eax
012F8DF2   .  3BD0           cmp edx,eax                              ;  對比name[0]與id[0]的值是不是一樣,然后結果相等那么就繼續執行否則就提示錯誤
012F8DF4   .  0F85 9A010000  jnz Reverse0.012F8F94

繼續單步下去的時候,發現012F8DD0處已經把我原先的name[0]的位置給改成了0x61,然后繼續跟進012F8DDD 處取出數組id[0]的當前值給edx。然后再次取出name[0]的值和id[0]對比,如果結果相等繼續向下執行,否則就跳轉到彈出MessageBoxW的地方彈個提示輸入錯誤的框框。

數組id[]的值其實就是我一開始輸入的abcdefg。那么逆向的程序對比輸入值(id[])正確與錯誤的原理就是提前把寫死的數值賦值到原先的name[]數組里,然后在取出數組里的字符與我輸入的字符串逐個對比。

那么把每個賦值給name[]數組的十六進制記錄下來即可得到密碼。共計賦值了4次。分別是0x61、0x33、0x6F、0x72。

4次比較前分別有三次判斷,1、判斷原先密碼是否正確。2、賦值ID的key到原先的name[]中。3、取出相應的ID[]地址與name[]地址的值對比。反匯編的注釋代碼如下:

012F8DB2   > \B8 01000000    mov eax,0x1                              ;  eax=00000001
012F8DB7   .  6BC8 00        imul ecx,eax,0x0                         ;  ecx=00000000
012F8DBA   .  0FBE540D 80    movsx edx,byte ptr ss:[ebp+ecx-0x80]     ;  edx=00000068,取name[0]的值賦值到edx
012F8DBF   .  83FA 68        cmp edx,0x68                             ;  對比十六進制數
012F8DC2   .  0F85 F8010000  jnz Reverse0.012F8FC0                    ;  zeroflag標志為1說明結果為0,則說明兩個數相等,這條jnz指令在zf不為0才跳轉
012F8DC8   .  B8 01000000    mov eax,0x1                              ;  eax=00000001
012F8DCD   .  6BC8 00        imul ecx,eax,0x0                         ;  ecx=00000000,0乘以任何數都為0
012F8DD0   .  C6440D 80 61   mov byte ptr ss:[ebp+ecx-0x80],0x61      ;  把0x61賦值給name[0]
012F8DD5   .  B8 01000000    mov eax,0x1                              ;  eax=00000001
012F8DDA   .  6BC8 00        imul ecx,eax,0x0                         ;  ecx=00000000,0乘以任何數都為0
012F8DDD   .  0FBE940D 00FFF>movsx edx,byte ptr ss:[ebp+ecx-0x100]    ;  取出數組id[0]的當前值給edx
012F8DE5   .  B8 01000000    mov eax,0x1
012F8DEA   .  6BC8 00        imul ecx,eax,0x0
012F8DED   .  0FBE440D 80    movsx eax,byte ptr ss:[ebp+ecx-0x80]     ;  取出數組name[0]賦值到eax
012F8DF2   .  3BD0           cmp edx,eax                              ;  對比name[0]與id[0]的值是不是一樣,然后結果相等那么就繼續執行否則就提示錯誤
012F8DF4   .  0F85 9A010000  jnz Reverse0.012F8F94
012F8DFA   .  B8 01000000    mov eax,0x1
012F8DFF   .  c1e0 00        shl eax,0x0
012F8E02   .  0FBE4C05 80    movsx ecx,byte ptr ss:[ebp+eax-0x80]
012F8E07   .  83F9 38        cmp ecx,0x38                             ;  又對比一遍name[]的原先值是不是正確
012F8E0A   .  0F85 84010000  jnz Reverse0.012F8F94
012F8E10   .  B8 01000000    mov eax,0x1
012F8E15   .  c1e0 00        shl eax,0x0
012F8E18   .  C64405 80 33   mov byte ptr ss:[ebp+eax-0x80],0x33      ;  把0x33賦值給name[1]
012F8E1D   .  B8 01000000    mov eax,0x1
012F8E22   .  c1e0 00        shl eax,0x0
012F8E25   .  0FBE8C05 00FFF>movsx ecx,byte ptr ss:[ebp+eax-0x100]    ;  得到輸入的值id[1],取出數組id[1]的當前值給ecx
012F8E2D   .  BA 01000000    mov edx,0x1
012F8E32   .  c1e2 00        shl edx,0x0
012F8E35   .  0FBE4415 80    movsx eax,byte ptr ss:[ebp+edx-0x80]
012F8E3A   .  3BC8           cmp ecx,eax                              ;  比較name[1]的值
012F8E3C   .  0F85 26010000  jnz Reverse0.012F8F68
012F8E42   .  B8 01000000    mov eax,0x1
012F8E47   .  D1E0           shl eax,1
012F8E49   .  0FBE4C05 80    movsx ecx,byte ptr ss:[ebp+eax-0x80]
012F8E4E   .  83F9 67        cmp ecx,0x67                             ;  又對比一遍name[]的原先值是不是正確
012F8E51   .  0F85 11010000  jnz Reverse0.012F8F68
012F8E57   .  B8 01000000    mov eax,0x1
012F8E5C   .  D1E0           shl eax,1
012F8E5E   .  C64405 80 6F   mov byte ptr ss:[ebp+eax-0x80],0x6F      ;  把0x6F賦值給name[2]
012F8E63   .  B8 01000000    mov eax,0x1
012F8E68   .  D1E0           shl eax,1
012F8E6A   .  0FBE8C05 00FFF>movsx ecx,byte ptr ss:[ebp+eax-0x100]    ;  得到輸入的值id[2],取出數組id[2]的當前值給ecx
012F8E72   .  BA 01000000    mov edx,0x1
012F8E77   .  D1E2           shl edx,1
012F8E79   .  0FBE4415 80    movsx eax,byte ptr ss:[ebp+edx-0x80]     ;  比較name[2]的值
012F8E7E   .  3BC8           cmp ecx,eax
012F8E80   .  0F85 B6000000  jnz Reverse0.012F8F3C
012F8E86   .  B8 01000000    mov eax,0x1
012F8E8B   .  6BC8 03        imul ecx,eax,0x3
012F8E8E   .  0FBE540D 80    movsx edx,byte ptr ss:[ebp+ecx-0x80]
012F8E93   .  83FA 32        cmp edx,0x32
012F8E96   .  0F85 A0000000  jnz Reverse0.012F8F3C
012F8E9C   .  B8 01000000    mov eax,0x1
012F8EA1   .  6BC8 03        imul ecx,eax,0x3
012F8EA4   .  C6440D 80 72   mov byte ptr ss:[ebp+ecx-0x80],0x72      ;  把0x72賦值給name[3]
012F8EA9   .  B8 01000000    mov eax,0x1
012F8EAE   .  6BC8 03        imul ecx,eax,0x3
012F8EB1   .  0FBE940D 00FFF>movsx edx,byte ptr ss:[ebp+ecx-0x100]    ;  得到輸入的值id[3],取出數組id[3]的當前值給edx
012F8EB9   .  B8 01000000    mov eax,0x1
012F8EBE   .  6BC8 03        imul ecx,eax,0x3
012F8EC1   .  0FBE440D 80    movsx eax,byte ptr ss:[ebp+ecx-0x80]
012F8EC6   .  3BD0           cmp edx,eax
012F8EC8   .  75 46          jnz short Reverse0.012F8F10
012F8ECA   .  B8 01000000    mov eax,0x1
012F8ECF   .  C1E0 02        shl eax,0x2
012F8ED2   .  0FBE4C05 80    movsx ecx,byte ptr ss:[ebp+eax-0x80]     ;  取數組name[4],這里又重新對比是否等於0x79
012F8ED7   .  83F9 79        cmp ecx,0x79                             ;  沒啥意義,本來數組值就是0x79【y】了
012F8EDA   .  75 34          jnz short Reverse0.012F8F10
012F8EDC   .  8BF4           mov esi,esp
012F8EDE   .  6A 00          push 0x0                                 ; /Style = MB_OK|MB_APPLMODAL
012F8EE0   .  68 AC3C3601    push Reverse0.01363CAC                   ; |提示
012F8EE5   .  68 A43C3601    push Reverse0.01363CA4                   ; |成功了
012F8EEA   .  6A 00          push 0x0                                 ; |hOwner = NULL
012F8EEC   .  FF15 DCE13701  call dword ptr ds:[<&USER32.MessageBoxW>>; \MessageBoxW

IDA使用

找到var_80的變量保存位置,因為已經確定可以接收120個字符。所以只要滿足我們輸入的字符串長度的區域定義為數組即可。然后將ver_80的位置使用快捷鍵【N】改名成nameID。然后同樣的把var_10也定義為數組。ESC鍵回到反匯編源碼處,再按下F5得到偽C代碼。

右鍵選擇【char】也可以進行轉換。

重新按F5源碼模式閱讀。之前OD分析得那么辛苦,IDA翻譯出源碼后就能夠能夠理解出逆向的密碼是怎么得到的了,IDA果真神奇。。

int sub_438BB0()
{
  int v0; // edx@2
  int v1; // ecx@2
  int v2; // edx@2
  int v3; // edx@4
  int v4; // ecx@4
  int v5; // edx@6
  int v6; // ecx@6
  int v7; // edx@8
  int v8; // ecx@8
  int v9; // edx@10
  int v10; // ecx@10
  int v11; // edx@12
  int v12; // ecx@12
  int v13; // edx@22
  int v14; // ecx@22
  int v15; // edx@23
  int v16; // ecx@23
  int v17; // edx@24
  int v18; // ecx@24
  int v19; // edx@26
  int v20; // ecx@26
  int v21; // edx@28
  int v22; // ecx@28
  int v23; // edx@30
  int v24; // ecx@30
  int v25; // ST0C_4@31
  char v27; // [sp+Ch] [bp-1C4h]@1
  char ID[89]; // [sp+D0h] [bp-100h]@1
  char nameID[79]; // [sp+150h] [bp-80h]@1
  unsigned int v30; // [sp+1CCh] [bp-4h]@1
  int savedregs; // [sp+1D0h] [bp+0h]@1

  memset(&v27, 0xCCu, 0x1C4u);
  v30 = (unsigned int)&savedregs ^ __security_cookie;
  sub_437392("please input Name: ");
  sub_43698D("%s", nameID, 120);  //接收名字
  sub_437392("please input Id: ");  //接收ID
  sub_43698D("%s", ID, 120);
  if ( nameID[0] == 'h' )
  {
    if ( nameID[1] == '8' )
    {
      if ( nameID[2] == 'g' )
      {
        if ( nameID[3] == '2' )
        {
          if ( nameID[4] == 'y' )
          {
            if ( nameID[5] == 'w' )
            {
              if ( nameID[0] == 'h' )
              {
                nameID[0] = 'a';
                if ( ID[0] != 'a' || nameID[1] != '8' )
                {
                  MessageBoxW(0, L"錯誤", L"提示", 0);
                  MessBoxErr(v22, v21);
                  sub_4367B2("pause");
                }
                else
                {
                  nameID[1] = '3';
                  if ( ID[1] != '3' || nameID[2] != 'g' )
                  {
                    MessageBoxW(0, L"錯誤", L"提示", 0);
                    MessBoxErr(v20, v19);
                    sub_4367B2("pause");
                  }
                  else
                  {
                    nameID[2] = 'o';
                    if ( ID[2] != 'o' || nameID[3] != 50 )
                    {
                      MessageBoxW(0, L"錯誤", L"提示", 0);
                      MessBoxErr(v18, v17);
                      sub_4367B2("pause");
                    }
                    else
                    {
                      nameID[3] = 'r';
                      if ( ID[3] != 'r' || nameID[4] != 121 )
                      {
                        MessageBoxW(0, L"錯誤", L"提示", 0);
                        MessBoxErr(v16, v15);
                        sub_4367B2("pause");
                      }
                      else
                      {
                        MessageBoxW(0, L"成功了", L"提示", 0);
                        MessBoxErr(v14, v13);
                        sub_4367B2("pause");
                      }
                    }
                  }
                }
              }
              else
              {
                MessageBoxW(0, L"錯誤", L"提示", 0);
                MessBoxErr(v24, v23);
                sub_4367B2("pause");
              }
            }
            else
            {
              MessageBoxW(0, L"錯誤", L"提示", 0);
              MessBoxErr(v12, v11);
              sub_4367B2("pause");
            }
          }
          else
          {
            MessageBoxW(0, L"錯誤", L"提示", 0);
            MessBoxErr(v10, v9);
            sub_4367B2("pause");
          }
        }
        else
        {
          MessageBoxW(0, L"錯誤", L"提示", 0);
          MessBoxErr(v8, v7);
          sub_4367B2("pause");
        }
      }
      else
      {
        MessageBoxW(0, L"錯誤", L"提示", 0);
        MessBoxErr(v6, v5);
        sub_4367B2("pause");
      }
    }
    else
    {
      MessageBoxW(0, L"錯誤", L"提示", 0);
      MessBoxErr(v4, v3);
      sub_4367B2("pause");
    }
  }
  else
  {
    MessageBoxW(0, L"錯誤", L"提示", 0);
    MessBoxErr(v1, v0);
    sub_4367B2("pause");
  }
  v25 = v2;
  sub_436640(&savedregs, &dword_43901C);
  return MessBoxErr((unsigned int)&savedregs ^ v30, v25);
}

文中提及的逆向程序與OD的分析數據
https://pan.baidu.com/s/1kUGVD7T ab5r


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM