【逆向工具】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

posted @ 2017-03-31 00:49  17bdw  阅读(3439)  评论(0编辑  收藏  举报