逆向

今天遇到一个call,研究了很久,测试软件上没问题,使用java代码编写的时候游戏老是崩溃了

汇编一
004905F4    68 20564800     push woool.00485620
004905F9    03C2            add eax,edx
004905FB    50              push eax
004905FC    56              push esi
004905FD    57              push edi
004905FE    E8 4DFAFFFF     call woool.00490050
00490603    83C4 10         add esp,0x10
00490606    5F              pop edi                                  ; 1124AF0D
00490607    5E              pop esi                                  ; 1124AF0D
00490608    C2 0800         retn 0x8java代码
asm._PUSH(0x485620);
asm._PUSH(0x3c);asm._MOV_EDI(ediAddress);
asm._PUSH_EDI();
asm._MOV_ESI(eaxAddress);
asm._PUSH_ESI();asm._MOV_EAX(0x490050);
asm._CALL_EAX();
asm._ADD_ESP(0x10);
代码二
00490083    8B7424 24       mov esi,dword ptr ss:[esp+0x24]
00490087    85F6            test esi,esi
00490089    0F8E B7000000   jle woool.00490146
0049008F    55              push ebp
00490090    57              push edi
00490091    8D4424 18       lea eax,dword ptr ss:[esp+0x18]
00490095    53              push ebx
00490096    50              push eax
00490097    E8 24FBFFFF     call woool.0048FBC0
0049009C    8BC6            mov eax,esi
0049009E    99              cdq
0049009F    2BC2            sub eax,edx
004900A1    D1F8            sar eax,1
004900A3    8BF0            mov esi,eax其中call woool.0048FBC0是return 0java代码一
有问题
asm._PUSH(0x485620);
asm._PUSH(ediAddress);
asm._PUSH(eaxAddress);
asm._PUSH(0x19EFB4);
asm._MOV_EAX(0x48FBC0);
asm._CALL_EAX();
asm._ADD_ESP(0x10);java代码二
直接崩溃
asm._PUSH_EBP(0x485620);
asm._PUSH_EDI(ediAddress);
asm._PUSH_EBX(eaxAddress);
asm._PUSH_EAX(0x19EFB4);asm._MOV_EAX(0x48FBC0);
asm._CALL_EAX();
asm._ADD_ESP(0x10);java代码三
无问题
asm._MOV_EBP(0x485620);
asm._PUSH_EBP();
asm._MOV_EDI(ediAddress);
asm._PUSH_EDI();
asm._MOV_EBX(eaxAddress);
asm._PUSH_EBX();
asm._MOV_EAX(0x19EFB4);
asm._PUSH_EAX();
asm._MOV_EAX(0x48FBC0);
asm._CALL_EAX();
asm._ADD_ESP(0x10);代码四
直接崩溃
asm._PUSH(0x485620);
asm._PUSH(ediAddress);
asm._PUSH(eaxAddress);
asm._PUSH(0x19EFB4);asm._MOV_EAX(0x490050);
asm._CALL_EAX();asm._ADD_ESP(0x10);

总结,堆栈平衡一定要记住,不然浪费时间;另外,ecs是否也是需要考虑的。同时,如果是汇编代码中直接是push 常数,则java使用asm._PUSH(xxxx),如果是push ebp,则先使用mov,然后push,参照代码三。