to fly,你是从al==?哪里发现的?像我上面的那段代码,al应该等于几,然后它又怎样走过来的,可以发向我的 mailbox:)
sen,能用我写的“抵达aspr1.3x输入表处理的异常”处理前到达正确位置,不过仅用sen的脚本是不能完整修复!
sen,你加壳的98notepad已经修复完,在XP下测试运行操作正常,若要在98下运行,可参考fly脱飞速的unpackme的“最后修正跨98”。脱壳后没有完美“瘦身”==188k,我也没这本事或精力进行浪费。如果上传附件没问题的,我会试试的...
stolen:
004010CC - E9 104C5700 jmp 00975CE1
004010D1 1B92 FF1508A0 sbb edx,dword ptr ds:[edx+A00815FF]
fixed:
004010CC 55 push ebp
004010CD 8BEC mov ebp,esp
004010CF 83EC 44 sub esp,44
004010D2 56 push esi
-----------------------------------------------------------------
//下面属于al==4 的特别加密
00955B67 8B4424 2C mov eax,dword ptr ss:[esp+2C]
00955B6B 50 push eax
00955B6C 8D4424 34 lea eax,dword ptr ss:[esp+34]
00955B70 50 push eax
00955B71 55 push ebp
00955B72 A1 7C259600 mov eax,dword ptr ds:[96257C]
00955B77 8B00 mov eax,dword ptr ds:[eax]
00955B79 50 push eax
00955B7A 56 push esi
00955B7B 8B4424 28 mov eax,dword ptr ss:[esp+28]
00955B7F 50 push eax
00955B80 FF53 30 call dword ptr ds:[ebx+30] //哈哈,有加密
00955B83 ^ E9 3BFDFFFF jmp 009558C3
……
//下面有nop的表示花指令:
00979113 /65:EB 01 jmp short 00979117
00979116 |90 nop
00979117 \2B5C24 00 sub ebx,dword ptr ss:[esp]
0097911B EB 02 jmp short 0097911F
0097911D CD20 33D95B55 vxdjump 555BD933
00979123 8F03 pop dword ptr ds:[ebx]
00979125 C1CA 5F ror edx,5F
00979128 EB 01 jmp short 0097912B
0097912A 90 nop
0097912B 335424 08 xor edx,dword ptr ss:[esp+8]
0097912F 26:EB 02 jmp short 00979134
00979132 90 nop
00979133 90 nop
00979134 FF7427 14 push dword ptr ds:[edi+14]
00979138 81D2 9007F8AA adc edx,AAF80790 //
0097913E 5A pop edx
0097913F 0356 04 add edx,dword ptr ds:[esi+4]
00979142 53 push ebx
00979143 8F02 pop dword ptr ds:[edx] //中断在here
00979145 68 8E334500 push 45338E
0097914A 8F46 00 pop dword ptr ds:[esi]
0097914D 81D1 4CA6CF11 adc ecx,11CFA64C
00979153 F2: prefix repne:
00979154 EB 01 jmp short 00979157
00979156 90 nop
sen让我试的98记事本,除了stolen外,我用改造sen发的脚本(我已了解它如何作用,sen的那个修复“类别”还不完全和使用麻烦)完成imt修复的,脚本是写出来了,但还不够完美(极大的原因--脚本太大,有错误难维护,还有更重要的是aspr1.3x以上到底有多少种imt的[trick==加密],精力有限,“研究生”们能放个高见吗?),需输入构造输入表的入口地址,该地址还是要用户思考确定并“实时”填写,
只要填好入口地址,就会工作个不停,直至异常发生才暂停!
目前,仅修复有3大类(高手要赐教呀):
以下三类情况都能在加密前从 ebp 看到api的真实地址
a.
jmp dword ptr ds:[xxxxxxxx]
// 俗称没加密,xxxxxxxx是壳地址,[xxxxxxxx]==aaaaaaaa,aaaaaaaa就是Api真正地址
b.1(FF25)
jmp dword ptr ds:[yyyyyyyy]
加密后:call mmmmmmmm 开头放E8,最后伴随1扰乱字节
// yyyyyyyy是壳地址,[yyyyyyyy]==bbbbbbbb,bbbbbbbb是壳加密处理过的地址
b.2(FF15)
call dword ptr ds:[zzzzzzzz]
加密后:call mmmmmmmm 开头放E8,后伴随1扰乱字节
// zzzzzzzz是壳地址,[zzzzzzzz]==cccccccc,cccccccc是壳加密处理过的地址
c.同b相似有两种类型,但没有往FF15... call[...]或FF25...Jmp[...] 首字节放E8,直接在[...]填入加密地址
// c类(al==4)修复与b有同功之妙,隐蔽略胜一筹,难度差了一点
我有个问题(我见识小):找不到加密前b类(al==2)的两种的区别特征,如果它们同时混合用上,就难?--必须知道,在下面加密前要知道被加密的是call[]还是jmp[],以便我们能正确修复,否则修复会更混乱,谁能分析呀?说一下见解?
……
009556CE mov eax,esi
009556D0 sub eax,2
009556D3 cmp word ptr ds:[eax],0 //是否为0000????????,即要加密 Jmp[] 或 Call[]
009556D7 jnz short 009556E9
009556D9 mov edx,dword ptr ss:[esp+C]
009556DD mov edx,dword ptr ds:[edx]
009556DF call 00953690 //写入加密地址
009556E4 jmp 0095555B //循环加密
……
附件:Fixed.rar