zoukankan      html  css  js  c++  java
  • 【逆向工具】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

  • 相关阅读:
    POJ 3114 Tarjan+Dijkstra
    278. First Bad Version
    209. Minimum Size Subarray Sum
    154. Find Minimum in Rotated Sorted Array II
    153. Find Minimum in Rotated Sorted Array
    710. Random Pick with Blacklist
    767. Reorganize String
    524. Longest Word in Dictionary through Deleting
    349. Intersection of Two Arrays
    350. Intersection of Two Arrays II
  • 原文地址:https://www.cnblogs.com/17bdw/p/6649363.html
Copyright © 2011-2022 走看看