手脱某炒股软件Armadillo(穿山甲)壳分析
程序员文章站
2022-07-05 23:30:57
by lchhome
1、首先用PEID查壳为Armadillo4.4x的壳,而且是双进程壳。
2、用OD忽略所有异常,隐藏OD,载入程序 在命令行下bp OpenMutexA 断点,...
by lchhome
1、首先用PEID查壳为Armadillo4.4x的壳,而且是双进程壳。
2、用OD忽略所有异常,隐藏OD,载入程序 在命令行下bp OpenMutexA 断点,Shift+ F9中断如下:
7C80EABB > 8BFF mov edi, edi 中断在这里
7C80EABD 55 push ebp
7C80EABE 8BEC mov ebp, esp
7C80EAC0 51 push ecx
7C80EAC1 51 push ecx
7C80EAC2 837D 10 00 cmp dword ptr [ebp+10], 0
7C80EAC6 56 push esi
7C80EAC7 0F84 A7550300 je 7C844074
我们再CTRL+G 输入00401000,来到这里
然后我们在下面的空白地址填入下面的数值
00401000 60 pushad
00401001 9C pushfd
00401002 68 A0FD1200 push 12FDA0 注意; ASCII " 8E8::DA113A5A09"
00401007 33C0 xor eax,eax
00401009 50 push eax
0040100A 50 push eax
0040100B E8 CFD9407C call KERNEL32.CreateMutexA
00401010 9D popfd
00401011 61 popad
00401012 - E9 A4DA407C jmp KERNEL32.OpenMutexA
全部填完后我们把他们全选上 在 此处新建EIP F9 中断后 取消断点 在CTRL+G 输入00401000,然后就撤销选择处修改, 此时我们的双变单就完成了。
3、避开Anti (Armadillo到了4X以后OD多了一个漏洞 )
he OutputDebugStringA,中断2次!,选中%s%之类的字符,点右键“数据窗口中跟随”->二进制->使用00填充,然后在”调试”工具栏中删除此硬件断点!
4、这一步就和我们单进程脱壳一样了, 下he GetModuleHandleA 断点,F9运行,找返回时机。这里给大家说个技巧,当出现"VirtualAlloc" "VirtualFree"后,再出现"kernel32.dll",就
是我们的返回时机。在”调试”工具栏中删除此硬件断点,Alt+F9返回以下程序
01C759E3 8B0D 6C50CA01 mov ecx, dword ptr [1CA506C] 返回在此
01C759E9 89040E mov dword ptr [esi+ecx], eax
01C759EC A1 6C50CA01 mov eax, dword ptr [1CA506C]
01C759F1 391C06 cmp dword ptr [esi+eax], ebx
01C759F4 75 16 jnz short 01C75A0C
01C759F6 8D85 B4FEFFFF lea eax, dword ptr [ebp-14C]
01C759FC 50 push eax
01C759FD FF15 B862C901 call dword ptr [1C962B8] ; kernel32.LoadLibraryA
01C75A03 8B0D 6C50CA01 mov ecx, dword ptr [1CA506C]
01C75A09 89040E mov dword ptr [esi+ecx], eax
01C75A0C A1 6C50CA01 mov eax, dword ptr [1CA506C]
01C75A11 391C06 cmp dword ptr [esi+eax], ebx
01C75A14 0F84 2F010000 je 01C75B49 单步走到这,修改JMP,跳走
01C75A1A 33C9 xor ecx, ecx
01C75A1C 8B07 mov eax, dword ptr [edi]
01C75A1E 3918 cmp dword ptr [eax], ebx
01C75A20 74 06 je short 01C75A28
01C75A22 41 inc ecx
01C75A23 83C0 0C add eax, 0C
01C75A26 ^ EB F6 jmp short 01C75A1E
01C75B49 83C7 0C add edi, 0C 跳到这里www.2cto.com
01C75B4C 89BD 78FDFFFF mov dword ptr [ebp-288], edi
01C75B52 83C6 04 add esi, 4
01C75B55 395F FC cmp dword ptr [edi-4], ebx
01C75B58 ^ 0F85 49FEFFFF jnz 01C759A7
01C75B5E EB 03 jmp short 01C75B63
Alt+M,打开内存镜像在00401000处F2下断,F9运行断下, 我们单步走 如下01C9026B 8B0C3A mov ecx, dword ptr [edx+edi] 断在这里
01C9026E 5B pop ebx
01C9026F 03D7 add edx, edi
01C90271 A1 A410CA01 mov eax, dword ptr [1CA10A4]
01C90276 3148 58 xor dword ptr [eax+58], ecx
01C90279 A1 A410CA01 mov eax, dword ptr [1CA10A4]
01C9027E 3148 58 xor dword ptr [eax+58], ecx
01C90281 A1 A410CA01 mov eax, dword ptr [1CA10A4]
01C90286 8B16 mov edx, dword ptr [esi]
01C90288 8B88 84000000 mov ecx, dword ptr [eax+84]
01C9028E 3348 78 xor ecx, dword ptr [eax+78]
01C90291 3348 10 xor ecx, dword ptr [eax+10]
01C90294 030D BC10CA01 add ecx, dword ptr [1CA10BC] ; ql.00400000
01C9029A 85D2 test edx, edx
01C9029C 75 1A jnz short 01C902B8
01C9029E 8B90 84000000 mov edx, dword ptr [eax+84]
01C902A4 FF76 18 push dword ptr [esi+18]
01C902A7 3350 68 xor edx, dword ptr [eax+68]
01C902AA FF76 14 push dword ptr [esi+14]
01C902AD 3310 xor edx, dword ptr [eax]
01C902AF FF76 10 push dword ptr [esi+10]
01C902B2 2BCA sub ecx, edx
01C902B4 FFD1 call ecx
01C902B6 EB 1F jmp short 01C902D7
01C902B8 83FA 01 cmp edx, 1
01C902BB 75 1D jnz short 01C902DA
01C902BD FF76 04 push dword ptr [esi+4]
01C902C0 8B90 84000000 mov edx, dword ptr [eax+84]
01C902C6 3350 68 xor edx, dword ptr [eax+68]
01C902C9 FF76 08 push dword ptr [esi+8]
01C902CC 3310 xor edx, dword ptr [eax]
01C902CE 6A 00 push 0
01C902D0 FF76 0C push dword ptr [esi+C]
01C902D3 2BCA sub ecx, edx
01C902D5 FFD1 call ecx F8单步走到这里,F7跟进,就是OEP
01C902D7 8945 FC mov dword ptr [ebp-4], eax
01C902DA 8B45 FC mov eax, dword ptr [ebp-4]
01C902DD 5F pop edi
01C902DE 5E pop esi
01C902DF C9 leave
01C902E0 C3 retn
此时,载入LordPE,找到此软件进程,点键“完整转存”,脱壳完毕,不用关OD,载入ImportREC V1.6F 汉化版,找到进程,OEP填入53411E,“IAT自动搜索”——“获取输入信息”,出现
假指针,剪切掉,然后修复抓取文件。OK,运行脱壳后的文件,正常!
最后可以给文件做个减肥。用LordPE,点击PE编辑器 打开脱壳后的文件,点“区段”把text1 adata data1 reloc1 padtat 这5个区段删除掉。然后重建PE文件
1、首先用PEID查壳为Armadillo4.4x的壳,而且是双进程壳。
2、用OD忽略所有异常,隐藏OD,载入程序 在命令行下bp OpenMutexA 断点,Shift+ F9中断如下:
7C80EABB > 8BFF mov edi, edi 中断在这里
7C80EABD 55 push ebp
7C80EABE 8BEC mov ebp, esp
7C80EAC0 51 push ecx
7C80EAC1 51 push ecx
7C80EAC2 837D 10 00 cmp dword ptr [ebp+10], 0
7C80EAC6 56 push esi
7C80EAC7 0F84 A7550300 je 7C844074
我们再CTRL+G 输入00401000,来到这里
然后我们在下面的空白地址填入下面的数值
00401000 60 pushad
00401001 9C pushfd
00401002 68 A0FD1200 push 12FDA0 注意; ASCII " 8E8::DA113A5A09"
00401007 33C0 xor eax,eax
00401009 50 push eax
0040100A 50 push eax
0040100B E8 CFD9407C call KERNEL32.CreateMutexA
00401010 9D popfd
00401011 61 popad
00401012 - E9 A4DA407C jmp KERNEL32.OpenMutexA
全部填完后我们把他们全选上 在 此处新建EIP F9 中断后 取消断点 在CTRL+G 输入00401000,然后就撤销选择处修改, 此时我们的双变单就完成了。
3、避开Anti (Armadillo到了4X以后OD多了一个漏洞 )
he OutputDebugStringA,中断2次!,选中%s%之类的字符,点右键“数据窗口中跟随”->二进制->使用00填充,然后在”调试”工具栏中删除此硬件断点!
4、这一步就和我们单进程脱壳一样了, 下he GetModuleHandleA 断点,F9运行,找返回时机。这里给大家说个技巧,当出现"VirtualAlloc" "VirtualFree"后,再出现"kernel32.dll",就
是我们的返回时机。在”调试”工具栏中删除此硬件断点,Alt+F9返回以下程序
01C759E3 8B0D 6C50CA01 mov ecx, dword ptr [1CA506C] 返回在此
01C759E9 89040E mov dword ptr [esi+ecx], eax
01C759EC A1 6C50CA01 mov eax, dword ptr [1CA506C]
01C759F1 391C06 cmp dword ptr [esi+eax], ebx
01C759F4 75 16 jnz short 01C75A0C
01C759F6 8D85 B4FEFFFF lea eax, dword ptr [ebp-14C]
01C759FC 50 push eax
01C759FD FF15 B862C901 call dword ptr [1C962B8] ; kernel32.LoadLibraryA
01C75A03 8B0D 6C50CA01 mov ecx, dword ptr [1CA506C]
01C75A09 89040E mov dword ptr [esi+ecx], eax
01C75A0C A1 6C50CA01 mov eax, dword ptr [1CA506C]
01C75A11 391C06 cmp dword ptr [esi+eax], ebx
01C75A14 0F84 2F010000 je 01C75B49 单步走到这,修改JMP,跳走
01C75A1A 33C9 xor ecx, ecx
01C75A1C 8B07 mov eax, dword ptr [edi]
01C75A1E 3918 cmp dword ptr [eax], ebx
01C75A20 74 06 je short 01C75A28
01C75A22 41 inc ecx
01C75A23 83C0 0C add eax, 0C
01C75A26 ^ EB F6 jmp short 01C75A1E
01C75B49 83C7 0C add edi, 0C 跳到这里www.2cto.com
01C75B4C 89BD 78FDFFFF mov dword ptr [ebp-288], edi
01C75B52 83C6 04 add esi, 4
01C75B55 395F FC cmp dword ptr [edi-4], ebx
01C75B58 ^ 0F85 49FEFFFF jnz 01C759A7
01C75B5E EB 03 jmp short 01C75B63
Alt+M,打开内存镜像在00401000处F2下断,F9运行断下, 我们单步走 如下01C9026B 8B0C3A mov ecx, dword ptr [edx+edi] 断在这里
01C9026E 5B pop ebx
01C9026F 03D7 add edx, edi
01C90271 A1 A410CA01 mov eax, dword ptr [1CA10A4]
01C90276 3148 58 xor dword ptr [eax+58], ecx
01C90279 A1 A410CA01 mov eax, dword ptr [1CA10A4]
01C9027E 3148 58 xor dword ptr [eax+58], ecx
01C90281 A1 A410CA01 mov eax, dword ptr [1CA10A4]
01C90286 8B16 mov edx, dword ptr [esi]
01C90288 8B88 84000000 mov ecx, dword ptr [eax+84]
01C9028E 3348 78 xor ecx, dword ptr [eax+78]
01C90291 3348 10 xor ecx, dword ptr [eax+10]
01C90294 030D BC10CA01 add ecx, dword ptr [1CA10BC] ; ql.00400000
01C9029A 85D2 test edx, edx
01C9029C 75 1A jnz short 01C902B8
01C9029E 8B90 84000000 mov edx, dword ptr [eax+84]
01C902A4 FF76 18 push dword ptr [esi+18]
01C902A7 3350 68 xor edx, dword ptr [eax+68]
01C902AA FF76 14 push dword ptr [esi+14]
01C902AD 3310 xor edx, dword ptr [eax]
01C902AF FF76 10 push dword ptr [esi+10]
01C902B2 2BCA sub ecx, edx
01C902B4 FFD1 call ecx
01C902B6 EB 1F jmp short 01C902D7
01C902B8 83FA 01 cmp edx, 1
01C902BB 75 1D jnz short 01C902DA
01C902BD FF76 04 push dword ptr [esi+4]
01C902C0 8B90 84000000 mov edx, dword ptr [eax+84]
01C902C6 3350 68 xor edx, dword ptr [eax+68]
01C902C9 FF76 08 push dword ptr [esi+8]
01C902CC 3310 xor edx, dword ptr [eax]
01C902CE 6A 00 push 0
01C902D0 FF76 0C push dword ptr [esi+C]
01C902D3 2BCA sub ecx, edx
01C902D5 FFD1 call ecx F8单步走到这里,F7跟进,就是OEP
01C902D7 8945 FC mov dword ptr [ebp-4], eax
01C902DA 8B45 FC mov eax, dword ptr [ebp-4]
01C902DD 5F pop edi
01C902DE 5E pop esi
01C902DF C9 leave
01C902E0 C3 retn
此时,载入LordPE,找到此软件进程,点键“完整转存”,脱壳完毕,不用关OD,载入ImportREC V1.6F 汉化版,找到进程,OEP填入53411E,“IAT自动搜索”——“获取输入信息”,出现
假指针,剪切掉,然后修复抓取文件。OK,运行脱壳后的文件,正常!
最后可以给文件做个减肥。用LordPE,点击PE编辑器 打开脱壳后的文件,点“区段”把text1 adata data1 reloc1 padtat 这5个区段删除掉。然后重建PE文件