吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7219|回复: 45
收起左侧

[原创] 腾讯逆向分析训练题之高强度版???

  [复制链接]
BeneficialWeb 发表于 2020-11-29 15:01
本帖最后由 BeneficialWeb 于 2020-11-29 15:05 编辑

简介

最近向某群里网友索要了他最近一两天正在做的一道腾讯面试题。

首先是一道经典的MFC程序。

首先图一表明这来自某训练题集。隐藏了标题后,直接成为了面试题。不知道题集有没有可能贡献出来给论坛的人玩玩。

训练集.jpg

拖入IDA:

高强度版.png

作者: feifeicao

哈哈哈,不认识。

不管了,开始盘。

正文:

拖入不带反调试的od,直接F9,发现无法启动到界面。有反调试。

terminate.png

是否回收站呢,绝不可能!重新启动,从入口点慢慢看。

这里看到检测调试器标志位后,无论调试还是不存在调试,他都会重新设置值,并在函数中检测这个值,是否被一些反反调试插件给清0了。

Anti2.png

所以他肯定读取了这个标志位,然后引用一下sub_403F00,发现了这个函数。

Anti1.png

当然还发现其他检测函数

ref.png

anti3.png

这里几处都打上补丁dump出来一个exe

004010B9 | 90                       | NOP                                              |
004010BA | 90                       | NOP                                              |
004010BB | 90                       | NOP                                              |
00401116 | 90                       | NOP                                              |
00401117 | 90                       | NOP                                              |
00401118 | 90                       | NOP                                              |
004010E3 | B0 00                               | mov al,0                                                        |
00401081 | B0 00                               | mov al,0                                         |

重新调试打完补丁的进程,调试器启动他发现界面出来了,但还是不正常。

hide.png

然后过了几秒,又退出来了。

估计对话框绘制里有检测,一般MFC的消息函数里都会先调用MFC提供的原来的函数CDialog::OnPaint,交叉引用这个函数。找到了函数sub_401840

anti4.jpg

这几个都是,直接函数尾部下断,哪个eax返回了1,盘哪个。打上补丁。

这几个函数我大致跟了一下。

有的检测这里syscall是否被接管,也就是第一个字节是否被inline hook为了E9

syscall.png

有的偷了点ntdll的代码过来跑,有ZwQuerySectionZwQuerySystemInformationZwQueryInformationProcessZwQueryObject等,大部分调用后会判断一些NTSTATUS status的返回值是不是一些值。大部分都拿来检测反反调试插件的。应该是插件的返回值对应不上。我就没管了。

ntdll.png

有的偷过来了之后,还把代码加了花花,不过很短,通过mov eax,19, 然后在ntdll.dll 搜索二进制 B8 19 00 00 00,还是可以知道调用的是哪个Nt函数。

junk.png

走到最后,我又打了两个补丁。在我本机上,就可以创建调试了。因为其他检测函数在ret后eax都是0,就没管。

004038B3                                     | 90                  | nop                                                  |
004038B4                                     | 90                  | nop                                                  |
004038B5                                     | 8B85 D4EFFFFF       | mov eax,dword ptr ss:[ebp-102C]                      |
004038BB                                     | 8378 0C 01          | cmp dword ptr ds:[eax+C],1                           |
004038BF                                     | 90                  | nop                                                  |
004038C0                                     | 90                  | nop                                                  |

接下来是算法部分,在算法流程函数里,他故意制造了一些异常来导致函数流程不能被IDA F5. 这里贴一处。

excep.jpg

这里会用到代码的机器码拿来加密用户名,所以导致我之前在明文比较的地方打补丁获取注册码失败,得到的注册码是错的。

00401C1A    | 81BD 44F7FFFF 60090 | cmp dword ptr ss:[ebp-8BC],960       |
00401C24    | 7D 1D               | jge x32_dump_3.401C43                |
00401C26    | 8B85 44F7FFFF       | mov eax,dword ptr ss:[ebp-8BC]       |
00401C2C    | 8B8D 4CF7FFFF       | mov ecx,dword ptr ss:[ebp-8B4]       |
00401C32    | 8B95 48F7FFFF       | mov edx,dword ptr ss:[ebp-8B8]       |
00401C38    | 331481              | xor edx,dword ptr ds:[ecx+eax*4]     | 401b99往后960都会重新拿来与加解密相关
00401C3B    | 8995 48F7FFFF       | mov dword ptr ss:[ebp-8B8],edx       |
00401C41    | EB C8               | jmp x32_dump_3.401C0B                |
00401C43    | C785 D8FBFFFF 00000 | mov dword ptr ss:[ebp-428],0         |

他的长度判断,也不用字符串长度,用缓冲区的固定位置的字符,和后一个字符是否是结尾\0来确定。

00401E1B    | 0FBE95 DFF7FFFF     | movsx edx,byte ptr ss:[ebp-821]      | 用户名长度限制为8
00401E22    | 85D2                | test edx,edx                         |
00401E24    | 74 0B               | je x32_dump_3.401E31                 |
00401E26    | 0FBE85 E0F7FFFF     | movsx eax,byte ptr ss:[ebp-820]      |
00401E2D    | 85C0                | test eax,eax                         |
00401E2F    | 74 05               | je x32_dump_3.401E36                 |
00401E31    | E9 DD030000         | jmp x32_dump_3.402213                |
00401E36    | 0FBE8D F7FBFFFF     | movsx ecx,byte ptr ss:[ebp-409]      | key长度限制为24
00401E3D    | 85C9                | test ecx,ecx                         |
00401E3F    | 74 0B               | je x32_dump_3.401E4C                 |
00401E41    | 0FBE95 F8FBFFFF     | movsx edx,byte ptr ss:[ebp-408]      |

开始加密UserName。

00401E84    | 8995 3CF7FFFF       | mov dword ptr ss:[ebp-8C4],edx       |
00401E8A    | 83BD 3CF7FFFF 08    | cmp dword ptr ss:[ebp-8C4],8         | 循环次数
00401E91    | 7D 7E               | jge x32_dump_3.401F11                |
00401E93    | 8B85 3CF7FFFF       | mov eax,dword ptr ss:[ebp-8C4]       |
00401E99    | 0FBE8C05 D8F7FFFF   | movsx ecx,byte ptr ss:[ebp+eax-828]  |
00401EA1    | 338D 3CF7FFFF       | xor ecx,dword ptr ss:[ebp-8C4]       |
00401EA7    | 8B95 3CF7FFFF       | mov edx,dword ptr ss:[ebp-8C4]       |
00401EAD    | 888C15 D8F7FFFF     | mov byte ptr ss:[ebp+edx-828],cl     |
00401EB4    | 8B85 3CF7FFFF       | mov eax,dword ptr ss:[ebp-8C4]       |
00401EBA    | 0FBE8C05 D8F7FFFF   | movsx ecx,byte ptr ss:[ebp+eax-828]  |
00401EC2    | 8B95 DCFBFFFF       | mov edx,dword ptr ss:[ebp-424]       |
00401EC8    | 0395 3CF7FFFF       | add edx,dword ptr ss:[ebp-8C4]       |
00401ECE    | 0FBE02              | movsx eax,byte ptr ds:[edx]          |
00401ED1    | 33C8                | xor ecx,eax                          |
00401ED3    | 8B95 3CF7FFFF       | mov edx,dword ptr ss:[ebp-8C4]       |
00401ED9    | 888C15 D8F7FFFF     | mov byte ptr ss:[ebp+edx-828],cl     |
00401EE0    | 8B85 3CF7FFFF       | mov eax,dword ptr ss:[ebp-8C4]       |
00401EE6    | 0FBE8C05 D8F7FFFF   | movsx ecx,byte ptr ss:[ebp+eax-828]  |
00401EEE    | 8B95 98F7FFFF       | mov edx,dword ptr ss:[ebp-868]       |
00401EF4    | 0395 3CF7FFFF       | add edx,dword ptr ss:[ebp-8C4]       |
00401EFA    | 0FBE02              | movsx eax,byte ptr ds:[edx]          |
00401EFD    | 33C8                | xor ecx,eax                          |
00401EFF    | 8B95 3CF7FFFF       | mov edx,dword ptr ss:[ebp-8C4]       |
00401F05    | 888C15 D8F7FFFF     | mov byte ptr ss:[ebp+edx-828],cl     |
00401F0C    | E9 6AFFFFFF         | jmp x32_dump_3.401E7B                |
00401F11    | 8D85 D8F7FFFF       | lea eax,dword ptr ss:[ebp-828]       |
00401F17    | 8985 58F7FFFF       | mov dword ptr ss:[ebp-8A8],eax       |
00401F1D    | 8B8D 58F7FFFF       | mov ecx,dword ptr ss:[ebp-8A8]       |
00401F23    | 8B11                | mov edx,dword ptr ds:[ecx]           |
00401F25    | 3395 48F7FFFF       | xor edx,dword ptr ss:[ebp-8B8]       |
00401F2B    | 8B85 58F7FFFF       | mov eax,dword ptr ss:[ebp-8A8]       |
00401F31    | 8910                | mov dword ptr ds:[eax],edx           |
00401F33    | 8B8D 58F7FFFF       | mov ecx,dword ptr ss:[ebp-8A8]       |
00401F39    | 8B51 04             | mov edx,dword ptr ds:[ecx+4]         |
00401F3C    | 3395 48F7FFFF       | xor edx,dword ptr ss:[ebp-8B8]       |
00401F42    | 8B85 58F7FFFF       | mov eax,dword ptr ss:[ebp-8A8]       |
00401F48    | 8950 04             | mov dword ptr ds:[eax+4],edx         |
00401F4B    | C685 5CF7FFFF 00    | mov byte ptr ss:[ebp-8A4],0          |
00401F52    | 33C9                | xor ecx,ecx                          |
00401F54    | 898D 5DF7FFFF       | mov dword ptr ss:[ebp-8A3],ecx       |
00401F5A    | 898D 61F7FFFF       | mov dword ptr ss:[ebp-89F],ecx       |
00401F60    | 898D 65F7FFFF       | mov dword ptr ss:[ebp-89B],ecx       |
00401F66    | 898D 69F7FFFF       | mov dword ptr ss:[ebp-897],ecx       |
00401F6C    | 898D 6DF7FFFF       | mov dword ptr ss:[ebp-893],ecx       |
00401F72    | 898D 71F7FFFF       | mov dword ptr ss:[ebp-88F],ecx       |
00401F78    | 888D 75F7FFFF       | mov byte ptr ss:[ebp-88B],cl         |
00401F7E    | C785 38F7FFFF 00000 | mov dword ptr ss:[ebp-8C8],0         |
00401F88    | EB 0F               | jmp x32_dump_3.401F99                |
00401F8A    | 8B95 38F7FFFF       | mov edx,dword ptr ss:[ebp-8C8]       |
00401F90    | 83C2 01             | add edx,1                            |
00401F93    | 8995 38F7FFFF       | mov dword ptr ss:[ebp-8C8],edx       |
00401F99    | 83BD 38F7FFFF 08    | cmp dword ptr ss:[ebp-8C8],8         |
00401FA0    | 0F8D A4010000       | jge x32_dump_3.40214A                |
00401FA6    | 8B85 38F7FFFF       | mov eax,dword ptr ss:[ebp-8C8]       |
00401FAC    | 0FBE8405 D8F7FFFF   | movsx eax,byte ptr ss:[ebp+eax-828]  |
00401FB4    | 25 E0000000         | and eax,E0                           |
00401FB9    | 99                  | cdq                                  |
00401FBA    | 83E2 1F             | and edx,1F                           |
00401FBD    | 03C2                | add eax,edx                          |
00401FBF    | C1F8 05             | sar eax,5                            |
00401FC2    | 8885 37F7FFFF       | mov byte ptr ss:[ebp-8C9],al         |
00401FC8    | 8B8D 38F7FFFF       | mov ecx,dword ptr ss:[ebp-8C8]       |
00401FCE    | 0FBE840D D8F7FFFF   | movsx eax,byte ptr ss:[ebp+ecx-828]  |
00401FD6    | 83E0 1C             | and eax,1C                           |
00401FD9    | 99                  | cdq                                  |
00401FDA    | 83E2 03             | and edx,3                            |
00401FDD    | 03C2                | add eax,edx                          |
00401FDF    | C1F8 02             | sar eax,2                            |
00401FE2    | 8885 35F7FFFF       | mov byte ptr ss:[ebp-8CB],al         |
00401FE8    | 8B95 38F7FFFF       | mov edx,dword ptr ss:[ebp-8C8]       |
00401FEE    | 0FBE8415 D8F7FFFF   | movsx eax,byte ptr ss:[ebp+edx-828]  |
00401FF6    | 83E0 03             | and eax,3                            |
00401FF9    | 8885 36F7FFFF       | mov byte ptr ss:[ebp-8CA],al         |
00401FFF    | 8B85 38F7FFFF       | mov eax,dword ptr ss:[ebp-8C8]       |
00402005    | 99                  | cdq                                  |
00402006    | B9 03000000         | mov ecx,3                            |
0040200B    | F7F9                | idiv ecx                             |
0040200D    | 83FA 02             | cmp edx,2                            |
00402010    | 75 5A               | jne x32_dump_3.40206C                |
00402012    | 0FB695 36F7FFFF     | movzx edx,byte ptr ss:[ebp-8CA]      |
00402019    | 8B85 38F7FFFF       | mov eax,dword ptr ss:[ebp-8C8]       |
0040201F    | 6BC0 03             | imul eax,eax,3                       |
00402022    | 8A8C15 9CF7FFFF     | mov cl,byte ptr ss:[ebp+edx-864]     |
00402029    | 888C05 5CF7FFFF     | mov byte ptr ss:[ebp+eax-8A4],cl     |
00402030    | 0FB695 37F7FFFF     | movzx edx,byte ptr ss:[ebp-8C9]      |
00402037    | 8B85 38F7FFFF       | mov eax,dword ptr ss:[ebp-8C8]       |
0040203D    | 6BC0 03             | imul eax,eax,3                       |
00402040    | 8A8C15 C4F7FFFF     | mov cl,byte ptr ss:[ebp+edx-83C]     |
00402047    | 888C05 5DF7FFFF     | mov byte ptr ss:[ebp+eax-8A3],cl     |
0040204E    | 0FB695 35F7FFFF     | movzx edx,byte ptr ss:[ebp-8CB]      |
00402055    | 8B85 38F7FFFF       | mov eax,dword ptr ss:[ebp-8C8]       |
0040205B    | 6BC0 03             | imul eax,eax,3                       |
0040205E    | 8A8C15 8CF7FFFF     | mov cl,byte ptr ss:[ebp+edx-874]     |
00402065    | 888C05 5EF7FFFF     | mov byte ptr ss:[ebp+eax-8A2],cl     |
0040206C    | 8B85 38F7FFFF       | mov eax,dword ptr ss:[ebp-8C8]       |
00402072    | 99                  | cdq                                  |
00402073    | B9 03000000         | mov ecx,3                            |
00402078    | F7F9                | idiv ecx                             |
0040207A    | 83FA 01             | cmp edx,1                            |
0040207D    | 75 5A               | jne x32_dump_3.4020D9                |
0040207F    | 0FB695 37F7FFFF     | movzx edx,byte ptr ss:[ebp-8C9]      |
00402086    | 8B85 38F7FFFF       | mov eax,dword ptr ss:[ebp-8C8]       |
0040208C    | 6BC0 03             | imul eax,eax,3                       |
0040208F    | 8A8C15 CCF7FFFF     | mov cl,byte ptr ss:[ebp+edx-834]     |
00402096    | 888C05 5CF7FFFF     | mov byte ptr ss:[ebp+eax-8A4],cl     |
0040209D    | 0FB695 35F7FFFF     | movzx edx,byte ptr ss:[ebp-8CB]      |
004020A4    | 8B85 38F7FFFF       | mov eax,dword ptr ss:[ebp-8C8]       |
004020AA    | 6BC0 03             | imul eax,eax,3                       |
004020AD    | 8A8C15 84F7FFFF     | mov cl,byte ptr ss:[ebp+edx-87C]     |
004020B4    | 888C05 5DF7FFFF     | mov byte ptr ss:[ebp+eax-8A3],cl     |
004020BB    | 0FB695 36F7FFFF     | movzx edx,byte ptr ss:[ebp-8CA]      |
004020C2    | 8B85 38F7FFFF       | mov eax,dword ptr ss:[ebp-8C8]       |
004020C8    | 6BC0 03             | imul eax,eax,3                       |
004020CB    | 8A8C15 9CF7FFFF     | mov cl,byte ptr ss:[ebp+edx-864]     |
004020D2    | 888C05 5EF7FFFF     | mov byte ptr ss:[ebp+eax-8A2],cl     |
004020D9    | 8B85 38F7FFFF       | mov eax,dword ptr ss:[ebp-8C8]       |
004020DF    | 99                  | cdq                                  |
004020E0    | B9 03000000         | mov ecx,3                            |
004020E5    | F7F9                | idiv ecx                             |
004020E7    | 85D2                | test edx,edx                         |
004020E9    | 75 5A               | jne x32_dump_3.402145                |
004020EB    | 0FB695 35F7FFFF     | movzx edx,byte ptr ss:[ebp-8CB]      |
004020F2    | 8B85 38F7FFFF       | mov eax,dword ptr ss:[ebp-8C8]       |
004020F8    | 6BC0 03             | imul eax,eax,3                       |
004020FB    | 8A8C15 CCF7FFFF     | mov cl,byte ptr ss:[ebp+edx-834]     |
00402102    | 888C05 5CF7FFFF     | mov byte ptr ss:[ebp+eax-8A4],cl     |
00402109    | 0FB695 36F7FFFF     | movzx edx,byte ptr ss:[ebp-8CA]      |
00402110    | 8B85 38F7FFFF       | mov eax,dword ptr ss:[ebp-8C8]       |
00402116    | 6BC0 03             | imul eax,eax,3                       |
00402119    | 8A8C15 84F7FFFF     | mov cl,byte ptr ss:[ebp+edx-87C]     |
00402120    | 888C05 5DF7FFFF     | mov byte ptr ss:[ebp+eax-8A3],cl     |
00402127    | 0FB695 37F7FFFF     | movzx edx,byte ptr ss:[ebp-8C9]      |
0040212E    | 8B85 38F7FFFF       | mov eax,dword ptr ss:[ebp-8C8]       |
00402134    | 6BC0 03             | imul eax,eax,3                       |
00402137    | 8A8C15 9CF7FFFF     | mov cl,byte ptr ss:[ebp+edx-864]     |
0040213E    | 888C05 5EF7FFFF     | mov byte ptr ss:[ebp+eax-8A2],cl     |
00402145    | E9 40FEFFFF         | jmp x32_dump_3.401F8A                |
0040214A    | E8 111C0000         | call x32_dump_3.403D60               |

加密完成后,接着一段花指令,就来到了比较。

004021E6    | 8DBD E0FBFFFF       | lea edi,dword ptr ss:[ebp-420]       | 用户输入的注册码
004021EC    | 8DB5 5CF7FFFF       | lea esi,dword ptr ss:[ebp-8A4]       | 算出来的注册码
004021F2    | 33D2                | xor edx,edx                          |
004021F4    | F3:A7               | repe cmpsd                           | 明文比较
004021F6    | 75 14               | jne x32_dump_3.40220C                |
004021F8    | 6A 00               | push 0                               |
004021FA    | 6A 00               | push 0                               |
004021FC    | 68 547D4200         | push x32_dump_3.427D54               |
00402201    | 8B8D 30F7FFFF       | mov ecx,dword ptr ss:[ebp-8D0]       |
00402207    | E8 488B0000         | call x32_dump_3.40AD54               | 注册成功对话框
0040220C    | C745 FC FEFFFFFF    | mov dword ptr ss:[ebp-4],FFFFFFFE    |

别看这里是明文比较,下图是我打没注意前面直接补丁出来直接用他的弹窗函数得出来的serial来是不对的。因为他使用了代码段的机器码进行加密用户名。代码被篡改的话,加密出来就是错的。

flag.jpg

既然做了这个鬼把戏,我就想起来了VEH hook相关的知识,上CE VEH调试器

veh.jpg

然后在004021F2 下断后,断下后试了一下,就获取到了真码。

trueFlag.jpg

如果有人想写出一个注册机,建议用CE VEH调试器,扣取正确的数据, 把算法逆完。本程序附件再后面。

至此,这个CrackMe结束。
再测试一个用户名

example.jpg

CrackMeDemo Level4.zip

106.44 KB, 下载次数: 77, 下载积分: 吾爱币 -1 CB

原程序

免费评分

参与人数 17威望 +1 吾爱币 +35 热心值 +13 收起 理由
hml233 + 1 + 1 谢谢@Thanks!
__不说 + 1 + 1 谢谢@Thanks!
无垠苍茫然若失 + 1 + 1 用心讨论,共获提升!
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
WAlitudealiy + 1 谢谢@Thanks!
linden007x + 1 用心讨论,共获提升!
Qzang + 1 用心讨论,共获提升!
永远的永远 + 1 用心讨论,共获提升!
笙若 + 1 + 1 谢谢@Thanks!
Yanca + 1 用心讨论,共获提升!
elevo + 1 + 1 谢谢@Thanks!
feng17756555950 + 1 好厉害,虽然看不懂
haoyangge + 1 + 1 用心讨论,共获提升!
wuwopp + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
qinjiasheng + 1 + 1 我很赞同!
不爱everyone + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
yAYa + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| BeneficialWeb 发表于 2020-12-1 20:13
鸭子咯咯哒~ 发表于 2020-12-1 19:33
第一步拖入od后咋看的调试器标志位那个代码咋弄的

CDialog::DoModal,这是模态对话框的启动函数。先引用这个函数,然后看为什么启动不起来呀。
钞sir 发表于 2020-11-29 15:33
本帖最后由 钞sir 于 2020-11-29 16:02 编辑

第一步检测调试器标志位怎么找....
QingYi. 发表于 2020-11-29 15:40
拾染 发表于 2020-11-29 15:42
感谢大佬分享
wang99299 发表于 2020-11-29 15:50
学习一下,感谢分享
我的小鱼干 发表于 2020-11-29 15:57
作者是我们风控组组长
lanmei 发表于 2020-11-29 16:07
学习一下,谢谢分享
xiaoaiai2468 发表于 2020-11-29 16:08
学习学习
是Yoko避 发表于 2020-11-29 16:24
大佬太强了
jukongka 发表于 2020-11-29 16:33
不错不错,这种教程最有学习意义
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 12:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表