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