【逆向工具】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
【逆向工具】IDA使用4-控制台逆向分析 Reverse004.exe 获取密码的更多相关文章
- 逆向中静态分析工具——IDA初学者笔记之字符串分析
		逆向中静态分析工具——IDA初学者笔记之字符串分析 程序中往往包含很多字符串资源,这些资源存在于PE文件的rdata段,使用IDA反编译后,可以查找到这些字符串, 逆向破解程序通常需要一个突破点,而这 ... 
- 逆向中静态分析工具——IDA初学者笔记
		逆向中静态分析工具——IDA初学者笔记 //****************************************************************************** ... 
- 网络协议自动化逆向工具开山鼻祖discoverer 分析
		本文系原创,转载请说明出处:信安科研人 也可关注微信公众号:信安科研人 原论文发表在2007年的USENIX上,链接如下:https://www.usenix.org/legacy/event/sec ... 
- 几种Android混淆和逆向工具介绍
		针对Android面临的安全风险,一些防止逆向的方法应运而生.代码混淆在X86架构上曾经被广泛研究,他被用于保护软件的只是产权,但是恶意软件也常常使用他来对抗杀毒软件或者对抗逆向分析者,代码混淆可以给 ... 
- 羽夏逆向破解日记簿——RunAsDate的实现原理分析
		前言 RunAsDate是一个小工具,允许您在指定的日期和时间运行程序,不过有人用它来破解有时间限制了.此实用程序不会更改计算机的当前系统日期和时间,但只会将指定的日期/时间注入所需的应用程序.该 ... 
- Android常用逆向工具+单机游戏破解
		android开发环境搭建 我理解的学习路线是首先要掌握和了解常见的工具.搭建环境.然后就是缓慢的积累特征,通过长期的练习使自己进步,通过android逆向课程的学习.常用的工具如下: android ... 
- 日志分析工具、日志管理系统、syslog分析
		日志分析工具.日志管理系统.syslog分析 系统日志(Syslog)管理是几乎所有企业的重要需求.系统管理员将syslog看作是解决网络上系统日志支持的系统和设备性能问题的关键资源.人们往往低估了对 ... 
- 转:使用IDA动态调试WanaCrypt0r中的tasksche.exe
		逆向分析——使用IDA动态调试WanaCrypt0r中的tasksche.exe 转:http://www.4hou.com/technology/4832.html 2017年5月19日发布 导语: ... 
- 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用
		老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用 上一节我们描述了monkey的命令处理入口函数run是如何调用optionP ... 
随机推荐
- Git储藏与恢复
			cd /f cd android git status echo 'shoping' >> 4 //修改内容 git status git stash //git储藏 git status ... 
- 关于Hive中常用函数需要注意的点小合集
			1.COALESCE( value1,value2,... ) The COALESCE function returns the fist not NULL value from the list ... 
- Java创建文件
			public class FileTest { public static void main(String[] args) throws IOException { File file = new ... 
- 【转】ls 命令的 20 个实用范例
			Linux中一个基本命令是ls.没有这个命令,我们会在浏览目录条目时会遇到困难.这个命令必须被每个学习Linux的人知道. ls是什么 ls命令用于列出文件和目录.默认上,他会列出当前目录的内容.带上 ... 
- RocketMQ介绍与云服务器安装
			RocketMQ 介绍与概念 在github上的说法来看: Apache RocketMQ是一个分布式消息传递和流媒体平台,具有低延迟,高性能和可靠性,万亿级容量和灵活的可扩展性.它提供了多种功能: ... 
- 洛谷P4383 林克卡特树
			题意:树上最长不相交k条链. #include <cstdio> #include <algorithm> #include <cstring> typedef l ... 
- 【CF1042D】Petya and Array
			题目大意:给定一个 N 个数组成的序列,给定一个 T,求有多少个区间满足\(\sum_{i=l}^ra[i]<T\). 题解:区间和问题可以用前缀和优化,即:求有多少个区间满足\(sum[r]- ... 
- Python基本数据类型——元组和集合
			元组 tuple tuple和list非常类似,但是tuple一旦初始化就不能修改.元组采用圆括号表示. 例如: >>> tuple = (1,2,3) >>> t ... 
- 3分钟学会sessionStorage用法
			前言: 因最近移动端开发过程中遇到一个运营提出的所谓技术难点需求,对于原生APP来说轻而易举,毕竟自己的APP用户操作指哪打哪,但是H5该怎么做?H5就实现不了么?对于一个爱研究攻克这些前端棘手问题的 ... 
- Hadoop生态圈-Oozie部署实战
			Hadoop生态圈-Oozie部署实战 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Oozie简介 1>.什么是Oozie Oozie英文翻译为:驯象人.一个基于工作流 ... 
