反汇编练习-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
- 反汇编练习-2016-1130
- ARM反汇编练习
- 反汇编练习-20170111
- 反汇编练习-20170113
- 反汇编练习-20170121
- 反汇编练习20170311
- x86反汇编练习-20161120
- 反汇编练习2017-0123
- 反汇编练习-20170124a
- 反汇编练习20170312a
- 三 练习反汇编C语言程序
- 反汇编个人练习:不用循环语句实现循环操作
- [反汇编练习] 160个CrackMe之001
- 做ARM反汇编练习的环境配置
- 反汇编
- 反汇编
- 反汇编
- 反汇编
- C程序内存分布(译)
- 安装QT 5.6 与 VS 2015
- VC++ Runtime Error 异常捕获之不挂的程序
- VC++一些开发心得与调试技巧
- VS 2005使用map文件查找程序崩溃原因
- 反汇编练习-2016-1130
- int abs(int n)实现对比
- 打印C程序的自身源代码(译)
- 【REACT NATIVE 系列教程之五】NAVIGATOR(页面导航)的基本使用与传参
- Bot Framework 核心概念:开始一个对话
- 视频播放(一)
- ma2个线 和交叉颜色 mt5
- mac shell 脚本书写 跨文件压缩 ,生产打包
- C语言一些有趣的现象(例子) (译)