好友
阅读权限20
听众
最后登录1970-1-1
|
分析IAT 加密过程
00ACBEC36A 01 push 1;IAT处理开始
00ACBEC558pop eax
00ACBEC685C0test eax,eax
00ACBEC80F84 C5080000 je 00ACC793
00ACBECE8B85 84D9FFFF mov eax,dword ptr ss:[ebp-267C] ;dll名送EAX
00ACBED48985 84D3FFFF mov dword ptr ss:[ebp-2C7C],eax
00ACBEDA6A 00 push 0
00ACBEDCFFB5 84D9FFFF push dword ptr ss:[ebp-267C]
00ACBEE2FF15 1463AD00 call dword ptr ds:[AD6314]; msvcrt.strchr
00ACBEE859pop ecx
00ACBEE959pop ecx
00ACBEEA40inc eax
00ACBEEB8985 84D9FFFF mov dword ptr ss:[ebp-267C],eax
00ACBEF18B85 84D3FFFF mov eax,dword ptr ss:[ebp-2C7C]
00ACBEF70FBE00movsx eax,byte ptr ds:[eax]
00ACBEFA85C0test eax,eax
00ACBEFC75 05 jnz short 00ACBF03
00ACBEFEE9 90080000 jmp 00ACC793
.....................................................................................省略代码
00ACBF486A 40 push 40
00ACBF4A59pop ecx
00ACBF4B33C0xor eax,eax
00ACBF4D8DBD 89D3FFFF lea edi,dword ptr ss:[ebp-2C77]
00ACBF53F3:AB rep stos dword ptr es:[edi]
00ACBF5566:AB stos word ptr es:[edi]
00ACBF57AAstos byte ptr es:[edi]
00ACBF58FFB5 84D3FFFF push dword ptr ss:[ebp-2C7C]
00ACBF5EE8 05B5FEFF call 00AB7468; 获取 DLL 基址
00ACBF638985 A0D4FFFF mov dword ptr ss:[ebp-2B60],eax; 基址送 [ebp-2B60] 保存
00ACBF6983BD A0D4FFFF 0>cmp dword ptr ss:[ebp-2B60],0
00ACBF700F85 9F000000 jnz 00ACC015
.....................................................................................省略代码
00ACC066FF15 1063AD00 call dword ptr ds:[AD6310] ; msvcrt.sprintf
00ACC06C83C4 10 add esp,10
00ACC06F33C0xor eax,eax
00ACC071E9 4A1A0000 jmp 00ACDAC0
00ACC076FFB5 A0D4FFFF push dword ptr ss:[ebp-2B60] ;Dll 基址进栈
00ACC07CE8 DB9CFEFF call 00AB5D5C
00ACC08159pop ecx
00ACC08283A5 9CD4FFFF 0>and dword ptr ss:[ebp-2B64],0
00ACC089A1 FC00AE00 mov eax,dword ptr ds:[AE00FC]
00ACC08E8985 F0A9FFFF mov dword ptr ss:[ebp+FFFFA9F0],eax;镜像基址送 [ebp+FFFFA9F0]
00ACC0948B85 A0D4FFFF mov eax,dword ptr ss:[ebp-2B60]; Dll 基址送 EAX
00ACC09A3B85 F0A9FFFF cmp eax,dword ptr ss:[ebp+FFFFA9F0]
00ACC0A075 0F jnz short 00ACC0B1
.....................................................................................省略代码
00ACC3CBFFB5 60C2FFFF push dword ptr ss:[ebp-3DA0]
00ACC3D1E8 D650FDFF call 00AA14AC ; 获取一个函数名
00ACC3D683C4 10 add esp,10
00ACC3D90FB685 70CAFFFF movzx eax,byte ptr ss:[ebp-3590]; 函数名首字母 ASCII 送到 EAX
00ACC3E03D FF000000 cmp eax,0FF
00ACC3E575 10 jnz short 00ACC3F7
00ACC3E766:8B85 71CAFFF>mov ax,word ptr ss:[ebp-358F]
00ACC3EE66:8985 6CCAFFF>mov word ptr ss:[ebp-3594],ax
00ACC3F5EB 20 jmp short 00ACC417
00ACC3F70FBE85 70CAFFFF movsx eax,byte ptr ss:[ebp-3590]; 函数名首字母 ASCII 送到 EAX
00ACC3FE85C0test eax,eax
00ACC40074 15 je short 00ACC417
00ACC4028D85 70CAFFFF lea eax,dword ptr ss:[ebp-3590] ;函数名送到 EAX 中保存
00ACC40850push eax
00ACC4098D85 68C2FFFF lea eax,dword ptr ss:[ebp-3D98] ; 函数地址送到 EAX 中保存
00ACC40F50push eax
00ACC410E8 D58E0000 call 00AD52EA ; jmp 到 msvcrt.strcpy
00ACC41559pop ecx
00ACC41659pop ecx
00ACC41783A5 68CAFFFF 0>and dword ptr ss:[ebp-3598],0
00ACC41E0FB785 6CCAFFFF movzx eax,word ptr ss:[ebp-3594] ; EAX 清 0
00ACC42585C0test eax,eax
00ACC42774 6C je short 00ACC495
00ACC42983BD 9CD4FFFF 0>cmp dword ptr ss:[ebp-2B64],0
00ACC43074 51 je short 00ACC483
.....................................................................................省略代码
00ACC4950FBE85 68C2FFFF movsx eax,byte ptr ss:[ebp-3D98] ; 函数名首字母送 ASCII 码 EAX
00ACC49C85C0test eax,eax
00ACC49E0F84 8A000000 je 00ACC52E 空就跳走
00ACC4A483BD 9CD4FFFF 0>cmp dword ptr ss:[ebp-2B64],0
00ACC4AB74 72 je short 00ACC51F
00ACC4AD8B85 9CD4FFFF mov eax,dword ptr ss:[ebp-2B64]
00ACC4B38985 58C2FFFF mov dword ptr ss:[ebp-3DA8],eax
00ACC4B9EB 0F jmp short 00ACC4CA
00ACC4BB8B85 58C2FFFF mov eax,dword ptr ss:[ebp-3DA8] ;开始循环计算函数地址
00ACC4C183C0 0C add eax,0C
00ACC4C48985 58C2FFFF mov dword ptr ss:[ebp-3DA8],eax
00ACC4CA8B85 58C2FFFF mov eax,dword ptr ss:[ebp-3DA8]
00ACC4D08378 08 00cmp dword ptr ds:[eax+8],0
00ACC4D474 49 je short 00ACC51F
00ACC4D668 00010000 push 100
00ACC4DB8D85 58C1FFFF lea eax,dword ptr ss:[ebp-3EA8]
00ACC4E150push eax
00ACC4E28B85 58C2FFFF mov eax,dword ptr ss:[ebp-3DA8]
00ACC4E8FF30push dword ptr ds:[eax]
00ACC4EAE8 A961FDFF call 00AA2698
00ACC4EF83C4 0C add esp,0C
00ACC4F28D85 58C1FFFF lea eax,dword ptr ss:[ebp-3EA8]
00ACC4F850push eax
00ACC4F98D85 68C2FFFF lea eax,dword ptr ss:[ebp-3D98]
00ACC4FF50push eax
00ACC500FF15 8C63AD00 call dword ptr ds:[AD638C] ; msvcrt._stricmp
00ACC50659pop ecx
00ACC50759pop ecx
00ACC50885C0test eax,eax ;Magic Jmp
00ACC50A75 11 jnz short 00ACC51D ; 如果上面 EAX 值为 0 那么就加密 IAT
00ACC50C8B85 58C2FFFF mov eax,dword ptr ss:[ebp-3DA8]
00ACC5128B40 08 mov eax,dword ptr ds:[eax+8]
00ACC5158985 68CAFFFF mov dword ptr ss:[ebp-3598],eax
00ACC51BEB 02 jmp short 00ACC51F ;找到了就结束循环继续处理
00ACC51D^ EB 9C jmp short 00ACC4BB ;返回 00ACC4BB 继续循环
00ACC51F8B85 A8D4FFFF mov eax,dword ptr ss:[ebp-2B58];EAX 清 0
00ACC52540inc eax
00ACC5268985 A8D4FFFF mov dword ptr ss:[ebp-2B58],eax
00ACC52CEB 37 jmp short 00ACC565
00ACC52E8D8D 38D9FFFF lea ecx,dword ptr ss:[ebp-26C8]
00ACC534E8 074BFDFF call 00AA1040
00ACC5390FB6C0movzx eax,al
00ACC53C99cdq
00ACC53D6A 14 push 14
00ACC53F59pop ecx
00ACC540F7F9idiv ecx
00ACC5428B85 10D9FFFF mov eax,dword ptr ss:[ebp-26F0]
00ACC5488B8C95 94D7FFFF mov ecx,dword ptr ss:[ebp+edx*4-286C]
00ACC54F8908mov dword ptr ds:[eax],ecx
00ACC5518B85 10D9FFFF mov eax,dword ptr ss:[ebp-26F0]
00ACC55783C0 04 add eax,4
00ACC55A8985 10D9FFFF mov dword ptr ss:[ebp-26F0],eax
00ACC560E9 6C010000 jmp 00ACC6D1
00ACC56583BD 68CAFFFF 0>cmp dword ptr ss:[ebp-3598],0; [ebp-3598] 为 0 吗
00ACC56C75 42 jnz short 00ACC5B0 ; 跳就加密 IAT(如果上面没修改这里nop掉可避开加密)
00ACC56E0FB785 6CCAFFFF movzx eax,word ptr ss:[ebp-3594] ;EAX 清 0
00ACC57585C0test eax,eax
00ACC57774 0F je short 00ACC588
00ACC5790FB785 6CCAFFFF movzx eax,word ptr ss:[ebp-3594]
00ACC5808985 D8A8FFFF mov dword ptr ss:[ebp+FFFFA8D8],eax
00ACC586EB 0C jmp short 00ACC594
00ACC5888D85 68C2FFFF lea eax,dword ptr ss:[ebp-3D98];函数名送 EAX
00ACC58E8985 D8A8FFFF mov dword ptr ss:[ebp+FFFFA8D8],eax
00ACC5946A 01 push 1
00ACC596FFB5 D8A8FFFF push dword ptr ss:[ebp+FFFFA8D8] ;函数名进栈
00ACC59CFFB5 A0D4FFFF push dword ptr ss:[ebp-2B60] ; 函数名所在的 Dll 进栈
00ACC5A2E8 6DA0FEFF call 00AB6614
00ACC5A783C4 0C add esp,0C
00ACC5AA8985 68CAFFFF mov dword ptr ss:[ebp-3598],eax ;把处理好的 IAT 送到 [ebp-3598]
00ACC5B083BD 68CAFFFF 0>cmp dword ptr ss:[ebp-3598],0 ;送进去了吗?
00ACC5B775 42 jnz short 00ACC5FB; 送进去就跳到下面继续
00ACC5B90FB785 6CCAFFFF movzx eax,word ptr ss:[ebp-3594]
00ACC5C085C0test eax,eax
00ACC5C274 0F je short 00ACC5D3
00ACC5C40FB785 6CCAFFFF movzx eax,word ptr ss:[ebp-3594]
00ACC5CB8985 D4A8FFFF mov dword ptr ss:[ebp+FFFFA8D4],eax
00ACC5D1EB 0C jmp short 00ACC5DF
00ACC5D38D85 68C2FFFF lea eax,dword ptr ss:[ebp-3D98]
00ACC5D98985 D4A8FFFF mov dword ptr ss:[ebp+FFFFA8D4],eax
00ACC5DF6A 00 push 0
00ACC5E1FFB5 D4A8FFFF push dword ptr ss:[ebp+FFFFA8D4]
00ACC5E7FFB5 A0D4FFFF push dword ptr ss:[ebp-2B60]
00ACC5EDE8 22A0FEFF call 00AB6614
00ACC5F283C4 0C add esp,0C
00ACC5F58985 68CAFFFF mov dword ptr ss:[ebp-3598],eax
00ACC5FB83BD 68CAFFFF 0>cmp dword ptr ss:[ebp-3598],0 ; 送进去了吗?
00ACC6020F85 99000000 jnz 00ACC6A1; 送进去就跳到下面继续
00ACC6080FB785 6CCAFFFF movzx eax,word ptr ss:[ebp-3594]
00ACC60F85C0test eax,eax
00ACC61174 54 je short 00ACC667
00ACC613FF15 C060AD00 call dword ptr ds:[AD60C0] ; ntdll.RtlGetLastWin32Error
00ACC61983F8 32 cmp eax,32
00ACC61C75 0C jnz short 00ACC62A
00ACC61EC785 68CAFFFF 0>mov dword ptr ss:[ebp-3598],0AB6609
00ACC628EB 3B jmp short 00ACC665
00ACC62A8B45 08 mov eax,dword ptr ss:[ebp+8]
00ACC62D8B00mov eax,dword ptr ds:[eax]
00ACC62FC700 03000000 mov dword ptr ds:[eax],3
00ACC635FF15 C060AD00 call dword ptr ds:[AD60C0] ; ntdll.RtlGetLastWin32Error
00ACC63B50push eax
00ACC63C0FB785 6CCAFFFF movzx eax,word ptr ss:[ebp-3594]
00ACC64350push eax
00ACC644FFB5 84D3FFFF push dword ptr ss:[ebp-2C7C]
00ACC64A68 94CBAD00 push 0ADCB94 ; ASCII "File "%s", ordinal %d (error %d)"
00ACC64F8B45 08 mov eax,dword ptr ss:[ebp+8]
00ACC652FF70 04 push dword ptr ds:[eax+4]
00ACC655FF15 1063AD00 call dword ptr ds:[AD6310] ; msvcrt.sprintf
00ACC65B83C4 14 add esp,14
00ACC65E33C0xor eax,eax
00ACC660E9 5B140000 jmp 00ACDAC0
00ACC665EB 3A jmp short 00ACC6A1
00ACC6678B45 08 mov eax,dword ptr ss:[ebp+8]
00ACC66A8B00mov eax,dword ptr ds:[eax]
00ACC66CC700 03000000 mov dword ptr ds:[eax],3
00ACC672FF15 C060AD00 call dword ptr ds:[AD60C0] ; ntdll.RtlGetLastWin32Error
00ACC67850push eax
00ACC6798D85 68C2FFFF lea eax,dword ptr ss:[ebp-3D98]
00ACC67F50push eax
00ACC680FFB5 84D3FFFF push dword ptr ss:[ebp-2C7C]
00ACC68668 70CBAD00 push 0ADCB70 ; ASCII "File "%s", function "%s" (error %d)"
00ACC68B8B45 08 mov eax,dword ptr ss:[ebp+8]
00ACC68EFF70 04 push dword ptr ds:[eax+4]
00ACC691FF15 1063AD00 call dword ptr ds:[AD6310] ; msvcrt.sprintf
00ACC69783C4 14 add esp,14
00ACC69A33C0xor eax,eax
00ACC69CE9 1F140000 jmp 00ACDAC0
00ACC6A18B85 10D9FFFF mov eax,dword ptr ss:[ebp-26F0] ; 把刚才 IAT 所在的位置送到 EAX
00ACC6A73B85 64D9FFFF cmp eax,dword ptr ss:[ebp-269C] ;EAX 里现在是 FFFFFFFF 吗?
00ACC6AD73 1D jnb short 00ACC6CC
00ACC6AF8B85 10D9FFFF mov eax,dword ptr ss:[ebp-26F0] ;把刚才 IAT 所在的位置送到 EAX
00ACC6B58B8D 68CAFFFF mov ecx,dword ptr ss:[ebp-3598] ;把 IAT 送到 ECX
00ACC6BB8908mov dword ptr ds:[eax],ecx;写入 IAT,过了这句就可以在数据窗口中看到 IAT
00ACC6BD8B85 10D9FFFF mov eax,dword ptr ss:[ebp-26F0] ;把刚才 IAT 所在位置的地址送到 EAX 中
00ACC6C383C0 04 add eax,4 ;指针指向下一个要写入的 IAT 位置
00ACC6C68985 10D9FFFF mov dword ptr ss:[ebp-26F0],eax;获得下一个要写入的 IAT 的位置后 送到[ebp-26F0] 中保存
00ACC6CC^ E9 4DFCFFFF jmp 00ACC31E;回去继续循环
00ACC6D1FF15 7C62AD00 call dword ptr ds:[AD627C] ; kernel32.GetTickCount
00ACC6D72B85 A4D4FFFF sub eax,dword ptr ss:[ebp-2B5C]
00ACC6DD8B8D A8D4FFFF mov ecx,dword ptr ss:[ebp-2B58]
00ACC6E36BC9 32 imul ecx,ecx,32
00ACC6E681C1 D0070000 add ecx,7D0
00ACC6EC3BC1cmp eax,ecx
00ACC6EE76 07 jbe short 00ACC6F7
00ACC6F0C685 34D9FFFF 0>mov byte ptr ss:[ebp-26CC],1
00ACC6F783BD E4D7FFFF 0>cmp dword ptr ss:[ebp-281C],0
00ACC6FE0F85 8A000000 jnz 00ACC78E
00ACC7040FB685 94D4FFFF movzx eax,byte ptr ss:[ebp-2B6C]
00ACC70B85C0test eax,eax
00ACC70D74 7F je short 00ACC78E
00ACC70F6A 00 push 0
00ACC7118B85 98D4FFFF mov eax,dword ptr ss:[ebp-2B68]
00ACC717C1E0 02 shl eax,2
00ACC71A50push eax
00ACC71B8B85 0CD8FFFF mov eax,dword ptr ss:[ebp-27F4]
00ACC7210385 90D4FFFF add eax,dword ptr ss:[ebp-2B70]
00ACC72750push eax
00ACC728E8 0D1E0000 call 00ACE53A
00ACC72D83C4 0C add esp,0C
00ACC7308B85 98D4FFFF mov eax,dword ptr ss:[ebp-2B68]
00ACC736C1E0 02 shl eax,2
00ACC73950push eax
00ACC73AFFB5 6CD9FFFF push dword ptr ss:[ebp-2694]
00ACC7408B85 0CD8FFFF mov eax,dword ptr ss:[ebp-27F4]
00ACC7460385 90D4FFFF add eax,dword ptr ss:[ebp-2B70]
00ACC74C50push eax
00ACC74DE8 068B0000 call 00AD5258; jmp 到 msvcrt.memcpy
00ACC75283C4 0C add esp,0C
00ACC7556A 01 push 1
00ACC7578B85 98D4FFFF mov eax,dword ptr ss:[ebp-2B68]
00ACC75DC1E0 02 shl eax,2
00ACC76050push eax
00ACC7618B85 0CD8FFFF mov eax,dword ptr ss:[ebp-27F4]
00ACC7670385 90D4FFFF add eax,dword ptr ss:[ebp-2B70]
00ACC76D50push eax
00ACC76EE8 C71D0000 call 00ACE53A
00ACC77383C4 0C add esp,0C
00ACC7768B85 6CD9FFFF mov eax,dword ptr ss:[ebp-2694]
00ACC77C8985 A4ABFFFF mov dword ptr ss:[ebp+FFFFABA4],eax
00ACC782FFB5 A4ABFFFF push dword ptr ss:[ebp+FFFFABA4]
00ACC788E8 C58A0000 call 00AD5252; jmp 到 msvcrt.operator delete
00ACC78D59pop ecx; 跳回去继续处理 IAT
00ACC78E^ E9 30F7FFFF jmp 00ACBEC3 ; 到这里 IAT 已经全部处理完毕
总结一下:
1 把00ACC5B7的 jnz short 00ACC5B0 这句 nop 掉就可以避开 IAT 加密了。
2 把00ACC50A的 jnz 改成 JMP 就可以避开 IAT 加密了。
两种方法任选其一,改好后到00ACC78E设置个硬件执行断点,然后 Shift+F9 运行程序
中断后把刚才改的还原回来这时候就可以用 ImportREC v1.6 Fix 修复输入表了
3 在 ImportREC 里填好 OEP 1700后,自动搜索IAT就可以了。 |
|