【破解作者】 Anwil
【作者邮箱】 略
【作者主页】 略
【使用工具】 Ollydbg、PEiD、LordPE、ImportREC 1.6
【破解平台】 WinXP
【软件名称】 彩尊圣手黄金版-全国彩票缩水王 V1.50
【下载地址】 http://www3.skycn.com/soft/21727.html
【软件简介】 1、彩尊圣手软件开发既包含了美国强力球技术,又引用了目前国内较流行的算法,在选6型、选7型彩票基础上扩展
开发,包括了原有双色球缩水软件大部分功能,同时引用了本土彩票过滤特征及功能。
2、彩尊圣手支持绝大多数的电脑彩票类型(包括乐透型、传统型、以及双色球、七星彩和金银彩、全国福彩3D),对
于数字型缩水建立高效快速模型,应用七星彩选号,游刃有余,同时针对10月上市的福彩3D,彩尊圣手缩水王已
全部覆盖3D彩票中奖范围
3、“历史数据”具有网络自动更新功能,直接连接服务器阵列(4台双U主机),可实现鼠标单键更新,开奖信息实
现第一时间播报,彩民更新数据只需几秒,并可同时为28000名用户提供数据下载服务。彩尊圣手软件目前内置的
开奖数据库增加至100多种,几乎覆盖所有彩种。各种彩票、大奖小奖一律通吃。支持彩包括:双色球、七星彩、
金银彩、福彩3D、各种选5、选7、数字型彩票及全国所有开放体彩、福彩彩票。
4、“走势分布”和“曲线轨迹”图表使得近期彩票走势一目了然,图表包含数十种分析参数,全方位剖析彩票走势,
可以对下期彩票号码进行预测和调整,号码预测包含了许多算法,特别增强了图形分析走势号码预测。
5、“数值统计”包含每期总和、平均值、AC值、余数、奇偶比、大小比、重号、连号等的分析以及近期每个号码出
现次数、重号和连号次数的统计,是您参考的绝佳选择。
6、“过滤缩水”功能为彩尊圣手软件内部核心,软件引用了历史数据分析过滤模型,借鉴了国外领先号码优化技术
“聪明组合”,彩民在投注中配软件分析过滤过能,可帮助大大优化号码数量,杀掉垃圾注,保留住中奖号码,
实现小额投注中奖的真正目的。软件考虑到彩民操作步骤清晰程度,可自动记忆每一步过滤操作,高效快速,号
码过滤缩水支持传统型和数字型。软件缩水技术的精髓融入华彩网专家的分析策略和独特的运算公式(余数过滤
历史数据过滤 条件过滤 间距过滤 特殊过滤分组过滤)同时可实现目前最流行的双色球中5保6、中4保6玩法。
7、可增加彩票种类,根据不同地区新发行彩票逐渐增加数据库。
8、软件升级可根据彩种及时调整,并可增加插件,提供下载。
【软件大小】 3423 KB
【加壳方式】 Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
【脱壳过程】
虽说是Armadillo的低版壳,但还是值得研究,也能对了解高版本的Armadillo壳打下基础,没什么技术含量,海涵海涵!
设置Ollydbg忽略所有的异常选项,用IsDebug 1.4插件去掉Ollydbg的调试器标志。
004C9B19 c>/$ 55 push ebp ; 进入OD后停在这里
004C9B1A |. 8BEC mov ebp,esp
004C9B1C |. 6A FF push -1
004C9B1E |. 68 385A4E00 push czssgold.004E5A38
004C9B23 |. 68 00954C00 push czssgold.004C9500 ; SE handler installation
004C9B28 |. 64:A1 00000000 mov eax,dword ptr fs:[0]
004C9B2E |. 50 push eax
一、变换双进程,使程序把自己当成子进程运行
下断:BP OpenMutexA,F9运行
77E62391 k> 55 push ebp ; 断在这里,留意堆栈变化
77E62392 8BEC mov ebp,esp
77E62394 51 push ecx
77E62395 51 push ecx
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
0012F59C 004B5F8D /CALL 到 OpenMutexA 来自 czssgold.004B5F87
0012F5A0 001F0001 |Access = 1F0001
0012F5A4 00000000 |Inheritable = FALSE
0012F5A8 0012FBDC \MutexName = "ED0::DA61B9CD17" ; 注意0012FBDC
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
Ctrl+G输入401000,来到以下空代码地址
00401000 0000 add byte ptr ds:[eax],al
00401002 0000 add byte ptr ds:[eax],al
00401004 0000 add byte ptr ds:[eax],al
00401006 0000 add byte ptr ds:[eax],al
00401008 0000 add byte ptr ds:[eax],al
0040100A 0000 add byte ptr ds:[eax],al
0040100C 0000 add byte ptr ds:[eax],al
0040100E 0000 add byte ptr ds:[eax],al
00401010 0000 add byte ptr ds:[eax],al
00401012 0000 add byte ptr ds:[eax],al
键入欺骗代码
00401000 60 pushad
00401001 9C pushfd
00401002 68 DCFB1200 push 12FBDC ; 堆栈里看到的值
00401007 33C0 xor eax,eax
00401009 50 push eax
0040100A 50 push eax
0040100B E8 B5A6A577 call kernel32.CreateMutexA
00401010 9D popfd
00401011 61 popad
00401012 - E9 7A13A677 jmp kernel32.OpenMutexA
在401000处,右键--->此处新建EIP,即新建起源,F9运行,再次中断在OpenMutexA处,取消该断点,然后返回401000处,撤消
刚才键入的所有代码,ok,序幕结束,游戏刚刚开始... ...
二、避开IAT加密
常听见朋友说Armadillo的壳有时并不难脱,难就难在修复输入表,这次我就针对这输入表修复来进行一轮恶补,希望大家都能及
格,或许大家都能来个漂亮的满分。下面介绍三种避开输入表加密的方法,希望能帮到大家^_^
⑴、方法一
下断:He GetModuleHandleA,F9运行
77E5AD86 k> 837C24 04 00 cmp dword ptr ss:[esp+4],0 ; 断在这里,留意堆栈
77E5AD8B 0F84 37010000 je kernel32.77E5AEC8
77E5AD91 FF7424 04 push dword ptr ss:[esp+4]
77E5AD95 E8 F8050000 call kernel32.77E5B392
在这里中断十五次,然后Alt+F9返回程序,并取消硬件断点
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
0012ECC8 77C059FC /CALL 到 GetModuleHandleA 来自 msvcrt.77C059F6
0012ECCC 77BE31AC \pModule = "kernel32.dll"
0012ECB4 770FB124 /CALL 到 GetModuleHandleA 来自 OLEAUT32.770FB11E
0012ECB8 771722E4 \pModule = "KERNEL32.DLL"
0012ECB0 770FB124 /CALL 到 GetModuleHandleA 来自 OLEAUT32.770FB11E
0012ECB4 771722E4 \pModule = "KERNEL32.DLL"
0012ED8C 772A8663 /CALL 到 GetModuleHandleA 来自 SHLWAPI.772A865D
0012ED90 772AF8FC \pModule = "KERNEL32.DLL"
0012F540 004B50E3 /CALL 到 GetModuleHandleA 来自 czssgold.004B50DD
0012F544 00000000 \pModule = NULL
0012BB20 00CFF65E /CALL 到 GetModuleHandleA 来自 00CFF658
0012BB24 00D10B58 \pModule = "kernel32.dll"
0012BB20 00CFF67B /CALL 到 GetModuleHandleA 来自 00CFF675
0012BB24 00D10B58 \pModule = "kernel32.dll"
0012B898 00CE97CD /CALL 到 GetModuleHandleA 来自 00CE97C7
0012B89C 0012B9D4 \pModule = "kernel32.dll"
0012B898 00CE97CD /CALL 到 GetModuleHandleA 来自 00CE97C7
0012B89C 0012B9D4 \pModule = "user32.dll"
0012B898 00CE97CD /CALL 到 GetModuleHandleA 来自 00CE97C7
0012B89C 0012B9D4 \pModule = "MSVBVM60.DLL"
0012B19C 66001BC5 /CALL 到 GetModuleHandleA 来自 66001BBF
0012B1A0 6600F4D0 \pModule = "kernel32.dll"
0012B190 6600281E /CALL 到 GetModuleHandleA 来自 66002818
0012B194 6600F4FC \pModule = "KERNEL32"
0012B188 660031CE /CALL 到 GetModuleHandleA 来自 660031C8
0012B18C 00000000 \pModule = NULL
0012B898 00CE97CD /CALL 到 GetModuleHandleA 来自 00CE97C7
0012B89C 0012B9D4 \pModule = "advapi32.dll"
0012BB24 00D0416F /CALL 到 GetModuleHandleA 来自 00D04169 ; 返回的时机,GO!
0012BB28 00000000 \pModule = NULL
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
00D04169 FF15 D8B0D000 call dword ptr ds:[D0B0D8] ; kernel32.GetModuleHandleA
00D0416F 3985 C0E4FFFF cmp dword ptr ss:[ebp-1B40],eax ; 返回到这里
00D04175 75 0F jnz short 00D04186
00D04177 C785 BCE4FFFF 98F9D000 mov dword ptr ss:[ebp-1B44],0D0F998
00D04181 E9 C4000000 jmp 00D0424A
00D04186 83A5 98E2FFFF 00 and dword ptr ss:[ebp-1D68],0
00D0418D C785 94E2FFFF C0FFD000 mov dword ptr ss:[ebp-1D6C],0D0FFC0
00D04197 EB 1C jmp short 00D041B5
00D04199 8B85 94E2FFFF mov eax,dword ptr ss:[ebp-1D6C]
00D0419F 83C0 0C add eax,0C
00D041A2 8985 94E2FFFF mov dword ptr ss:[ebp-1D6C],eax
00D041A8 8B85 98E2FFFF mov eax,dword ptr ss:[ebp-1D68]
00D041AE 40 inc eax
00D041AF 8985 98E2FFFF mov dword ptr ss:[ebp-1D68],eax
00D041B5 8B85 94E2FFFF mov eax,dword ptr ss:[ebp-1D6C]
00D041BB 8338 00 cmp dword ptr ds:[eax],0
00D041BE 0F84 86000000 je 00D0424A ; Magic Jump
00D041C4 8B85 94E2FFFF mov eax,dword ptr ss:[ebp-1D6C]
00D041CA 8B40 08 mov eax,dword ptr ds:[eax+8]
00D041CD 83E0 01 and eax,1
1、找到Magic Jump ,只要将je改为jmp,就能得到正确的输入表
00D041BE 0F84 86000000 je 00D0424A
改为:
00D041BE EB84 86000000 jmp 00D0424A
2、Ctrl+F在当前位置查找命令:salc,当看到jmp、salc、salc代码连在一起时,OK,这就是IAT解密已经完成的地方。
00D04883 59 pop ecx
00D04884 EB 03 jmp short 00D04889 ; 此处下断
00D04886 D6 salc
00D04887 D6 salc
程序在下面会依据原先的代码进行解码,如没有修改原代码,则解码正确。而直接修改Magic Jump后改变了原先的代码,导致解码不
正确而异常出错!所以我们在00D04884 断下后,应该恢复原先Magic Jump的代码,返回原来的地方,则00D041BE处,右键->“撤销
选择”则可。现在解码就不会出错了。
⑵、方法二
下断:He GetModuleHandleA,F9运行
77E5AD86 k> 837C24 04 00 cmp dword ptr ss:[esp+4],0 ; 断在这里,留意堆栈
77E5AD8B 0F84 37010000 je kernel32.77E5AEC8
77E5AD91 FF7424 04 push dword ptr ss:[esp+4]
77E5AD95 E8 F8050000 call kernel32.77E5B392
在这里中断八次,然后Alt+F9返回程序,并取消硬件断点
∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮
0012ECC8 77C059FC /CALL 到 GetModuleHandleA 来自 msvcrt.77C059F6
0012ECCC 77BE31AC \pModule = "kernel32.dll"
0012ECD0 77C2CA20 msvcrt.77C2CA20
0012ECB4 770FB124 /CALL 到 GetModuleHandleA 来自 OLEAUT32.770FB11E
0012ECB8 771722E4 \pModule = "KERNEL32.DLL"
0012ECBC 770FAD56 返回到 OLEAUT32.770FAD56 来自 OLEAUT32.770FB119
0012ECB0 770FB124 /CALL 到 GetModuleHandleA 来自 OLEAUT32.770FB11E
0012ECB4 771722E4 \pModule = "KERNEL32.DLL"
0012ECB8 770FADAC 返回到 OLEAUT32.770FADAC 来自 OLEAUT32.770FB119
0012ED8C 772A8663 /CALL 到 GetModuleHandleA 来自 SHLWAPI.772A865D
0012ED90 772AF8FC \pModule = "KERNEL32.DLL"
0012ED94 00000000
0012F540 004B50E3 /CALL 到 GetModuleHandleA 来自 czssgold.004B50DD
0012F544 00000000 \pModule = NULL
0012F548 00000000
0012BB20 00CFF65E /CALL 到 GetModuleHandleA 来自 00CFF658
0012BB24 00D10B58 \pModule = "kernel32.dll"
0012BB28 00D11BB4 ASCII "VirtualAlloc"
0012BB20 00CFF67B /CALL 到 GetModuleHandleA 来自 00CFF675
0012BB24 00D10B58 \pModule = "kernel32.dll"
0012BB28 00D11BA8 ASCII "VirtualFree"
0012B898 00CE97CD /CALL 到 GetModuleHandleA 来自 00CE97C7 ; 返回的时机,GO!
0012B89C 0012B9D4 \pModule = "kernel32.dll"
0012B8A0 0012EB14
∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮∮
00CE97C7 FF15 D8B0D000 call dword ptr ds:[D0B0D8] ; kernel32.GetModuleHandleA
00CE97CD 8B0D A04CD100 mov ecx,dword ptr ds:[D14CA0] ; 返回到这里
00CE97D3 89040E mov dword ptr ds:[esi+ecx],eax
00CE97D6 A1 A04CD100 mov eax,dword ptr ds:[D14CA0]
00CE97DB 393C06 cmp dword ptr ds:[esi+eax],edi
00CE97DE 75 16 jnz short 00CE97F6
00CE97E0 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
00CE97E6 50 push eax
00CE97E7 FF15 E0B0D000 call dword ptr ds:[D0B0E0] ; kernel32.LoadLibraryA
00CE97ED 8B0D A04CD100 mov ecx,dword ptr ds:[D14CA0]
00CE97F3 89040E mov dword ptr ds:[esi+ecx],eax
00CE97F6 A1 A04CD100 mov eax,dword ptr ds:[D14CA0]
00CE97FB 393C06 cmp dword ptr ds:[esi+eax],edi
00CE97FE 0F84 AD000000 je 00CE98B1 ; Magic Jump
00CE9804 33C9 xor ecx,ecx
00CE9806 8B03 mov eax,dword ptr ds:[ebx]
直接改00CE97FE jmp 00CE98B1,此时修改代码也非常的容易、方便,更不需要在IAT处理结束后再还原代码了。
⑶、方法三
嘿嘿,比较多余,充其量只是玩玩,就算是多一种认识Armadillo壳脱法的机会吧。这也是继方法二之后的事了,废话少说,GO!
来到上面的Magic Jump那里……
00CE97C7 FF15 D8B0D000 call dword ptr ds:[D0B0D8] ; kernel32.GetModuleHandleA
00CE97CD 8B0D A04CD100 mov ecx,dword ptr ds:[D14CA0]
00CE97D3 89040E mov dword ptr ds:[esi+ecx],eax
00CE97D6 A1 A04CD100 mov eax,dword ptr ds:[D14CA0]
00CE97DB 393C06 cmp dword ptr ds:[esi+eax],edi
00CE97DE 75 16 jnz short 00CE97F6
00CE97E0 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
00CE97E6 50 push eax
00CE97E7 FF15 E0B0D000 call dword ptr ds:[D0B0E0] ; kernel32.LoadLibraryA
00CE97ED 8B0D A04CD100 mov ecx,dword ptr ds:[D14CA0]
00CE97F3 89040E mov dword ptr ds:[esi+ecx],eax
00CE97F6 A1 A04CD100 mov eax,dword ptr ds:[D14CA0]
00CE97FB 393C06 cmp dword ptr ds:[esi+eax],edi
00CE97FE 0F84 AD000000 je 00CE98B1 ; Magic Jump,在这里中断3次
00CE9804 33C9 xor ecx,ecx
00CE9806 8B03 mov eax,dword ptr ds:[ebx]
在00CE97FE处,右键--->断点--->"硬断点,执行时",这次是不改je为jmp,而是每次断下后改标志Z=1,改Z=1,使其JMP,就能得
到未被破坏的输入表了.
其实Armadillo壳的Magic Jump有时不止一个,就看你怎么利用了... ...
三、寻找OEP
因为上面有三种方法,所以到底OEP也有几种方法,别心急,FOLLOW ME!
㈠、这是继方法一之后的事
下断bp GetCurrentThreadId,F9运行
77E5A7DF k> 64:A1 18000000 mov eax,dword ptr fs:[18] ; 断在这里,留意堆栈
77E5A7E5 8B40 24 mov eax,dword ptr ds:[eax+24]
77E5A7E8 C3 retn
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
0012F594 00D07245 /CALL 到 GetCurrentThreadId 来自 00D0723F ; 返回的时机,GO!
0012F598 0012FF2C
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
在这里中断一次,然后Alt+F9返回程序
00D07245 A3 8091D100 mov dword ptr ds:[D19180],eax ; 停在这里
00D0724A E8 6E28FEFF call 00CE9ABD
00D0724F 6A 00 push 0
00D07251 E8 B981FEFF call 00CEF40F
00D07256 6A 00 push 0
00D07258 C705 7810D100 041CD100 mov dword ptr ds:[D11078],0D11C04 ; ASCII "RC"
00D07262 E8 CB22FEFF call 00CE9532
00D07267 59 pop ecx
00D07268 59 pop ecx
00D07269 E8 310AFFFF call 00CF7C9F
00D0726E 8BF8 mov edi,eax
00D07270 A1 6890D100 mov eax,dword ptr ds:[D19068]
00D07275 8B48 54 mov ecx,dword ptr ds:[eax+54]
00D07278 3348 50 xor ecx,dword ptr ds:[eax+50]
00D0727B 3348 34 xor ecx,dword ptr ds:[eax+34]
00D0727E 03F9 add edi,ecx
00D07280 8B0E mov ecx,dword ptr ds:[esi]
00D07282 85C9 test ecx,ecx
00D07284 75 2F jnz short 00D072B5 ; 跳
00D07286 8B78 50 mov edi,dword ptr ds:[eax+50]
00D07289 E8 110AFFFF call 00CF7C9F
00D0728E 8B0D 6890D100 mov ecx,dword ptr ds:[D19068] ; czssgold.004E02A0
00D07294 FF76 14 push dword ptr ds:[esi+14]
00D07297 8B51 54 mov edx,dword ptr ds:[ecx+54]
00D0729A FF76 10 push dword ptr ds:[esi+10]
00D0729D 3351 34 xor edx,dword ptr ds:[ecx+34]
00D072A0 FF76 0C push dword ptr ds:[esi+C]
00D072A3 33D7 xor edx,edi
00D072A5 03C2 add eax,edx
00D072A7 8B51 30 mov edx,dword ptr ds:[ecx+30]
00D072AA 3351 20 xor edx,dword ptr ds:[ecx+20]
00D072AD 33D7 xor edx,edi
00D072AF 2BC2 sub eax,edx
00D072B1 FFD0 call eax
00D072B3 EB 25 jmp short 00D072DA
00D072B5 83F9 01 cmp ecx,1
00D072B8 75 22 jnz short 00D072DC
00D072BA FF76 04 push dword ptr ds:[esi+4]
00D072BD FF76 08 push dword ptr ds:[esi+8]
00D072C0 6A 00 push 0
00D072C2 E8 D809FFFF call 00CF7C9F
00D072C7 50 push eax
00D072C8 A1 6890D100 mov eax,dword ptr ds:[D19068]
00D072CD 8B48 50 mov ecx,dword ptr ds:[eax+50]
00D072D0 3348 30 xor ecx,dword ptr ds:[eax+30]
00D072D3 3348 20 xor ecx,dword ptr ds:[eax+20]
00D072D6 2BF9 sub edi,ecx
00D072D8 FFD7 call edi ; 抵达OEP,F7进入
00D072DA 8BD8 mov ebx,eax
00D072DC 5F pop edi
00D072DD 8BC3 mov eax,ebx
00D072DF 5E pop esi
00D072E0 5B pop ebx
00D072E1 C3 retn
㈡、这是继方法二之后的事
下断bp GetCurrentThreadId,F9运行
77E5A7DF k> 64:A1 18000000 mov eax,dword ptr fs:[18] ; 断在这里,留意堆栈
77E5A7E5 8B40 24 mov eax,dword ptr ds:[eax+24]
77E5A7E8 C3 retn
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
0012B198 66001E3A /CALL 到 GetCurrentThreadId 来自 66001E34
0012B19C 00000001
0012B178 66003505 /CALL 到 GetCurrentThreadId 来自 660034FF
0012B17C 00000000
0012B3F4 761736A1 /CALL 到 GetCurrentThreadId 来自 WININET.7617369B
0012B3F8 00000000
0012F594 00D07245 /CALL 到 GetCurrentThreadId 来自 00D0723F ; 返回的时机,GO!
0012F598 0012FF2C
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
在这里中断四次,然后Alt+F9返回程序
00D07245 A3 8091D100 mov dword ptr ds:[D19180],eax ; 停在这里
00D0724A E8 6E28FEFF call 00CE9ABD
00D0724F 6A 00 push 0
00D07251 E8 B981FEFF call 00CEF40F
00D07256 6A 00 push 0
00D07258 C705 7810D100 041CD100 mov dword ptr ds:[D11078],0D11C04 ; ASCII "RC"
00D07262 E8 CB22FEFF call 00CE9532
00D07267 59 pop ecx
00D07268 59 pop ecx
00D07269 E8 310AFFFF call 00CF7C9F
00D0726E 8BF8 mov edi,eax
00D07270 A1 6890D100 mov eax,dword ptr ds:[D19068]
00D07275 8B48 54 mov ecx,dword ptr ds:[eax+54]
00D07278 3348 50 xor ecx,dword ptr ds:[eax+50]
00D0727B 3348 34 xor ecx,dword ptr ds:[eax+34]
00D0727E 03F9 add edi,ecx
00D07280 8B0E mov ecx,dword ptr ds:[esi]
00D07282 85C9 test ecx,ecx
00D07284 75 2F jnz short 00D072B5
00D07286 8B78 50 mov edi,dword ptr ds:[eax+50]
00D07289 E8 110AFFFF call 00CF7C9F
00D0728E 8B0D 6890D100 mov ecx,dword ptr ds:[D19068] ; czssgold.004E02A0
00D07294 FF76 14 push dword ptr ds:[esi+14]
00D07297 8B51 54 mov edx,dword ptr ds:[ecx+54]
00D0729A FF76 10 push dword ptr ds:[esi+10]
00D0729D 3351 34 xor edx,dword ptr ds:[ecx+34]
00D072A0 FF76 0C push dword ptr ds:[esi+C]
00D072A3 33D7 xor edx,edi
00D072A5 03C2 add eax,edx
00D072A7 8B51 30 mov edx,dword ptr ds:[ecx+30]
00D072AA 3351 20 xor edx,dword ptr ds:[ecx+20]
00D072AD 33D7 xor edx,edi
00D072AF 2BC2 sub eax,edx
00D072B1 FFD0 call eax
00D072B3 EB 25 jmp short 00D072DA
00D072B5 83F9 01 cmp ecx,1
00D072B8 75 22 jnz short 00D072DC
00D072BA FF76 04 push dword ptr ds:[esi+4]
00D072BD FF76 08 push dword ptr ds:[esi+8]
00D072C0 6A 00 push 0
00D072C2 E8 D809FFFF call 00CF7C9F
00D072C7 50 push eax
00D072C8 A1 6890D100 mov eax,dword ptr ds:[D19068]
00D072CD 8B48 50 mov ecx,dword ptr ds:[eax+50]
00D072D0 3348 30 xor ecx,dword ptr ds:[eax+30]
00D072D3 3348 20 xor ecx,dword ptr ds:[eax+20]
00D072D6 2BF9 sub edi,ecx
00D072D8 FFD7 call edi ; 根据地在现,F7进入吧
00D072DA 8BD8 mov ebx,eax
00D072DC 5F pop edi
00D072DD 8BC3 mov eax,ebx
00D072DF 5E pop esi
00D072E0 5B pop ebx
00D072E1 C3 retn
㈢、这是继方法三之后的事
下断bp GetCurrentThreadId,F9运行
77E5A7DF k> 64:A1 18000000 mov eax,dword ptr fs:[18] ; 停在这里
77E5A7E5 8B40 24 mov eax,dword ptr ds:[eax+24]
77E5A7E8 C3 retn
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
0012B3F4 761736A1 /CALL 到 GetCurrentThreadId 来自 WININET.7617369B
0012B3F8 00000000
0012F594 00D07245 /CALL 到 GetCurrentThreadId 来自 00D0723F ; 返回的时机,GO!
0012F598 0012FF2C
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
在这里中断二次,然后Alt+F9返回程序,之后怎么去到OEP可以参考以上两例,我们直接进入下一个环节。
㈣、用内存断点大法直抵OEP
以上三种方法都可以直接用内存断点大法直抵OEP,这个方法确实很实在,也很好用,省了很多不必要的麻烦。
Alt+M 查看内存,在401000开始的段上 下内存访问断点,F9运行
0043DC0D 6A 60 push 60 ; 红色代码,呵呵,直达船,爽!
0043DC0F 68 40A04800 push czssgold.0048A040
0043DC14 E8 BB0C0000 call czssgold.0043E8D4
0043DC19 BF 94000000 mov edi,94
0043DC1E 8BC7 mov eax,edi
0043DC20 E8 DBF0FFFF call czssgold.0043CD00
0043DC25 8965 E8 mov dword ptr ss:[ebp-18],esp
0043DC28 8BF4 mov esi,esp
0043DC2A 893E mov dword ptr ds:[esi],edi
0043DC2C 56 push esi
0043DC2D FF15 04944700 call dword ptr ds:[479404] ; kernel32.GetVersionExA
只要来到这里,就代表胜利之神已降临在我们身边了,继续努力,GO!
四、dumper、修复输入表和优化
这个很容易了,不用我讲大家都会做得比我好,可省我很多口水 :)
0043DC0D 6A 60 push 60 ; 在这儿用LordPE纠正ImageSize
后完全DUMP这个进程
0043DC0F 68 40A04800 push czssgold.0048A040
0043DC14 E8 BB0C0000 call czssgold.0043E8D4
0043DC19 BF 94000000 mov edi,94
0043DC1E 8BC7 mov eax,edi
0043DC20 E8 DBF0FFFF call czssgold.0043CD00
0043DC25 8965 E8 mov dword ptr ss:[ebp-18],esp
0043DC28 8BF4 mov esi,esp
0043DC2A 893E mov dword ptr ds:[esi],edi
0043DC2C 56 push esi
0043DC2D FF15 04944700 call dword ptr ds:[479404] ; kernel32.GetVersionExA
0043DC33 8B4E 10 mov ecx,dword ptr ds:[esi+10]
0043DC36 890D 60DD4900 mov dword ptr ds:[49DD60],ecx
0043DC3C 8B46 04 mov eax,dword ptr ds:[esi+4]
0043DC3F A3 6CDD4900 mov dword ptr ds:[49DD6C],eax
0043DC44 8B56 08 mov edx,dword ptr ds:[esi+8]
0043DC47 8915 70DD4900 mov dword ptr ds:[49DD70],edx
0043DC4D 8B76 0C mov esi,dword ptr ds:[esi+C]
运行ImportREC 1.6,选择这个进程。把OEP改为0003DC0D,点IT AutoSearch,有少数无用的函数,点Show Invalid全部选中,然后右
键--->Trace Level1(Disasm)修复大部分,然后剩下的都是无用的东东哦,CUT掉无效函数,FixDump,正常运行!用LordPE删除text1
和其下的adata、data1、pdata共4个区段,然后再用LordPE重建PE,程序就精简了不少。
【后记】其实Armadillo的壳还有两个地方值得关注一下:
1.用以上方法无法正确找到输入表加密的切入点;
2.如果加了Armadillo壳的软件已经过期,那该怎么处理。
如果找到合适的机会我会在再来详细说明一下。,本来这文章昨天就应该做好的,无奈于BOSS,和他的机会朋友居然来“暗黑破坏
神”,加上家里的电脑突然爆毙,所以拖到今天,现在又要去和BOSS们联机去玩暗黑了,呵呵,闪咯... ...
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)