学破解第100天,《仿QQ截图工具》学习
前言:
一直对黑客充满了好奇,觉得黑客神秘,强大,无所不能,来论坛两年多了,天天看各位大佬发帖,自己只能做一个伸手党。也看了官方的入门视频教程,奈何自己基础太差,看不懂。自我反思之下,决定从今天(2019年6月17日)开始定下心来,从简单的基础教程开始学习,希望能从照抄照搬,到能独立分析,能独立破解。
不知不觉学习了好几个月,发现自己离了教程什么都不会,不懂算法,不懂编程。随着破解学习的深入,楼主这个半吊子迷失了自我,日渐沉迷水贴装X,不能自拔。
==========申明:从第71天楼主开始水贴装X,帖子不再具有连续性,仅供参考,后续帖子为楼主YY专用贴!!!==========
立帖为证!--------记录学习的点点滴滴
0x1直接上OD
1.就不查壳了,直接丢OD
00403831 >/$ 55 push ebp
00403832 |. 8BEC mov ebp,esp
00403834 |. 6A FF push -0x1
00403836 |. 68 F0624000 push 仿QQ截图.004062F0
0040383B |. 68 A44C4000 push 仿QQ截图.00404CA4 ; SE 处理程序安装
00403840 |. 64:A1 0000000>mov eax,dword ptr fs:[0]
00403846 |. 50 push eax
00403847 |. 64:8925 00000>mov dword ptr fs:[0],esp
0040384E |. 83EC 58 sub esp,0x58
00403851 |. 53 push ebx
00403852 |. 56 push esi
00403853 |. 57 push edi
00403854 |. 8965 E8 mov [local.6],esp
00403857 |. FF15 48604000 call dword ptr ds:[<&KERNEL32.GetVersion>; kernel32.GetVersion
看入口特征,应该是无壳,易语言编写的。
0x2运行软件,寻找爆破点
1.看着这我就知道我们要做的就是破解注册功能
2.点击注册,提示错误的注册码,有了对话框,自然就能想到messageBOX堆栈窗口回溯,下断点,运行程序,然后点击注册按钮,看堆栈窗口
0012F3D8 100622C6 /CALL 到 MessageBoxA 来自 krnln.100622C0
0012F3DC 00000000 |hOwner = NULL
0012F3E0 00228FF0 |Text = "错误的注册码"
0012F3E4 004094A6 |Title = "提示"
0012F3E8 00002040 \Style = MB_OK|MB_ICONASTERISK|MB_TASKMODAL
接下就开始Ctrl+F9,然后F8,反复循环,回溯到调用弹窗的call
0042D194 E8 E06C0000 call 仿QQ截图.00433E79 ;就是它
0042D199 83C4 28 add esp,0x28
0042D19C 8B5D FC mov ebx,dword ptr ss:[ebp-0x4]
3.接下来就是找关键跳了,咋也不去翻,直接段首F2下断点,然后取消messageBOX断点,再次点击注册,什么也不输入,成功的断在了
0042CFB2 55 push ebp
0042CFB3 8BEC mov ebp,esp
0042CFB5 81EC 08000000 sub esp,0x8
0042CFBB 6A FF push -0x1
0042CFBD 6A 08 push 0x8
0042CFBF 68 0F010116 push 0x1601010F
0042CFC4 68 02010152 push 0x52010102
一路F8单步走,注意大跳转,走着走着,这里大跳了,后面紧跟着的就是失败的messageBOX了
0042D0E4 E8 37ECFFFF call 仿QQ截图.0042BD20
0042D0E9 85C0 test eax,eax
0042D0EB 0F84 60000000 je 仿QQ截图.0042D151
4.想必0042D0EB这就是关键跳了,直接nop,运行程序,果然看到注册成功的提示语
试试修改图片质量,发现,拖不动???
纳尼,不是已经爆破成功了吗?咋还是不能修改呢?
5.我们找到了关键跳,发现直接nop行不通,关键跳上面一般就是关键call,所以仔细观察,调用一个call,然后eax为0就跳转,我直接F4到0042D0E4这一行,此时eax的值为:
爆破成功了,可以随意修改图片质量。
0x3通过启动程序时破解
1.我们看到关键call,retn后程序打开,显示已注册,那么我能不能在启动程序时,破解掉它的验证呢?重新载入程序,一路F8,程序跑起来就跟进去
004038FA |. E8 3BD8FFFF call 仿QQ截图.0040113A ;第一次这里跑起来,F7进去再F8
004014E1 |. FFD0 call eax ;第二次这里跑起来,F7进去再F8
10029A66 E8 04F5FFFF call krnln.10028F6F ;第三次这里跑起来,F7进去再F8
10029A66 E8 04F5FFFF call krnln.10028F6F ;第四次这里跑起来,F7进去再F8
;......省略n步重复步骤,来到了
00433E32 E8 1E000000 call 仿QQ截图.00433E55
00433E37 83C4 04 add esp,0x4
00433E3A 6A 00 push 0x0
00433E3C E8 0E000000 call 仿QQ截图.00433E4F
2.此时搜索字符串出现了,标题名,已注册,质量等字样
从已注册进去,来到了
0042BB47 E8 D4010000 call 仿QQ截图.0042BD20
0042BB4C 85C0 test eax,eax
0042BB4E 0F84 FA000000 je 仿QQ截图.0042BC4E
0042BB54 6A 00 push 0x0
0042BB56 68 01000000 push 0x1
0042BB5B 6A FF push -0x1
0042BB5D 6A 06 push 0x6
0042BB5F 68 06000116 push 0x16010006
0042BB64 68 01000152 push 0x52010001
0042BB69 E8 11830000 call 仿QQ截图.00433E7F
0042BB6E 83C4 18 add esp,0x18
0042BB71 6A 00 push 0x0
0042BB73 68 99000000 push 0x99 ; 已注册
此时程序主窗口还未出现,这里的字符串都是主窗口显示的,那还用说了,启动时验证在这,上面0042BB4E就是关键跳,0042BB47这个就是关键call,在关键call这里回车进去,直接retn返回,程序跑起来,直接显示已注册。
0x4去掉弹网页
1.程序关闭时,居然还弹了网页http://wan3d.com/,不能忍,下ShellExecuteA断点,运行程序,然后叉掉程序,看堆栈窗口
0012EB58 1003C95E /CALL 到 ShellExecuteA 来自 krnln.1003C958
0012EB5C 00000000 |hWnd = NULL
0012EB60 100E3BEC |Operation = "open"
0012EB64 00AD39E0 |FileName = "http://wan3d.com"
0012EB68 00000000 |Parameters = NULL
0012EB6C 00000000 |DefDir = NULL
0012EB70 00000005 \IsShown = 0x5
回车来到了,还记得前面的学习内容吧,直接5个push加call一起nop掉即可!
1003C94B |. 55 push ebp ; /IsShown = 0x5
1003C94C |. 6A 00 push 0x0 ; |DefDir = NULL
1003C94E |. 6A 00 push 0x0 ; |Parameters = NULL
1003C950 |. 51 push ecx ; |FileName = "http://wan3d.com"
1003C951 |. 68 EC3B0E10 push krnln.100E3BEC ; |Operation = "open"
1003C956 |. 6A 00 push 0x0 ; |hWnd = NULL
1003C958 |. FF15 C0340C10 call dword ptr ds:[<&SHELL32.ShellExecut>; \ShellExecuteA
2.呃,保存不出去,这好像是在系统call里面,那咱不nop这里了,直接CTRL+F9和F8跟出去,找到真正的call,n多次之后,终于跟出来了
00433A71 /0F85 3E000000 jnz 仿QQ截图.00433AB5
00433A77 |6A 00 push 0x0
00433A79 |68 52CC4100 push 仿QQ截图.0041CC52 ; http://wan3d.com
00433A7E |6A FF push -0x1
00433A80 |6A 0B push 0xB
00433A82 |68 72030116 push 0x16010372
00433A87 |68 01000152 push 0x52010001
00433A8C |E8 EE030000 call 仿QQ截图.00433E7F
00433A91 |83C4 18 add esp,0x18
00433A94 |68 1D000100 push 0x1001D
00433A99 |68 72030116 push 0x16010372
00433A9E |68 01000152 push 0x52010001
00433AA3 |68 01000000 push 0x1
00433AA8 |BB B4060000 mov ebx,0x6B4
00433AAD |E8 C7030000 call 仿QQ截图.00433E79
00433AB2 |83C4 10 add esp,0x10
00433A71这个直接改成jmp了,关闭程序,再也不会弹网页了,复习一下API断点
0x5总结
1.有消息弹窗通过messageBOX下断点,回溯找关键call和关键跳,改跳转或者关键call,直接return,防止在使用功能时,判断注册标志
2.程序启动时,会判断是否注册,可以在程序还未跑起来时,通过F8和F7不断跟进,在字符串全部解密后,窗口未显示前,搜索注册字符串,同样找到关键call和关键跳
3.去广告那一步,我是坚决不会承认可以直接搜索字符串定位关键跳的,也不会承认API断下来后,堆栈窗口下拉就能看得到真正的调用返回处