好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 chuiyan121 于 2022-2-26 13:39 编辑
The041. 吾爱培训,《05:反击作者的挑衅》讲师:我是用户 [爆破、追码]
关于吾爱破解论坛官方入门教学培训第一期,我的学习记录,如有疑问欢迎交流指正。^_^
我是用户大牛教程很详细,注释也很丰富,我学习后简化了流程,仅将关键地方记录下来。
【吾爱破解培训第五课作业.exe】->爆破。
0x0、根据作业的要求,重启后出现彩蛋按钮即为爆破成功。中文搜索字符串“彩蛋”,一共三个,第三个最贴切,双击它跳转到反汇编窗口。然后F2下断,F9运行到断点。
0x1、明显一个跳转跳过了“恭喜你发现彩蛋..”这一句,直接NOP大法爆破,保存文件为1.exe。
0x2、我是彩蛋按钮出现,爆破成功。
【吾爱破解培训第五课作业.exe】->追码。
0x0、程序输入注册码没有反应,到处搜索一番,原来密码是3段构成的,中间用减号“-”连接,格式为:“txt注册码-ini注册码-reg注册码”。按下图输入假码,提示注册成功,并在根目录分别生成:52Pojie.txt、52Pojie.ini和注册表52Pojie的confirm项,分别对应输入的3段假码。
0x1、OD重载程序,根据上集的方法知道ReadFile这个API这里主要用来读取txt文件里的内容,Ctrl+N打开输入表窗口,搜索ReadFile,回车弹出参考窗口,将所有地址下断点。
0x2、Ctrl+F2重载程序,F9运行后,程序断在004020B8处,发现了熟悉的真码和真假码比较函数。程序读取了txt文件里的假码“111111111”,并在循环函数中于真码的每一位进行比较。
因此得出txt的真码应该是:ITN3UXJGJ。
0x3、找到了txt的注册码,再试着找一下ini文件的注册码。Ctrl+N搜索GetPrivateProfileStringA,全部下断点。
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。
0x5、将前两段真码填入对应文件中,现在仅剩写入注册表里的那段注册码了。关于注册表操作的API函数有:创建注册表Key:RegCreateKey、打开注册表Key:RegOpenKey、查询注册表键值:RegQueryValue(Ex)、写入注册表键值:RegSetValueEx。这里同样使用Ctrl+N搜索RegQueryValueExA,全部下断点。
0x6、Ctrl+F2重载,F9运行几次,有一次明显程序缓冲后,跳到00402285处,发现了confirm特征,就是这里了。
0x7、F8慢慢跟进,后面的追码内容对于新手的我来说过于复杂了,这里借用前辈@奋仔的方法暂且记录下来,以后出息了再回头来研究吧。
[Asm] 纯文本查看 复制代码 [/color][/size]
[size=3][color=seagreen]00402255 |. 50 push eax ; /pBufSize = 00000032[/color][/size]
[size=3][color=seagreen]00402256 |. 8D85 F4FEFFFF lea eax,[local.67] ; |[/color][/size]
[size=3][color=seagreen]0040225C |. 50 push eax ; |Buffer = 00000032[/color][/size]
[size=3][color=seagreen]0040225D |. 8D85 F0FEFFFF lea eax,[local.68] ; |[/color][/size]
[size=3][color=seagreen]00402263 |. 50 push eax ; |pValueType = 00000032[/color][/size]
[size=3][color=seagreen]00402264 |. 6A 00 push 0x0 ; |Reserved = NULL[/color][/size]
[size=3][color=seagreen]00402266 |. 68 34465400 push 吾爱破解.00544634 ; |ValueName = "confirm"[/color][/size]
[size=3][color=seagreen]0040226B |. FFB5 E8FEFFFF push [local.70] ; |hKey = 0x100[/color][/size]
[size=3][color=seagreen]00402271 |. C785 F0FEFFFF>mov [local.68],0x1 ; |[/color][/size]
[size=3][color=seagreen]0040227B |. C785 ECFEFFFF>mov [local.69],0x104 ; |[/color][/size]
[size=3][color=seagreen]00402285 |. FF15 24305400 call dword ptr ds:[<&ADVAPI32.RegQueryVa>; \RegQueryValueExA[/color][/size]
[size=3][color=seagreen]0040228B |. 85C0 test eax,eax ; 判断注册表该处是否输入了注册码[/color][/size]
[size=3][color=seagreen]0040228D |. 0F85 E1000000 jnz 吾爱破解.00402374 ; 若为空值,则跳转[/color][/size]
[size=3][color=seagreen]00402293 |. 8D8D F4FEFFFF lea ecx,[local.67] ; 输入假码的地址 ecx=0012F34C[/color][/size]
[size=3][color=seagreen]00402299 |. 8D51 01 lea edx,dword ptr ds:[ecx+0x1] ; 输入假码的第2位地址 edx=0012F34D[/color][/size]
[size=3][color=seagreen]0040229C |. 8D6424 00 lea esp,dword ptr ss:[esp] ; esp=0012F338[/color][/size]
[size=3][color=seagreen]004022A0 |> 8A01 /mov al,byte ptr ds:[ecx] ; 取输入的假码第1位[/color][/size]
[size=3][color=seagreen]004022A2 |. 41 |inc ecx ; 输入假码的地址+1,ecx+1[/color][/size]
[size=3][color=seagreen]004022A3 |. 84C0 |test al,al ; 检查假码位数是否为0[/color][/size]
[size=3][color=seagreen]004022A5 |.^ 75 F9 \jnz short 吾爱破解.004022A0 ; 不为0才向上跳转[/color][/size]
[size=3][color=seagreen]004022A7 |. 2BCA sub ecx,edx ; 获取输入假码的长度为9,ecx=00000009[/color][/size]
[size=3][color=seagreen]004022A9 |. 83C1 06 add ecx,0x6 ; 输入假码长度+6,ecx=9+6=0000000F[/color][/size]
[size=3][color=seagreen]004022AC |. B8 CDCCCCCC mov eax,0xCCCCCCCD ; eax=CCCCCCCD[/color][/size]
[size=3][color=seagreen]004022B1 |. F7E1 mul ecx ; eax*ecx=CCCCCCCD*F=00000003[/color][/size]
[size=3][color=seagreen]004022B3 |. C1EA 02 shr edx,0x2 ; edx右移2位:edx=C,二进制为1100,偏移2位为11,即16进制的3[/color][/size]
[size=3][color=seagreen]004022B6 |. 83EA 03 sub edx,0x3 ; edx-3即3-3=0,edx=0则不跳转,这里edx必须为3[/color][/size]
[size=3][color=seagreen]004022B9 |. 0F85 B5000000 jnz 吾爱破解.00402374 ; 此跳转不能让它实现,因此这里edx必须为0[/color][/size]
[size=3][color=seagreen]004022BF |. E8 D82D0000 call 吾爱破解.0040509C ; eax=58E5DC,'lJT'的地址[/color][/size]
[size=3][color=seagreen]004022C4 |. 8BC8 mov ecx,eax ; ecx指向'lJT'的地址[/color][/size]
[size=3][color=seagreen]004022C6 |. 85C9 test ecx,ecx ; 若ecx为0,则标志位ZF=1,跳转实现[/color][/size]
[size=3][color=seagreen]004022C8 |. 0F84 C3000000 je 吾爱破解.00402391[/color][/size]
[size=3][color=seagreen]004022CE |. 8B01 mov eax,dword ptr ds:[ecx] ; eax=544A6C,就是'lJT'的地址[/color][/size]
[size=3][color=seagreen]004022D0 |. FF50 0C call dword ptr ds:[eax+0xC] ; eax=58E5E0,该地址存放着'iJT'的地址[/color][/size]
[size=3][color=seagreen]004022D3 |. 8A95 F8FEFFFF mov dl,byte ptr ss:[ebp-0x108] ; dl=输入假码第5位[/color][/size]
[size=3][color=seagreen]004022D9 |. 8D70 10 lea esi,dword ptr ds:[eax+0x10][/color][/size]
[size=3][color=seagreen]004022DC |. 0FBE85 F4FEFF>movsx eax,byte ptr ss:[ebp-0x10C] ; eax取输入假码第1位[/color][/size]
[size=3][color=seagreen]004022E3 |. 0FBECA movsx ecx,dl ; ecx=输入假码第5位[/color][/size]
[size=3][color=seagreen]004022E6 |. 48 dec eax ; eax值-1,即31-1=30[/color][/size]
[size=3][color=seagreen]004022E7 |. 89B5 E4FEFFFF mov [local.71],esi[/color][/size]
[size=3][color=seagreen]004022ED |. 3BC1 cmp eax,ecx ; eax与ecx对比,反推2:假码第1位是3[/color][/size]
[size=3][color=seagreen]004022EF |. 75 69 jnz short 吾爱破解.0040235A ; 不相等则跳走,必须相等[/color][/size]
[size=3][color=seagreen]004022F1 |. 0FBE85 FCFEFF>movsx eax,byte ptr ss:[ebp-0x104] ; eax取输入假码最后一位[/color][/size]
[size=3][color=seagreen]004022F8 |. 83C1 02 add ecx,0x2 ; ecx=输入假码第5位的值+2[/color][/size]
[size=3][color=seagreen]004022FB |. 3BC8 cmp ecx,eax ; ecx与eax比较,反推3:假码第9位是4[/color][/size]
[size=3][color=seagreen]004022FD |. 75 5B jnz short 吾爱破解.0040235A ; 不相等则跳走,必须相等[/color][/size]
[size=3][color=seagreen]004022FF |. 80F2 54 xor dl,0x54 ; dl的值与54异或后为66,计算出dl必须为2,反推1:假码第5位是2[/color][/size]
[size=3][color=seagreen]00402302 |. 80FA 66 cmp dl,0x66 ; dl与66对比[/color][/size]
[size=3][color=seagreen]00402305 |. 75 53 jnz short 吾爱破解.0040235A ; 不相等则跳走,必须相等[/color][/size]
[size=3][color=seagreen]00402307 |. 6A 03 push 0x3 ; 比较3位[/color][/size]
[size=3][color=seagreen]00402309 |. 8D85 F5FEFFFF lea eax,dword ptr ss:[ebp-0x10B] ; eax取输入假码第2位开始的子串1地址0012F34D[/color][/size]
[size=3][color=seagreen]0040230F |. 68 3C465400 push 吾爱破解.0054463C ; 压入真码的一部分"MjM"[/color][/size]
[size=3][color=seagreen]00402314 |. 50 push eax ; 压入假码子串地址,eax=0012F34D[/color][/size]
[size=3][color=seagreen]00402315 |. E8 76991100 call 吾爱破解.0051BC90 ; 比较子串前3位,也就是假码的2-4位[/color][/size]
[size=3][color=seagreen]0040231A |. 83C4 0C add esp,0xC[/color][/size]
[size=3][color=seagreen]0040231D |. 85C0 test eax,eax ; 若比较结果相同,则eax=0[/color][/size]
[size=3][color=seagreen]0040231F |. 75 39 jnz short 吾爱破解.0040235A ; 不跳转[/color][/size]
[size=3][color=seagreen]00402321 |. 6A 03 push 0x3 ; 比较3位[/color][/size]
[size=3][color=seagreen]00402323 |. 8D85 F9FEFFFF lea eax,dword ptr ss:[ebp-0x107] ; eax取输入假码第6位开始的子串2地址0012F351[/color][/size]
[size=3][color=seagreen]00402329 |. 68 40465400 push 吾爱破解.00544640 ; 压入真码的一部分"UXJ"[/color][/size]
[size=3][color=seagreen]0040232E |. 50 push eax ; 压入假码子串地址,eax=0012F351[/color][/size]
[size=3][color=seagreen]0040232F |. E8 5C991100 call 吾爱破解.0051BC90 ; 比较子串前3位,也就是假码的6-8位[/color][/size]
[size=3][color=seagreen]00402334 |. 83C4 0C add esp,0xC[/color][/size]
[size=3][color=seagreen]00402337 |. 85C0 test eax,eax ; 若比较结果相同,则eax=0[/color][/size]
[size=3][color=seagreen]00402339 |. 75 1F jnz short 吾爱破解.0040235A ; 不跳转,至此追码完成,真码为:3MjM2UXJ4[/color][/size]
[size=3][color=seagreen]
0x8、运行程序,提示“恭喜你发现彩蛋…”,程序界面出现我是彩蛋按钮,追码完成。
|
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|