反汇编练习-2016-1130

来源:互联网 发布:mac网络图 编辑:程序博客网 时间:2024/05/29 07:46

前言

在还原cm算法时,参考了IDAF5的结果,运算结果和cm不同.
IDA F5的C实现比反汇编代码还长…, 长不要紧,结果还不对, 挫.
听老手说,逆算法的时候,一定要人肉还原,IDA F5只能做参考,说的真对.
真吃亏了,如果算法全部人肉还原,即使慢点,也可以和反汇编算法对上.
手工还原,如果哪里有纰漏,很容易找出来(已经验证过了, 可以和调试器一步一步对在一起, 如果发现崩溃了,或逻辑不对,一步一步的和调试器对比,很容易就找出来).
IDA F5的结果,对就不说了,错的时候,很难找到是哪的问题.
虽然这个cm离胜利还很远,但是也不至于像现在一样没进度.
手工还原时,即使大陀的变量被编译器优化成了越界赋值的样子,也可以用匿名联合体和匿名结构来解决.
用了这么多时间,没进度,真挫.
因为参考IDAF5的结果不对,用手工还原了一个算法函数,确实好使,运行结果一模一样.
即使翻译的难看,也可以以后再优化C语言实现,不至于搞的不对…
IDA让人真失望 :(,以后只能做逻辑流程的参考.
手工还原的一个函数,留做纪念.

记录

int* fnCalcReSn2_10338E0(){    //         ; =============== S U B R O U T I N E =======================================    //    //         ; Attributes: bp-based frame    //    //         fnCalcReSn2_10338E0 proc near           ; CODE XREF: fnRegSn_401BD0+14B.p    //    //         var_10          = dword ptr -10h    DWORD dwVar10 = 0;    //         var_C           = dword ptr -0Ch    DWORD dwVarC = 0;    //         var_8           = dword ptr -8    DWORD dwVar8 = 0;    //         var_4           = dword ptr -4    DWORD dwVar4 = 0;    DWORD eax = 0;    DWORD ebx = 0;    DWORD ecx = 0;    DWORD edx = 0;    DWORD esi = 0;    DWORD edi = 0;    DWORD dwTmp = 0;    BOOL bTmp = FALSE;    //    //                         push    ebp    //                         mov     ebp, esp    //                         sub     esp, 10h    //                         mov     eax, dword_1056DA8    eax = g.dword_1056DA8;    //                         push    ebx    //                         push    esi    //                         push    edi    //                         lea     ecx, ds:0FFFFFFFFh[eax*2]    // 00AB38EE  |.  8D0C45 FFFFFF>lea ecx,dword ptr ds:[eax*2-0x1]    ecx = eax * 2 - 1;    //                         inc     eax    eax++;    //                         mov     dword_1056C14, ecx    g.dword_1056C14 = ecx;    //                         mov     [ebp+var_10], eax    dwVar10 = eax;    //                         cmp     eax, ecx    //                         jg      loc_10339B5    if (eax <= ecx) {        //                         mov     ebx, [ebp+var_10]        ebx = dwVar10;        //                         lea     edx, [eax-1]        edx = eax - 1;        //                         shl     eax, 4        eax <<= 4;        //                         add     eax, offset dwAddrBufBegin_1056FC4        eax += (DWORD)g.g_ucAry_0x1056FC4;        //                         mov     [ebp+var_4], edx        dwVar4 = edx;        //                         mov     [ebp+var_8], eax        dwVar8 = eax;        do {            //                         mov     esi, 30h            esi = 0x30;            //                         mov     edi, esi            edi = esi;            //                         lea     ecx, [esi-2Fh]            ecx = esi - 0x2f;            //                         cmp     edx, ecx            //                         jl      short loc_1033961            if (edx >= ecx) {                //                         mov     eax, [ebp+var_4]                eax = dwVar4;                //                         mov     edx, offset unk_1056FD0                edx = (int)g.g_ucAry_0x1056FC4 + (0x1056FD0 - 0x1056FC4);                //                //         loc_1033936:                            ; CODE XREF: fnCalcReSn2_10338E0+7F.j                //                         cmp     dword ptr [edx+0Ch], 0                //                         jnz     short loc_1033959                do {                    if (0 == *(DWORD*)(edx + 0xC)) {                        //                         mov     eax, [edx]                        eax = *(DWORD*)edx;                        //                         cmp     eax, edi                        //                         jge     short loc_103394E                        if (eax < edi) {                            //                         mov     ebx, [ebp+var_C]                            ebx = dwVarC;                            //                         mov     esi, edi                            esi = edi;                            //                         mov     edi, eax                            edi = eax;                            //                         mov     [ebp+var_C], ecx                            dwVarC = ecx;                            //                         jmp     short loc_1033956                            //         ; ---------------------------------------------------------------------------                            //                        } else {                            // loc_103394E:                            //    ;                            //         loc_103394E:                            ; CODE XREF: fnCalcReSn2_10338E0+60.j                            //                         cmp     eax, esi                            //                         jge     short loc_1033956                            if (eax < esi) {                                //                         mov     esi, eax                                esi = eax;                                //                         mov     ebx, ecx                                ebx = ecx;                                //                            }                        }                        //         loc_1033956:                            ; CODE XREF: fnCalcReSn2_10338E0+6C.j                        //                                                 ; fnCalcReSn2_10338E0+70.j                        //                         mov     eax, [ebp+var_4]                        eax = dwVar4;                        //                    }                    //         loc_1033959:                            ; CODE XREF: fnCalcReSn2_10338E0+5A.j                    //                         inc     ecx                    //                         add     edx, 10h                    ecx++;                    edx += 0x10;                    //                         cmp     ecx, eax                    //                         jle     short loc_1033936                    //                } while (ecx <= eax);            }            //         loc_1033961:                            ; CODE XREF: fnCalcReSn2_10338E0+4C.j            //                         mov     esi, [ebp+var_C]            esi = dwVarC;            //                         mov     ecx, ebx            ecx = ebx;            //                         mov     edi, [ebp+var_8]            edi = dwVar8;            //                         mov     edx, esi            edx = esi;            //                         shl     ecx, 4            ecx <<= 4;            //                         shl     edx, 4            edx <<= 4;            //                         mov     eax, dword_1056FC0[ecx]            eax = *((DWORD*)((DWORD)g.dword_1056FC0 + ecx));            //                         add     eax, dword_1056FC0[edx]            eax += *((DWORD*)((DWORD)g.dword_1056FC0 + edx));            //                         mov     [edi-4], eax            *(DWORD*)(edi - 4) = eax;            //                         mov     eax, edi            eax = edi;            //                         mov     [eax], esi            *(DWORD*)eax = esi;            //                         mov     esi, [ebp+var_10]            esi = dwVar10;            //                         mov     [eax+4], ebx            *(DWORD*)(eax + 4) = ebx;            //                         add     eax, 10h            eax += 0x10;            //                         mov     dword_1056FCC[ecx], esi            // 00AB398D  |.  89B1 CC6FAD00 |mov dword ptr ds:[ecx+<dword_1056FCC>],esi            *(DWORD*)((DWORD)g.dword_1056FC0 + 0xC + ecx) = esi;            //                         mov     ecx, dword_1056C14            ecx = g.dword_1056C14;            //                         mov     dword_1056FCC[edx], esi            *(DWORD*)((DWORD)g.dword_1056FC0 + 0xC + edx) = esi;            //                         inc     esi            esi++;            //                         mov     edx, [ebp+var_4]            edx = dwVar4;            //                         inc     edx            edx++;            //                         mov     [ebp+var_10], esi            dwVar10 = esi;            //                         mov     [ebp+var_4], edx            dwVar4 = edx;            //                         mov     [ebp+var_8], eax            dwVar8 = eax;            //                         cmp     esi, ecx            //                         jle     loc_1033920            //        } while (esi <= ecx);    }    //         loc_10339B5:                            ; CODE XREF: fnCalcReSn2_10338E0+21.j    //                         mov     ebx, 1    ebx = 1;    //                         mov     [ebp+var_10], ebx    dwVar10 = ebx;    //                         cmp     dword_1056DA8, ebx    //                         jl      short loc_1033A3B    if (g.dword_1056DA8 >= ebx) {        //                         mov     edx, dword_1056DA8        edx = g.dword_1056DA8;        //                         lea     edi, [ebx+0Bh]        edi = ebx + 0xB;        //                         mov     eax, offset unk_1056DE4        eax = (DWORD)g.g_ucAry_0x1056DB8 + (0x1056DE4 - 0x1056DB8);        //        //         loc_10339D3:                            ; CODE XREF: fnCalcReSn2_10338E0+159.j        do {            //                         mov     esi, ebx            esi = ebx;            //                         cmp     ebx, ecx            //                         jz      short loc_1033A2D            if (ebx != ecx) {                //                         mov     ebx, dword_1056C14                ebx = g.dword_1056C14;                //                         nop                //                do {                    //         loc_10339E0:                            ; CODE XREF: fnCalcReSn2_10338E0+13C.j                    //                         mov     ecx, esi                    ecx = esi;                    //                         shl     ecx, 4                    ecx <<= 4;                    //                         mov     edx, dword_1056FCC[ecx]                    edx = *((DWORD*)((DWORD)g.dword_1056FC0 + 0xC + ecx));                    //                         mov     ecx, edx                    ecx = edx;                    //                         shl     ecx, 4                    ecx <<= 4;                    //                         cmp     dwAddrBufBegin_1056FC4[ecx], esi                    bTmp = (*(DWORD*)((DWORD)g.g_ucAry_0x1056FC4 + ecx) == esi);                    //                         mov     ecx, [eax]                    ecx = *(DWORD*)eax;                    if (bTmp) {                        //                         jnz     short loc_1033A09                        //                         add     ecx, edi                        ecx += edi;                        //                         mov     dword_1056DB8[ecx*4], 0                        *(DWORD*)((DWORD)g.g_ucAry_0x1056DB8 + ecx * 4) = 0;                        //                         jmp     short loc_1033A16                        //         ; ---------------------------------------------------------------------------                        //                    } else {                        //         loc_1033A09:                            ; CODE XREF: fnCalcReSn2_10338E0+118.j                        //                         add     ecx, edi                        ecx += edi;                        //                         mov     dword_1056DB8[ecx*4], 1                        *(DWORD*)((DWORD)g.g_ucAry_0x1056DB8 + ecx * 4) = 1;                        //                    }                    //         loc_1033A16:                            ; CODE XREF: fnCalcReSn2_10338E0+127.j                    //                         inc     dword ptr [eax]                    *(DWORD*)eax = *(DWORD*)eax + 1;                    //                         mov     esi, edx                    esi = edx;                    //                         cmp     edx, ebx                    //                         jnz     short loc_10339E0                } while (edx != ebx);                //                         mov     ebx, [ebp+var_10]                ebx = dwVar10;                //                         mov     ecx, dword_1056C14                ecx = g.dword_1056C14;                //                         mov     edx, dword_1056DA8                edx = g.dword_1056DA8;                //            }            //         loc_1033A2D:                            ; CODE XREF: fnCalcReSn2_10338E0+F7.j            //                         inc     ebx            ebx++;            //                         add     edi, 0Ch            edi += 0xC;            //                         add     eax, 30h            eax += 0x30;            //                         mov     [ebp+var_10], ebx            dwVar10 = ebx;        } while (ebx <= edx);        //                         cmp     ebx, edx        //                         jle     short loc_10339D3    }    //         loc_1033A3B:                            ; CODE XREF: fnCalcReSn2_10338E0+E3.j    //                         pop     edi    //                         pop     esi    //                         pop     ebx    //                         mov     esp, ebp    //                         pop     ebp    //                         retn    //         fnCalcReSn2_10338E0 endp    return (int*)eax;}
0 0