逆向工程核心原理之第八章关于加密部分的个人理解
下面是加密的循环代码的个人理解 CPU Disasm Address Hex dump Command Comments 00403197 |> /85C0 /TEST EAX,EAX 00403199 |. |0F84 06010000 |JZ 004032A5 测试EAX的值,如果为0就退出这个循环 0040319F |. |8D95 64FFFFFF |LEA EDX,[EBP-9C] 004031A5 |. |8D45 DC |LEA EAX,[EBP-24] 将eax指向字符所在内存位置 004031A8 |. |52 |PUSH EDX 004031A9 |. |50 |PUSH EAX ; /Arg1 => OFFSET LOCAL.9 eax作为函数MSVBVM60.__vbaI4Var的参数 004031AA |. |C785 6CFFFFFF 01000 |MOV DWORD PTR SS:[EBP-94],1 ; | 004031B4 |. |89BD 64FFFFFF |MOV DWORD PTR SS:[EBP-9C],EDI ; | 设置整型数字1 004031BA |. |FF15 A8104000 |CALL DWORD PTR DS:[4010A8] ; \MSVBVM60.__vbaI4Var 将eax所在内存位置的值取回来放在eax中 004031C0 |. |8D4D 8C |LEA ECX,[EBP-74] 将ecx指向用户名字符串所在内存位置 004031C3 |. |50 |PUSH EAX 参数获取的位置 004031C4 |. |8D95 54FFFFFF |LEA EDX,[EBP-0AC] 存放结果位置 004031CA |. |51 |PUSH ECX 参数字符串 004031CB |. |52 |PUSH EDX 参数结果位置 004031CC |. |FFD3 |CALL EBX 调用函数rtcmidcharvar, eax为位置参数,ECX为名字字符串,edx保存结果内存地址 004031CE |. |8D95 54FFFFFF |LEA EDX,[EBP-0AC] 指向刚才获取的字母位置 004031D4 |. |8D4D AC |LEA ECX,[EBP-54] 将要保存字符的位置 004031D7 |. |FFD6 |CALL ESI 调用函数__vbaVarMove从 EDX指向内存拷贝到ECX指向内存位置 004031D9 |. |8D8D 64FFFFFF |LEA ECX,[EBP-9C] 004031DF |. |FF15 0C104000 |CALL DWORD PTR DS:[40100C] ; [MSVBVM60.__vbaFreeVar 004031E5 |. |8D45 AC |LEA EAX,[EBP-54] 把eax指向字符所在内存位置 004031E8 |. |8D8D 78FFFFFF |LEA ECX,[EBP-88] 004031EE |. |50 |PUSH EAX ; /Arg2 => OFFSET LOCAL.21 004031EF |. |51 |PUSH ECX ; |Arg1 => OFFSET LOCAL.34 004031F0 |. |FF15 80104000 |CALL DWORD PTR DS:[401080] ; \MSVBVM60.__vbaStrVarVal 获取eax所在的内存字符所在的地址 004031F6 |. |50 |PUSH EAX ; /Arg1 输入下面函数MSVBVM60.rtcAnsiValueBstr的参数 004031F7 |. |FF15 1C104000 |CALL DWORD PTR DS:[40101C] ; \MSVBVM60.rtcAnsiValueBstr 上述从内存地址中取出字符对应的assic值 004031FD |. |8D95 24FFFFFF |LEA EDX,[EBP-0DC] 将edx指向要保存字符的内存地址(下面再填写内容) 00403203 |. |8D4D AC |LEA ECX,[EBP-54] 指向字符所在位置 00403206 |. |66:8985 2CFFFFFF |MOV WORD PTR SS:[EBP-0D4],AX 0040320D |. |89BD 24FFFFFF |MOV DWORD PTR SS:[EBP-0DC],EDI 将实际的值填在 上述edx预定好的位置 00403213 |. |FFD6 |CALL ESI 调用函数__vbaVarMove从 EDX指向内存拷贝到ECX指向内存位置 00403215 |. |8D8D 78FFFFFF |LEA ECX,[EBP-88] 0040321B |. |FF15 CC104000 |CALL DWORD PTR DS:[4010CC] ; [MSVBVM60.__vbaFreeStr 00403221 |. |8D55 AC |LEA EDX,[EBP-54] 指向字母assic所在内存位置 00403224 |. |8D85 24FFFFFF |LEA EAX,[EBP-0DC] eax指向将要填入数值64的内存位置 0040322A |. |52 |PUSH EDX ; /Arg3 => OFFSET LOCAL.21 0040322B |. |8D8D 64FFFFFF |LEA ECX,[EBP-9C] ; | 指向将要保存加法结果的内存位置 00403231 |. |50 |PUSH EAX ; |Arg2 => OFFSET LOCAL.55 00403232 |. |51 |PUSH ECX ; |Arg1 => OFFSET LOCAL.39 00403233 |. |C785 2CFFFFFF 64000 |MOV DWORD PTR SS:[EBP-0D4],64 ; | 0040323D |. |89BD 24FFFFFF |MOV DWORD PTR SS:[EBP-0DC],EDI ; | 设置数值64的值 00403243 |. |FF15 AC104000 |CALL DWORD PTR DS:[4010AC] ; \MSVBVM60.__vbaVarAdd MSVBVM60.__vbaVarAdd进行相加,函数内结果保存到exc,返回时候同时结果也保存到eax 00403249 |. |8BD0 |MOV EDX,EAX 将edx指向eax所在内存地址,即字符assic的值所在内存地址 0040324B |. |8D4D AC |LEA ECX,[EBP-54] ecx指向将要保存结果的内存位置 0040324E |. |FFD6 |CALL ESI 调用函数__vbaVarMove从 EDX指向内存拷贝到ECX指向内存位置,这样就保存到了EBP-54的位置 00403250 |. |8D55 AC |LEA EDX,[EBP-54] EDX指向字母assic值所在内存地址 00403253 |. |8D85 64FFFFFF |LEA EAX,[EBP-9C] 将要保存的结果的内存位置 00403259 |. |52 |PUSH EDX ; /Arg2 => OFFSET LOCAL.21 0040325A |. |50 |PUSH EAX ; |Arg1 => OFFSET LOCAL.39 0040325B |. |FF15 94104000 |CALL DWORD PTR DS:[401094] ; \MSVBVM60.rtcHexVarFromVar 将字母的assic数值转化为字符 00403261 |. |8D95 64FFFFFF |LEA EDX,[EBP-9C] 指向上一步得到的字母内存位置 00403267 |. |8D4D AC |LEA ECX,[EBP-54] 指向新的要保存字母的内存位置 0040326A |. |FFD6 |CALL ESI 调用函数__vbaVarMove从 EDX指向内存拷贝到ECX指向内存位置,这样就保存到了EBP-54的位置 0040326C |. |8D4D BC |LEA ECX,[EBP-44] 0040326F |. |8D55 AC |LEA EDX,[EBP-54] 00403272 |. |51 |PUSH ECX ; /Arg3 => OFFSET LOCAL.17 00403273 |. |8D85 64FFFFFF |LEA EAX,[EBP-9C] ; | 00403279 |. |52 |PUSH EDX ; |Arg2 => OFFSET LOCAL.21 0040327A |. |50 |PUSH EAX ; |Arg1 => OFFSET LOCAL.39 0040327B |. |FF15 84104000 |CALL DWORD PTR DS:[401084] ; \MSVBVM60.__vbaVarCat vbavarcat连接字符串eax = ecx + edx 00403281 |. |8BD0 |MOV EDX,EAX 00403283 |. |8D4D BC |LEA ECX,[EBP-44] 00403286 |. |FFD6 |CALL ESI 调用函数__vbaVarMove把结果保存到EBP-44 00403288 |. |8D8D BCFEFFFF |LEA ECX,[EBP-144] 0040328E |. |8D95 CCFEFFFF |LEA EDX,[EBP-134] 00403294 |. |51 |PUSH ECX ; /Arg3 => OFFSET LOCAL.81 00403295 |. |8D45 DC |LEA EAX,[EBP-24] ; | 00403298 |. |52 |PUSH EDX ; |Arg2 => OFFSET LOCAL.77 00403299 |. |50 |PUSH EAX ; |Arg1 => OFFSET LOCAL.9 0040329A |. |FF15 C0104000 |CALL DWORD PTR DS:[4010C0] ; \MSVBVM60.__vbaVarForNext 函数__vbaVarForNext将EAX指向的内存值加1 004032A0 |.^\E9 F2FEFFFF \JMP 00403197