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
高端看不到{:1_918:}@犀角大王
页:
[1]