chuiyan121 发表于 2022-2-26 13:37

The041. 吾爱培训,《05:反击作者的挑衅》讲师:我是用户 [爆破、追码]

本帖最后由 chuiyan121 于 2022-2-26 13:39 编辑


The041. 吾爱培训,《05:反击作者的挑衅》讲师:我是用户 [爆破、追码]
关于吾爱破解论坛官方入门教学培训第一期,我的学习记录,如有疑问欢迎交流指正。^_^
我是用户大牛教程很详细,注释也很丰富,我学习后简化了流程,仅将关键地方记录下来。

【吾爱破解培训第五课作业.exe】->爆破。
0x0、根据作业的要求,重启后出现彩蛋按钮即为爆破成功。中文搜索字符串“彩蛋”,一共三个,第三个最贴切,双击它跳转到反汇编窗口。然后F2下断,F9运行到断点。
https://s4.ax1x.com/2022/02/26/bVT1Hg.png

0x1、明显一个跳转跳过了“恭喜你发现彩蛋..”这一句,直接NOP大法爆破,保存文件为1.exe。
https://s4.ax1x.com/2022/02/26/bVTlDS.png

0x2、我是彩蛋按钮出现,爆破成功。
https://s4.ax1x.com/2022/02/26/bVTUg0.png


【吾爱破解培训第五课作业.exe】->追码。
0x0、程序输入注册码没有反应,到处搜索一番,原来密码是3段构成的,中间用减号“-”连接,格式为:“txt注册码-ini注册码-reg注册码”。按下图输入假码,提示注册成功,并在根目录分别生成:52Pojie.txt、52Pojie.ini和注册表52Pojie的confirm项,分别对应输入的3段假码。
https://s4.ax1x.com/2022/02/26/bVT8EQ.png

0x1、OD重载程序,根据上集的方法知道ReadFile这个API这里主要用来读取txt文件里的内容,Ctrl+N打开输入表窗口,搜索ReadFile,回车弹出参考窗口,将所有地址下断点。
https://s4.ax1x.com/2022/02/26/bVTQu8.png

0x2、Ctrl+F2重载程序,F9运行后,程序断在004020B8处,发现了熟悉的真码和真假码比较函数。程序读取了txt文件里的假码“111111111”,并在循环函数中于真码的每一位进行比较。
因此得出txt的真码应该是:ITN3UXJGJ。
https://s4.ax1x.com/2022/02/26/bVTGNj.png

0x3、找到了txt的注册码,再试着找一下ini文件的注册码。Ctrl+N搜索GetPrivateProfileStringA,全部下断点。
https://s4.ax1x.com/2022/02/26/bVTtCn.png

0x4、Ctrl+F2重载程序,F9运行后,程序断在00402198处,这次就没那么好运,直接看到真码了。F8单步跟会发现004021B0处的循环获取假码的位数,然后cmp ecx,0xE比较假码位数是否为14位,若不是则跳走了。这时需要提前将ini文件里的假码改成14位,我提前改成了“12345678901234”。后面取出真码第一位存到edx,然后假码第一位存到ecx,然后是重点edx+30,最后比较edx和ecx,不相等则跳走。
在数据窗口跟随edx地址,发现了真码的雏形 :3A 1E 02 25 28 1A 48 15 3A 1D 02 25 28 1A。
既然知道edx加30才是真码,手动加30后为:6A 4E 32 55 58 4A 78 45 6A 4D 32 55 58 4A。
由此得出ini文件注册码为:jN2UXJxEjM2UXJ。
https://s4.ax1x.com/2022/02/26/bVTJ4s.png

0x5、将前两段真码填入对应文件中,现在仅剩写入注册表里的那段注册码了。关于注册表操作的API函数有:创建注册表Key:RegCreateKey、打开注册表Key:RegOpenKey、查询注册表键值:RegQueryValue(Ex)、写入注册表键值:RegSetValueEx。这里同样使用Ctrl+N搜索RegQueryValueExA,全部下断点。
https://s4.ax1x.com/2022/02/26/bVTwuT.png

0x6、Ctrl+F2重载,F9运行几次,有一次明显程序缓冲后,跳到00402285处,发现了confirm特征,就是这里了。
https://s4.ax1x.com/2022/02/26/bVTN3q.png

0x7、F8慢慢跟进,后面的追码内容对于新手的我来说过于复杂了,这里借用前辈@奋仔的方法暂且记录下来,以后出息了再回头来研究吧。

00402255|.50            push eax                                 ; /pBufSize = 00000032
00402256|.8D85 F4FEFFFF lea eax,                     ; |
0040225C|.50            push eax                                 ; |Buffer = 00000032
0040225D|.8D85 F0FEFFFF lea eax,                     ; |
00402263|.50            push eax                                 ; |pValueType = 00000032
00402264|.6A 00         push 0x0                                 ; |Reserved = NULL
00402266|.68 34465400   push 吾爱破解.00544634                     ; |ValueName = "confirm"
0040226B|.FFB5 E8FEFFFF push                         ; |hKey = 0x100
00402271|.C785 F0FEFFFF>mov ,0x1                     ; |
0040227B|.C785 ECFEFFFF>mov ,0x104                     ; |
00402285|.FF15 24305400 call dword ptr ds:[<&ADVAPI32.RegQueryVa>; \RegQueryValueExA
0040228B|.85C0          test eax,eax                           ;判断注册表该处是否输入了注册码
0040228D|.0F85 E1000000 jnz 吾爱破解.00402374                        ;若为空值,则跳转
00402293|.8D8D F4FEFFFF lea ecx,                     ;输入假码的地址 ecx=0012F34C
00402299|.8D51 01       lea edx,dword ptr ds:         ;输入假码的第2位地址 edx=0012F34D
0040229C|.8D6424 00   lea esp,dword ptr ss:               ;esp=0012F338
004022A0|>8A01          /mov al,byte ptr ds:                ;取输入的假码第1位
004022A2|.41            |inc ecx                                 ;输入假码的地址+1,ecx+1
004022A3|.84C0          |test al,al                              ;检查假码位数是否为0
004022A5|.^ 75 F9         \jnz short 吾爱破解.004022A0               ;不为0才向上跳转
004022A7|.2BCA          sub ecx,edx                              ;获取输入假码的长度为9,ecx=00000009
004022A9|.83C1 06       add ecx,0x6                              ;输入假码长度+6,ecx=9+6=0000000F
004022AC|.B8 CDCCCCCC   mov eax,0xCCCCCCCD                     ;eax=CCCCCCCD
004022B1|.F7E1          mul ecx                                  ;eax*ecx=CCCCCCCD*F=00000003
004022B3|.C1EA 02       shr edx,0x2                              ;edx右移2位:edx=C,二进制为1100,偏移2位为11,即16进制的3
004022B6|.83EA 03       sub edx,0x3                              ;edx-3即3-3=0,edx=0则不跳转,这里edx必须为3
004022B9|.0F85 B5000000 jnz 吾爱破解.00402374                        ;此跳转不能让它实现,因此这里edx必须为0
004022BF|.E8 D82D0000   call 吾爱破解.0040509C                     ;eax=58E5DC,'lJT'的地址
004022C4|.8BC8          mov ecx,eax                              ;ecx指向'lJT'的地址
004022C6|.85C9          test ecx,ecx                           ;若ecx为0,则标志位ZF=1,跳转实现
004022C8|.0F84 C3000000 je 吾爱破解.00402391
004022CE|.8B01          mov eax,dword ptr ds:               ;eax=544A6C,就是'lJT'的地址
004022D0|.FF50 0C       call dword ptr ds:            ;eax=58E5E0,该地址存放着'iJT'的地址
004022D3|.8A95 F8FEFFFF mov dl,byte ptr ss:         ;dl=输入假码第5位
004022D9|.8D70 10       lea esi,dword ptr ds:
004022DC|.0FBE85 F4FEFF>movsx eax,byte ptr ss:      ;eax取输入假码第1位
004022E3|.0FBECA      movsx ecx,dl                           ;ecx=输入假码第5位
004022E6|.48            dec eax                                  ;eax值-1,即31-1=30
004022E7|.89B5 E4FEFFFF mov ,esi
004022ED|.3BC1          cmp eax,ecx                              ;eax与ecx对比,反推2:假码第1位是3
004022EF|.75 69         jnz short 吾爱破解.0040235A                  ;不相等则跳走,必须相等
004022F1|.0FBE85 FCFEFF>movsx eax,byte ptr ss:      ;eax取输入假码最后一位
004022F8|.83C1 02       add ecx,0x2                              ;ecx=输入假码第5位的值+2
004022FB|.3BC8          cmp ecx,eax                              ;ecx与eax比较,反推3:假码第9位是4
004022FD|.75 5B         jnz short 吾爱破解.0040235A                  ;不相等则跳走,必须相等
004022FF|.80F2 54       xor dl,0x54                              ;dl的值与54异或后为66,计算出dl必须为2,反推1:假码第5位是2
00402302|.80FA 66       cmp dl,0x66                              ;dl与66对比
00402305|.75 53         jnz short 吾爱破解.0040235A                  ;不相等则跳走,必须相等
00402307|.6A 03         push 0x3                                 ;比较3位
00402309|.8D85 F5FEFFFF lea eax,dword ptr ss:         ;eax取输入假码第2位开始的子串1地址0012F34D
0040230F|.68 3C465400   push 吾爱破解.0054463C                     ;压入真码的一部分"MjM"
00402314|.50            push eax                                 ;压入假码子串地址,eax=0012F34D
00402315|.E8 76991100   call 吾爱破解.0051BC90                     ;比较子串前3位,也就是假码的2-4位
0040231A|.83C4 0C       add esp,0xC
0040231D|.85C0          test eax,eax                           ;若比较结果相同,则eax=0
0040231F|.75 39         jnz short 吾爱破解.0040235A                  ;不跳转
00402321|.6A 03         push 0x3                                 ;比较3位
00402323|.8D85 F9FEFFFF lea eax,dword ptr ss:         ;eax取输入假码第6位开始的子串2地址0012F351
00402329|.68 40465400   push 吾爱破解.00544640                     ;压入真码的一部分"UXJ"
0040232E|.50            push eax                                 ;压入假码子串地址,eax=0012F351
0040232F|.E8 5C991100   call 吾爱破解.0051BC90                     ;比较子串前3位,也就是假码的6-8位
00402334|.83C4 0C       add esp,0xC
00402337|.85C0          test eax,eax                           ;若比较结果相同,则eax=0
00402339|.75 1F         jnz short 吾爱破解.0040235A                  ;不跳转,至此追码完成,真码为:3MjM2UXJ4


0x8、运行程序,提示“恭喜你发现彩蛋…”,程序界面出现我是彩蛋按钮,追码完成。
https://s4.ax1x.com/2022/02/26/bVTrE4.png





犀角大王 发表于 2022-2-26 19:39

高端看不到{:1_918:}@犀角大王
页: [1]
查看完整版本: The041. 吾爱培训,《05:反击作者的挑衅》讲师:我是用户 [爆破、追码]