OllyDbg 使用笔记 (十六)
参考
书:《加密与解密》
视频:小甲鱼 解密系列 视频
示例程序下载地址:http://pan.baidu.com/s/1qWDJyiw
Resource Hacker下载地址:http://www.angusj.com/resourcehacker/reshack_cn_3.6.0.exe
此程序运行进行后有一个nag窗口,可以从这个nag窗口人手,用Resource Hacker这个软件查找这个nag的hInstance
图片1
图片2
可以知道这个nag窗口的hInstance为100(十进制),把程序加载到OD,搜索push 0x64
图片3
再所有push 0x64上下断点。运行程序,找到是产生nag窗口的那个call。删除其它断点。观察这个call 的前面的代码,可以发 je short 0040672E 可以跳过这个call,而决定这个 je 跳不跳的是 call 00431650
图片4
在 call 00431650上面下断点,重新运行程序,进入call 00431650,查看代码
00431650 /$ 81EC D0000000 sub esp, 0D0 00431656 |. 8D4424 00 lea eax, dword ptr [esp] 0043165A |. 53 push ebx 0043165B |. 56 push esi 0043165C |. 57 push edi 0043165D |. 50 push eax ; /pHandle 0043165E |. 68 19000200 push 20019 ; |Access = KEY_READ 00431663 |. 6A 00 push 0 ; |Reserved = 0 00431665 |. 68 F8B34400 push 0044B3F8 ; |Subkey = "Software\gamani\GIFMovieGear\2.0" 0043166A |. 68 01000080 push 80000001 ; |hKey = HKEY_CURRENT_USER 0043166F |. 83CB FF or ebx, FFFFFFFF ; | 00431672 |. FF15 04804400 call dword ptr [<&ADVAPI32.RegOpenKey>; \RegOpenKeyExA 00431678 |. 85C0 test eax, eax 0043167A |. 0F85 C2000000 jnz 00431742 00431680 |. 8D4C24 10 lea ecx, dword ptr [esp+10] 00431684 |. 8B35 08804400 mov esi, dword ptr [<&ADVAPI32.RegQu>; ADVAPI32.RegQueryValueExA 0043168A |. 8D5424 14 lea edx, dword ptr [esp+14] 0043168E |. 51 push ecx ; /pBufSize 0043168F |. 52 push edx ; |Buffer 00431690 |. 50 push eax ; |pValueType 00431691 |. 50 push eax ; |Reserved 00431692 |. 8B4424 1C mov eax, dword ptr [esp+1C] ; | 00431696 |. BF 64000000 mov edi, 64 ; | 0043169B |. 68 98D44400 push 0044D498 ; |ValueName = "RegName3" 004316A0 |. 50 push eax ; |hKey 004316A1 |. 897C24 28 mov dword ptr [esp+28], edi ; | 004316A5 |. FFD6 call esi ; \RegQueryValueExA 004316A7 |. 85C0 test eax, eax 004316A9 |. 0F85 93000000 jnz 00431742 004316AF |. 8D4C24 10 lea ecx, dword ptr [esp+10] 004316B3 |. 8D5424 78 lea edx, dword ptr [esp+78] 004316B7 |. 51 push ecx ; /pBufSize 004316B8 |. 52 push edx ; |Buffer 004316B9 |. 50 push eax ; |pValueType 004316BA |. 50 push eax ; |Reserved 004316BB |. 8B4424 1C mov eax, dword ptr [esp+1C] ; | 004316BF |. 68 A4D44400 push 0044D4A4 ; |ValueName = "RegCode3" 004316C4 |. 50 push eax ; |hKey 004316C5 |. 897C24 28 mov dword ptr [esp+28], edi ; | 004316C9 |. FFD6 call esi ; \RegQueryValueExA 004316CB |. 85C0 test eax, eax 004316CD |. 75 73 jnz short 00431742 004316CF |. 8D4C24 78 lea ecx, dword ptr [esp+78] 004316D3 |. 8D5424 14 lea edx, dword ptr [esp+14] 004316D7 |. 51 push ecx 004316D8 |. 52 push edx 004316D9 |. E8 B2FEFFFF call 00431590 004316DE |. 83C4 08 add esp, 8 004316E1 |. 85C0 test eax, eax 004316E3 |. 74 5D je short 00431742 004316E5 |. 8B9424 E00000>mov edx, dword ptr [esp+E0] 004316EC |. BB 01000000 mov ebx, 1 004316F1 |. 85D2 test edx, edx 004316F3 |. 74 21 je short 00431716 004316F5 |. 8D7C24 14 lea edi, dword ptr [esp+14] 004316F9 |. 83C9 FF or ecx, FFFFFFFF 004316FC |. 33C0 xor eax, eax 004316FE |. F2:AE repne scas byte ptr es:[edi] 00431700 |. F7D1 not ecx 00431702 |. 2BF9 sub edi, ecx 00431704 |. 8BC1 mov eax, ecx 00431706 |. 8BF7 mov esi, edi 00431708 |. 8BFA mov edi, edx 0043170A |. C1E9 02 shr ecx, 2 0043170D |. F3:A5 rep movs dword ptr es:[edi], dword p> 0043170F |. 8BC8 mov ecx, eax 00431711 |. 83E1 03 and ecx, 3 00431714 |. F3:A4 rep movs byte ptr es:[edi], byte ptr> 00431716 |> 8B9424 E40000>mov edx, dword ptr [esp+E4] 0043171D |. 85D2 test edx, edx 0043171F |. 74 21 je short 00431742 00431721 |. 8D7C24 78 lea edi, dword ptr [esp+78] 00431725 |. 83C9 FF or ecx, FFFFFFFF 00431728 |. 33C0 xor eax, eax 0043172A |. F2:AE repne scas byte ptr es:[edi] 0043172C |. F7D1 not ecx 0043172E |. 2BF9 sub edi, ecx 00431730 |. 8BC1 mov eax, ecx 00431732 |. 8BF7 mov esi, edi 00431734 |. 8BFA mov edi, edx 00431736 |. C1E9 02 shr ecx, 2 00431739 |. F3:A5 rep movs dword ptr es:[edi], dword p> 0043173B |. 8BC8 mov ecx, eax 0043173D |. 83E1 03 and ecx, 3 00431740 |. F3:A4 rep movs byte ptr es:[edi], byte ptr> 00431742 |> 8B4C24 0C mov ecx, dword ptr [esp+C] 00431746 |. 51 push ecx ; /hKey 00431747 |. FF15 00804400 call dword ptr [<&ADVAPI32.RegCloseKe>; \RegCloseKey 0043174D 5F pop edi 0043174E 8BC3 mov eax, ebx 00431750 5E pop esi 00431751 5B pop ebx 00431752 81C4 D0000000 add esp, 0D0 00431758 \. C3 retn
可以发现这个函数是用来读取注册表中的name和key来通过call 00431590来判断name和key是否正确。
我们可以在函数结尾的mov eax, ebx 改成 mov al,1 来破解 (不可以改成mov eax,1因为mov eax,1占用5个字节,改后会覆盖后面的代码)