工具
吾愛破解版本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