0056E485 3B45 F8 cmp eax,dword ptr ss:[ebp-8]
0056E488 ^ 0F85 8434FFFF jnz 00561912 ; 比较api加密的密文, 不等则跳上去计算下一个
0056E48E 8B45 EC mov eax,dword ptr ss:[ebp-14] ; 相等, 找到了, 这里可以下断
0056E491 E9 59530300 jmp 005A37EF ; 1_.005A37EF
再走着走着
004FFCCC 8B52 1C mov edx,dword ptr ds:[edx+1C]
004FFCCF 0355 FC add edx,dword ptr ss:[ebp-4] ;
004FFCD2 03C2 add eax,edx ;
004FFCD4 8B00 mov eax,dword ptr ds:[eax]
004FFCD6 0345 FC add eax,dword ptr ss:[ebp-4] ; 这一句做完后, eax即是真实的api地址
004FFCD9 - E9 E2C50700 jmp 0057C2C0 ; 1_.0057C2C0
004FFCDE C600 8B mov byte ptr ds:[eax],8B
在oep处写一段代码修复
004C74D0 > BE 68D14E00 mov esi,4ED168
004C74D5 81FE 10D94E00 cmp esi,4ED910
004C74DB 77 20 ja short 004C74FD ; 完成后跳走
004C74DD AD lods dword ptr ds:[esi] ; IAT中取一个出来
004C74DE 85C0 test eax,eax
004C74E0 ^ 74 F3 je short 004C74D5 ; 如果是0,取下一个
004C74E2 3D 00000001 cmp eax,1000000
004C74E7 ^ 77 EC ja short 004C74D5 ; 如果>1000000表示没有加密,放过
004C74E9 56 push esi ;
004C74EA 8BD4 mov edx,esp
004C74EC 83EA 04 sub edx,4
004C74EF 8915 10754C00 mov dword ptr ds:[4C7510],edx ; 保存esp
004C74F5 FFD0 call eax ; 加密的iat跑进去
004C74F7 5E pop esi ; 得到真实的api地址后写回去
004C74F8 8946 FC mov dword ptr ds:[esi-4],eax
004C74FB ^ EB D8 jmp short 004C74D5 ; 继续下一个
004C74FD 90 nop
004FFCD6 0345 FC add eax,dword ptr ss:[ebp-4] ; 这一句做完后, eax即是真实的api地址
004FFCD9 8B25 10754C00 mov esp,dword ptr ds:[4C7510] ; 恢复oep修复代码处的堆栈
004FFCDF C3 retn ; 返回oep处的修复代码
跑完后得到了,全部有效的IAT
可以用ImportREC 扣出来 再次修复原来的1.exe
得到2.exe
五 跨平台
修复跨平台累啊, 壳在oep前 对m.2mwp5l段的N个地方进行了初始化, 存放一些东西
有壳使用的加密的api地址, 有壳GlobalAlloc过的空间入口
南蛮妈妈必须把这些都找出来, 全部清0, 使脱壳后的程序跑到那些地方时好重新初始化
方法就是去掉内存访问异常, 在OD下跑, 一个一个追出来, 体力活
52E9C4 52E9A8 4FFE84 575D20 539A24 575D7C 575D70 52E9DC 52E9D0 575D50
4FFEC4 55E914 5A0704 5A06F8 5776FC 520558 52AED4 5776F0 54FDD8
大概还有一些南蛮妈妈可能没有找全, 找到的地址统统的清0
脱壳后程序启动时有三个线程地址空间, 有2个是anti 和校验的, 1个是检验注册码的
所以关掉2个, 一共3种情况, 都试一次,就知道nop 掉哪2个了