好友
阅读权限20
听众
最后登录1970-1-1
|
回帖奖励 +10 CB吾爱币
本帖最后由 wenbo998 于 2015-8-3 17:00 编辑
首先感谢小生大大在百忙之中来做直播教学。昨天一听到声音就知道是你了,你的教程我学习过的。而且你用那个,查找所有常量,这一招我是太熟悉啦, 哈哈哈!通过锁定某个常量下断从而找到该程序的关键赋值点,判断点。
1、首先载入OD一看,Delphi。无壳就简单了一步,首先查找字符串。找到类似注册相关字眼。跟踪之。在有“已注册版本”那段程序的段首下断。来到:
00541865 8B83 0C030000 mov eax,dword ptr ds:[ebx+0x30C]
0054186B E8 E46FF3FF call qqqf.00478854
00541870 803D 249F5700 0>cmp byte ptr ds:[0x579F24],0x0
00541877 74 10 je short qqqf.00541889
00541879 BA F4185400 mov edx,qqqf.005418F4 ; 已注册版本
这里是对0x579F24这里的值进行一个判断,为0就跳过已注册版本。所以,这个0x579F24里面的数值不能让他为0。用小生大大那招,查找所有常量,锁定它。在每个地方下断,重新载入。一开始,程序断在这里:
00541650 > \8815 249F5700 mov byte ptr ds:[0x579F24],dl
00541656 . 83F8 0C cmp eax,0xC
00541659 . 75 48 jnz short qqqf.005416A3
0054165B . 8D45 F4 lea eax,dword ptr ss:[ebp-0xC]
0054165E . 50 push eax
0054165F . B8 64000000 mov eax,0x64
00541664 . E8 AF17ECFF call qqqf.00402E18
00541669 . 8B0485 2C9F57>mov eax,dword ptr ds:[eax*4+0x579F2C]
00541670 . B9 02000000 mov ecx,0x2
00541675 . BA 01000000 mov edx,0x1
0054167A . E8 A531ECFF call qqqf.00404824
0054167F . 8B45 F4 mov eax,dword ptr ss:[ebp-0xC]
00541682 . BA 64175400 mov edx,qqqf.00541764 ; 02
00541687 . E8 8430ECFF call qqqf.00404710
0054168C . 75 0A jnz short qqqf.00541698
0054168E . 8B07 mov eax,dword ptr ds:[edi]
00541690 . E8 177EFCFF call qqqf.005094AC
00541695 . 40 inc eax
00541696 . 7F 04 jg short qqqf.0054169C
00541698 > 33C0 xor eax,eax
0054169A . EB 02 jmp short qqqf.0054169E
0054169C > B0 01 mov al,0x1
0054169E > A2 249F5700 mov byte ptr ds:[0x579F24],al
005416A3 > 803D 249F5700>cmp byte ptr ds:[0x579F24],0x0
005416AA . 75 05 jnz short qqqf.005416B1
005416AC . E8 63FCFFFF call qqqf.00541314
DL此时的值为1,写入0x579F24这个地址。往下看,明显发现程序在判断注册码的位数是否合格,因为我写的注册码是012345678912,所以是12也就是0xC。继续往下单步跟。
这里:
00541650 > \8815 249F5700 mov byte ptr ds:[0x579F24],dl
00541656 . 83F8 0C cmp eax,0xC
00541659 90 nop
0054165A 90 nop
0054165B . 8D45 F4 lea eax,dword ptr ss:[ebp-0xC]
判断位数的这里,下面的条件跳转直接nop,不让他进行位数判断。
这里:
00541695 . 40 inc eax
00541696 . 7F 04 jg short qqqf.0054169C
00541698 > 33C0 xor eax,eax
0054169A 90 nop
0054169B 90 nop
0054169C > B0 01 mov al,0x1
0054169E > A2 249F5700 mov byte ptr ds:[0x579F24],al
005416A3 > 803D 249F5700>cmp byte ptr ds:[0x579F24],0x0
005416AA . 75 05 jnz short qqqf.005416B1
005416AC . E8 63FCFFFF call qqqf.00541314
看到给al赋值,然后再把al给0x579F24这里,然后再把0x579F24和0作比较。这里就是关键点了,把那个jmp直接nop,让他这个赋值过程实现,从而将0x579F24赋值为1。然后跑起来,发现有一个网络验证。也就是说,当软件检测到0x579F24里的值为1的时候,软件就知道已经注册,那么下一步就是来验证到底是否注册了。那么我们就需要把这个网络验证给nop掉。查找字符串。找到了正在验证和验证失败。跟进去。结果发现这么一段程序貌似就是进行网络验证,那么段首retn试试吧,注意和段尾的retn相对应。保存,测试。经过验证,ok了。如图所示:
底下的广告已经变为已注册,打开注册也看到是已注册版本。现在点确认仍然是报错的,因为我们破解的只是他的本地验证机制,所以你输入错误的注册码以后,点确认,昨晚我大概跟过,他是要打开一个URL,带上你的机器码和注册码进行服务器验证的,所以还是不能通过。但是这样已经可以啦。
2、接下来就是昨晚的重点,去除程序自校验。说实话昨晚小生大大操作的太快,上上下下进进出出的看的我很晕,其实这种校验以我的耐心我是跟不下去的,找一会我就晕了,而且我也未必找得到,找到了也未必认识他就是MD5的段。那就照猫画虎下吧,练练手。OK,用脱壳脚本在所有按钮事件上下断,找到合适的位置以后取消其他无用断点。
OK,进入这里就是啦,这一段虽然不长,但是里面的这些CALL可是暗藏杀机啊!现在就在每个CALL里好好的跟一跟吧。
00567ED8 55 push ebp
00567ED9 8BEC mov ebp,esp
00567EDB 6A 00 push 0x0
00567EDD 6A 00 push 0x0
00567EDF 33C0 xor eax,eax
00567EE1 55 push ebp
00567EE2 68 347F5600 push ceshi2.00567F34
00567EE7 64:FF30 push dword ptr fs:[eax]
00567EEA 64:8920 mov dword ptr fs:[eax],esp
00567EED 8D4D F8 lea ecx,dword ptr ss:[ebp-0x8]
00567EF0 33D2 xor edx,edx
00567EF2 B8 1E000000 mov eax,0x1E
00567EF7 E8 C4AEF4FF call ceshi2.004B2DC0
00567EFC 8B55 F8 mov edx,dword ptr ss:[ebp-0x8]
00567EFF 8D45 FC lea eax,dword ptr ss:[ebp-0x4]
00567F02 E8 D1CCE9FF call ceshi2.00404BD8
00567F07 8B45 FC mov eax,dword ptr ss:[ebp-0x4]
00567F0A 50 push eax
00567F0B E8 5049FFFF call ceshi2.0055C860
00567F10 5A pop edx ; ceshi2.0048B2DC
00567F11 E8 9AF9F8FF call ceshi2.004F78B0
00567F16 33C0 xor eax,eax
00567F18 5A pop edx ; ceshi2.0048B2DC
00567F19 59 pop ecx ; ceshi2.0048B2DC
00567F1A 59 pop ecx ; ceshi2.0048B2DC
00567F1B 64:8910 mov dword ptr fs:[eax],edx
00567F1E 68 3B7F5600 push ceshi2.00567F3B
00567F23 8D45 F8 lea eax,dword ptr ss:[ebp-0x8]
00567F26 E8 ADC3E9FF call ceshi2.004042D8
00567F2B 8D45 FC lea eax,dword ptr ss:[ebp-0x4]
00567F2E E8 DDCAE9FF call ceshi2.00404A10
00567F33 C3 retn
00567F34 ^ E9 E3BCE9FF jmp ceshi2.00403C1C
00567F39 ^ EB E8 jmp short ceshi2.00567F23
00567F3B 59 pop ecx ; ceshi2.0048B2DC
00567F3C 59 pop ecx ; ceshi2.0048B2DC
00567F3D 5D pop ebp ; ceshi2.0048B2DC
00567F3E C3 retn
…………经过反复的跟啊跟,重点小生大大说,文件读取完,关闭以后就该是出MD5的地方了类似这样意思的话。那么我找到了这些:
004B1EB8 8B45 EC mov eax,dword ptr ss:[ebp-0x14]
004B1EBB 50 push eax
004B1EBC E8 5F51F5FF call <jmp.&kernel32.UnmapViewOfFile>
004B1EC1 C3 retn
004B1EC2 ^ E9 551DF5FF jmp ceshi2.00403C1C
004B1EC7 ^ EB EF jmp short ceshi2.004B1EB8
004B1EC9 33C0 xor eax,eax
004B1ECB 5A pop edx ; ceshi2.004B1F05
004B1ECC 59 pop ecx ; ceshi2.004B1F05
004B1ECD 59 pop ecx ; ceshi2.004B1F05
004B1ECE 64:8910 mov dword ptr fs:[eax],edx
004B1ED1 68 E71E4B00 push ceshi2.004B1EE7
004B1ED6 8B45 F0 mov eax,dword ptr ss:[ebp-0x10]
004B1ED9 50 push eax
004B1EDA E8 E14DF5FF call <jmp.&kernel32.CloseHandle>
004B1EDF C3 retn
004B1EE0 ^ E9 371DF5FF jmp ceshi2.00403C1C
004B1EE5 ^ EB EF jmp short ceshi2.004B1ED6
004B1EE7 33C0 xor eax,eax
004B1EE9 5A pop edx ; ceshi2.004B1F05
004B1EEA 59 pop ecx ; ceshi2.004B1F05
004B1EEB 59 pop ecx ; ceshi2.004B1F05
004B1EEC 64:8910 mov dword ptr fs:[eax],edx
004B1EEF 68 051F4B00 push ceshi2.004B1F05
004B1EF4 8B45 F4 mov eax,dword ptr ss:[ebp-0xC]
004B1EF7 50 push eax
004B1EF8 E8 C34DF5FF call <jmp.&kernel32.CloseHandle>
004B1EFD C3 retn
继续往下跟,返回到:
004B1F6F BE 10000000 mov esi,0x10
004B1F74 8D5D EC lea ebx,dword ptr ss:[ebp-0x14]
004B1F77 8D55 E8 lea edx,dword ptr ss:[ebp-0x18]
004B1F7A 33C0 xor eax,eax
004B1F7C 8A03 mov al,byte ptr ds:[ebx]
004B1F7E E8 35F1FFFF call ceshi2.004B10B8
数据窗跟随,看到假的MD5。ok,CTRL+B,补写代码吧。如下:
0056B0A4 60 pushad
0056B0A5 C745 EC 11EA70A>mov dword ptr ss:[ebp-0x14],0xA370EA11
0056B0AC C745 F0 C3735C2>mov dword ptr ss:[ebp-0x10],0x295C73C3
0056B0B3 C745 F4 B485527>mov dword ptr ss:[ebp-0xC],0x775285B4
0056B0BA C745 F8 6756406>mov dword ptr ss:[ebp-0x8],0x6A405667
0056B0C1 8D5D EC lea ebx,dword ptr ss:[ebp-0x14]
0056B0C4 8D55 E8 lea edx,dword ptr ss:[ebp-0x18]
0056B0C7 33C0 xor eax,eax
0056B0C9 8A03 mov al,byte ptr ds:[ebx]
0056B0CB E8 E85FF4FF call ceshi2.004B10B8
0056B0D0 8B55 E8 mov edx,dword ptr ss:[ebp-0x18]
0056B0D3 8BC7 mov eax,edi
0056B0D5 E8 F294E9FF call ceshi2.004045CC
0056B0DA 43 inc ebx
0056B0DB 4E dec esi
0056B0DC ^ 75 E6 jnz short ceshi2.0056B0C4 (注意这里应该往哪里跳)
0056B0DE 61 popad
0056B0DF ^ E9 AD6EF4FF jmp ceshi2.004B1F91
然后把原来004B1F74这里往下到补写回跳之间全部nop,如下:
004B1F67 8B45 FC mov eax,dword ptr ss:[ebp-0x4]
004B1F6A E8 69FEFFFF call ceshi2.004B1DD8
004B1F6F BE 10000000 mov esi,0x10
004B1F74 E9 2B910B00 jmp ceshi2.0056B0A4 (去执行我补写的代码)
004B1F79 90 nop
004B1F7A 90 nop
004B1F7B 90 nop
004B1F7C 90 nop
004B1F7D 90 nop
004B1F7E 90 nop
004B1F7F 90 nop
004B1F80 90 nop
004B1F81 90 nop
004B1F82 90 nop
004B1F83 90 nop
004B1F84 90 nop
004B1F85 90 nop
004B1F86 90 nop
004B1F87 90 nop
004B1F88 90 nop
004B1F89 90 nop
004B1F8A 90 nop
004B1F8B 90 nop
004B1F8C 90 nop
004B1F8D 90 nop
004B1F8E 90 nop
004B1F8F 90 nop
004B1F90 90 nop
004B1F91 33C0 xor eax,eax (执行完毕后回来的地方)
OK,保存,测试。成功。如图:
作业地址:http://pan.baidu.com/s/1eQ0cPnO
|
免费评分
-
查看全部评分
|