玩了10多天,还是一如既往的搞不定,好郁闷。
keygen成功的大牛们能不能介绍下算法?
通过S大发的链接 http://study-forever.spaces.live.com/blog/cns!458414375A51CC00!230.entry?sa=568818536 得知,一些敏感指令被代码扭曲变换了。
-----------------------------------------------------------------------------------------------------------------------------------------
一,
说一说这些天来让菜鸟我头疼的代码变换
////////////////////////////////////////
//1,
//call CONST
//CALL指令的变换
CALL 42ED9B被变换为 CALL 0043AA78
0042F269 CALL 0043AA78 jmpconst = 0043AA78; // <- CALL 42ED9B
0043AA78 PUSH 42EFCF *A
0043AA7D ADD [SS:ESP],ESI //(esi: arg_2c) + 42EFCF
0043AA80 PUSH -21 *B
0043AA82 PUSH EBX // (ebx : esi: arg_2c) + 42EFCF
0042F314 MOV EBX,[SS:ESP+08]
0042F318 SUB [SS:ESP+04],ESI // -21 - (esi: arg_2c)
0042F31C LEA EBX,[DS:EBX-213] *C //(esi: arg_2c) + 42EFCF - 213
0042F322 ADD [SS:ESP+04],EBX //(esi: arg_2c) + 42EFCF - 213 -21 - (esi: arg_2c) ==> 42EFCF - 213 -21 ==> 42ED9B
0042F326 POP EBX
00437CC9 RETN 4
////////////////////////////////////////
//2,
//cmp A,B
//jge CONST
//jmp CONST
//比较指令的变换
0042F1F6 SUB [DWORD SS:ESP],4
0042F1FA SHR [DWORD SS:ESP],1F
0042F1FE NEG [DWORD SS:ESP]
0042F201 MOV EAX,[SS:ESP]
0042F204 ADD ESP,8 *A //lea esp,[esp+8]
0042FC24 AND EAX,FFFFF5C4 *B //FFFFF5C4
0042FC29 ADD EAX,42FCE6 *C //42FCE6
0042FC2E JMP EAX
以上模拟
SUB [SS:ESP],4
lea esp,[esp+8]
jge 42FCE6 + FFFFF5C4 => 42F2AA
jmp 42FCE6
////////////////////////////////////////
//3, retn CONST
//retn指令的变换
0042F7C0 MOV ECX,[SS:ESP] //retn 到的地址
004300AC ADD ESP,8
004300AF ADD ESP,4 *A //4
004300B2 JMP ECX //retn 4
以上模拟retn 4
为什么是retn 4而不是retn 8,我是猜的,因为还找到了
0043FAEA . 8B0C24 mov ecx, dword ptr [esp]
0043F9B3 > /83C4 08 add esp, 8 //猜这里是堆栈平衡
0043F9B6 . |83C4 14 add esp, 14 *A //14
0043F9B9 . |FFE1 jmp ecx //retn 14
///////////////////////////////////////
//4,使用堆栈代替寄存器
具体看链接中作者的说明吧
///////////////////////////////////////
//5,垃圾代码
1)
0042CD72 > /83C0 0D add eax, 0D //都删了
0042CD75 . |8D00 lea eax, dword ptr [eax]
0042CD77 . |894424 0C mov dword ptr [esp+C], eax
0042CD7B . |8B4424 0C mov eax, dword ptr [esp+C]
0042CD7F . |83C0 F3 add eax, -0D
2)
0042E45F . 83C0 0D add eax, 0D //以后用得着
0042E462 . 8D00 lea eax, dword ptr [eax] //删
0042E464 . 894424 04 mov dword ptr [esp+4], eax //删
0042E207 > /8B4424 04 mov eax, dword ptr [esp+4] //删
0042E20B . |83C0 F7 add eax, -9 //以后用得着
3)
0042F87C MOV EAX,ESP //删
0042F87E ADD EAX,8 //删
0042EED0 CSP: 000C ASP:-002B LEA EAX,[SS:ESP+37] //以后用得着
4)
00437C3D MOV EAX,ESP //删
00437C3F ADD EAX,C //删
00437C42 MOV EAX,[SS:ESP+0C] //以后用得着
.............
-----------------------------------------------------------------------------------------------------------------------------------------
二,代码还原
1,OD插件CodeDoctor,可以去掉一些烦人的JMP CONST
2,自己动手写脚本、插件、工具去垃圾代码
3,自己动手写脚本、插件、工具套模板 还原 扭曲变换的指令,只要将CALL,RETN,CMP还原了就可以使用IDA的F5了 - -
4,快使用IDA,F5,虽然出来的代码惨不忍睹 -___________________-!
5,大牛们有好方法,大家去威逼、色诱.......
-----------------------------------------------------------------------------------------------------------------------------------------
三,算法分析
请各位大牛介绍下算法
-------------------------------------------------------------------------------------------------------------------------------------------
附件里是还原后的验证函数 通过IDA F5后的效果,惨不忍睹
上传的附件: