用了接近3个月时间 先学汇编到WIN32 无奈看了几章已经看不下去 实在枯燥 于是就上路了 开始看"加密与解密" 还没看完已经心痒啦 找了这个小东西玩一下 发觉这个东西非常脆弱
操作系统:win2003
工具: OllyDbg ImportREC Fileinfo(FI)
先用FI查看 是UPX1.2的壳 然后用OD打开 已经断点在"00453DF0"处
00453DF0 金> $ 60 pushad ; 壳入口
00453DF1 . BE 00804300 mov esi,金山词霸.00438000
00453DF6 . 8DBE 0090FCFF lea edi,dword ptr ds:[esi+FFFC9000]
00453DFC . 57 push edi
00453DFD . 83CD FF or ebp,FFFFFFFF
00453E00 . EB 10 jmp short 金山词霸.00453E12
00453E02 90 nop
00453E03 90 nop
00453E04 90 nop
00453E05 90 nop
00453E06 90 nop
00453E07 90 nop
00453E08 > 8A06 mov al,byte ptr ds:[esi]
00453E0A . 46 inc esi
00453E0B . 8807 mov byte ptr ds:[edi],al
00453E0D . 47 inc edi
00453E0E > 01DB add ebx,ebx
00453E10 . 75 07 jnz short 金山词霸.00453E19
00453E12 > 8B1E mov ebx,dword ptr ds:[esi]
00453E14 . 83EE FC sub esi,-4
00453E17 . 11DB adc ebx,ebx
00453E19 >^ 72 ED jb short 金山词霸.00453E08 ; 跳转已经实现
00453E1B . B8 01000000 mov eax,1 ; 运行到所选
00453E20 > 01DB add ebx,ebx
00453E22 . 75 07 jnz short 金山词霸.00453E2B
00453E24 . 8B1E mov ebx,dword ptr ds:[esi]
00453E26 . 83EE FC sub esi,-4
00453E29 . 11DB adc ebx,ebx
00453E2B > 11C0 adc eax,eax
00453E2D . 01DB add ebx,ebx
00453E2F . 73 0B jnb short 金山词霸.00453E3C
00453E31 . 75 19 jnz short 金山词霸.00453E4C
00453E33 . 8B1E mov ebx,dword ptr ds:[esi]
00453E35 . 83EE FC sub esi,-4
00453E38 . 11DB adc ebx,ebx
00453E3A . 72 10 jb short 金山词霸.00453E4C
00453E3C > 48 dec eax
00453E3D . 01DB add ebx,ebx
00453E3F . 75 07 jnz short 金山词霸.00453E48
00453E41 . 8B1E mov ebx,dword ptr ds:[esi]
00453E43 . 83EE FC sub esi,-4
00453E46 . 11DB adc ebx,ebx
00453E48 > 11C0 adc eax,eax
00453E4A .^ EB D4 jmp short 金山词霸.00453E20
00453E4C > 31C9 xor ecx,ecx
00453E4E . 83E8 03 sub eax,3
00453E51 . 72 11 jb short 金山词霸.00453E64
00453E53 . C1E0 08 shl eax,8
00453E56 . 8A06 mov al,byte ptr ds:[esi]
00453E58 . 46 inc esi
00453E59 . 83F0 FF xor eax,FFFFFFFF
00453E5C . 74 78 je short 金山词霸.00453ED6
00453E5E . D1F8 sar eax,1
00453E60 . 89C5 mov ebp,eax
00453E62 . EB 0B jmp short 金山词霸.00453E6F
00453E64 > 01DB add ebx,ebx
00453E66 . 75 07 jnz short 金山词霸.00453E6F
00453E68 . 8B1E mov ebx,dword ptr ds:[esi]
00453E6A . 83EE FC sub esi,-4
00453E6D . 11DB adc ebx,ebx
00453E6F > 11C9 adc ecx,ecx
00453E71 . 01DB add ebx,ebx
00453E73 . 75 07 jnz short 金山词霸.00453E7C
00453E75 . 8B1E mov ebx,dword ptr ds:[esi]
00453E77 . 83EE FC sub esi,-4
00453E7A . 11DB adc ebx,ebx
00453E7C > 11C9 adc ecx,ecx
00453E7E . 75 20 jnz short 金山词霸.00453EA0
00453E80 . 41 inc ecx
00453E81 > 01DB add ebx,ebx
00453E83 . 75 07 jnz short 金山词霸.00453E8C
00453E85 . 8B1E mov ebx,dword ptr ds:[esi]
00453E87 . 83EE FC sub esi,-4
00453E8A . 11DB adc ebx,ebx
00453E8C > 11C9 adc ecx,ecx
00453E8E . 01DB add ebx,ebx
00453E90 .^ 73 EF jnb short 金山词霸.00453E81
00453E92 . 75 09 jnz short 金山词霸.00453E9D
00453E94 . 8B1E mov ebx,dword ptr ds:[esi]
00453E96 . 83EE FC sub esi,-4
00453E99 . 11DB adc ebx,ebx
00453E9B .^ 73 E4 jnb short 金山词霸.00453E81
00453E9D > 83C1 02 add ecx,2
00453EA0 > 81FD 00FBFFFF cmp ebp,-500
00453EA6 . 83D1 01 adc ecx,1
00453EA9 . 8D142F lea edx,dword ptr ds:[edi+ebp]
00453EAC . 83FD FC cmp ebp,-4
00453EAF . 76 0F jbe short 金山词霸.00453EC0
00453EB1 > 8A02 mov al,byte ptr ds:[edx]
00453EB3 . 42 inc edx
00453EB4 . 8807 mov byte ptr ds:[edi],al
00453EB6 . 47 inc edi
00453EB7 . 49 dec ecx
00453EB8 .^ 75 F7 jnz short 金山词霸.00453EB1 ; 跳转实现 回跳
00453EBA .^ E9 4FFFFFFF jmp 金山词霸.00453E0E
00453EBF 90 nop
00453EC0 > 8B02 mov eax,dword ptr ds:[edx] ;运行到所选
;(显示屏幕不够大 到这里后往下看 找到00453F5B处会发现壳的出口点)
00453EC2 . 83C2 04 add edx,4
00453EC5 . 8907 mov dword ptr ds:[edi],eax
00453EC7 . 83C7 04 add edi,4
00453ECA . 83E9 04 sub ecx,4
00453ECD .^ 77 F1 ja short 金山词霸.00453EC0
00453ECF . 01CF add edi,ecx
00453ED1 .^ E9 38FFFFFF jmp 金山词霸.00453E0E
00453ED6 > 5E pop esi
00453ED7 . 89F7 mov edi,esi
00453ED9 . B9 A9080000 mov ecx,8A9
00453EDE > 8A07 mov al,byte ptr ds:[edi]
00453EE0 . 47 inc edi
00453EE1 . 2C E8 sub al,0E8
00453EE3 > 3C 01 cmp al,1
00453EE5 .^ 77 F7 ja short 金山词霸.00453EDE
00453EE7 . 803F 11 cmp byte ptr ds:[edi],11
00453EEA .^ 75 F2 jnz short 金山词霸.00453EDE
00453EEC . 8B07 mov eax,dword ptr ds:[edi]
00453EEE . 8A5F 04 mov bl,byte ptr ds:[edi+4]
00453EF1 . 66:C1E8 08 shr ax,8
00453EF5 . C1C0 10 rol eax,10
00453EF8 . 86C4 xchg ah,al
00453EFA . 29F8 sub eax,edi
00453EFC . 80EB E8 sub bl,0E8
00453EFF . 01F0 add eax,esi
00453F01 . 8907 mov dword ptr ds:[edi],eax
00453F03 . 83C7 05 add edi,5
00453F06 . 89D8 mov eax,ebx
00453F08 .^ E2 D9 loopd short 金山词霸.00453EE3
00453F0A . 8DBE 00100500 lea edi,dword ptr ds:[esi+51000]
00453F10 > 8B07 mov eax,dword ptr ds:[edi]
00453F12 . 09C0 or eax,eax
00453F14 . 74 45 je short 金山词霸.00453F5B
00453F16 . 8B5F 04 mov ebx,dword ptr ds:[edi+4]
00453F19 . 8D8430 D4B00500 lea eax,dword ptr ds:[eax+esi+5B0D4]
00453F20 . 01F3 add ebx,esi
00453F22 . 50 push eax
00453F23 . 83C7 08 add edi,8
00453F26 . FF96 B0B10500 call dword ptr ds:[esi+5B1B0]
00453F2C . 95 xchg eax,ebp
00453F2D > 8A07 mov al,byte ptr ds:[edi]
00453F2F . 47 inc edi
00453F30 . 08C0 or al,al
00453F32 .^ 74 DC je short 金山词霸.00453F10
00453F34 . 89F9 mov ecx,edi
00453F36 . 79 07 jns short 金山词霸.00453F3F
00453F38 . 0FB707 movzx eax,word ptr ds:[edi]
00453F3B . 47 inc edi
00453F3C . 50 push eax
00453F3D . 47 inc edi
00453F3E B9 db B9
00453F3F . 57 push edi
00453F40 . 48 dec eax
00453F41 . F2:AE repne scas byte ptr es:[edi]
00453F43 . 55 push ebp
00453F44 . FF96 B4B10500 call dword ptr ds:[esi+5B1B4]
00453F4A . 09C0 or eax,eax
00453F4C . 74 07 je short 金山词霸.00453F55
00453F4E . 8903 mov dword ptr ds:[ebx],eax
00453F50 . 83C3 04 add ebx,4
00453F53 .^ EB D8 jmp short 金山词霸.00453F2D
00453F55 > FF96 B8B10500 call dword ptr ds:[esi+5B1B8]
00453F5B > 61 popad ; 壳的出口点 这里运行到所选
004131C9 . 55 push ebp ;程序入口点
脱好之后其实可以直接使用 IAT表并没有坏 但我用IDA想在慢慢研究的时候 发现IDA扫了很旧也没扫完 而且很多指令都并没有提示 于是我修复一下它的IAT 再用IDA扫
提示出来了 :)
方法: 启动ImportREC----启动未脱壳的金山词霸搜索---选择金山词霸搜索进程---在OEP处输入"131C9"(即程序入口)---Get Imports(获取输入表)---Fix Dump(修复)
由于新手且书也没看完 有待练习 肯定有不足之处 请老师指正
==================================================
下午继续研究这工具 这工具退出后会自动弹出“http://cb.kingsoft.com/pop/cb.php”的连接广告 于是用了两小时去研究 开始研究API 用OD和W32Masm找了非常多次这两个函数“InternetOpenA”和“InternetOpenUrlA” 毫无进展 用Hiew改了又改:)
都怪自己没看完WIN32那本书
最后好是皇天不负有心人 终于找到了两个解决方法:
先用W32Masm搜索"kingsoft" 然后一直找 开始会找到Kingsoft的ID号和版权还有搜索时需要的地址 最后会来到 "00407F08"处 正是广告网站的地址 由于我汇编还不是太纯熟 只好靠OD帮手了 用OD打开来的“00407F08”处
00407EF1 E8 EAA70000 call (单词搜.004126E0
00407EF6 83C4 04 add esp,4 ; 恢复现场
00407EF9 896E 40 mov dword ptr ds:[esi+40],ebp
00407EFC 39AE 90000000 cmp dword ptr ds:[esi+90],ebp ; 比较程序是否被关闭
00407F02 75 15 jnz short (单词搜.00407F19 ; 没有关闭则跳到00407F19处
00407F04 6A 05 push 5
00407F06 55 push ebp
00407F07 55 push ebp
00407F08 68 FC624200 push (单词搜.004262FC ; ASCII "http://cb.kingsoft.com/pop/cb.php"
00407F0D 68 F4624200 push (单词搜.004262F4 ; ASCII "open"
00407F12 55 push ebp
00407F13 FF15 AC214200 call dword ptr ds:[<&shell32.ShellExecuteA>>; shell32.ShellExecuteA
00407F19 5F pop edi
00407F1A 5E pop esi
00407F1B 5D pop ebp
00407F1C 5B pop ebx
00407F1D C3 retn
OD实在太爽了 我加了红色字那里是OD显示出来的
ASCII "http://cb.kingsoft.com/pop/cb.php"表示得到广告地址
然后ASCII "open"是打开连接的意思
这里有两种方法可解决
第一种:将"00407F02"处的“jnz”改为“jz” 直接跳到407F19处 寄存器出栈退出 跳过广告
第二种:只要把ASCII "open"那句NOP掉即可 即把00407F0D处用16进制形式改9090(不过不建议这种方法 第一种感觉是完美的修改 :))
而且第二种方法关闭程序后有点慢 是因为OPEN的前一句是得到网站地址
然后我NOP掉了OPEN之后再寄存器全部出栈 所以内存多了一个工作才关闭
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)