逆向工程核心原理之第八章关于加密部分的个人理解


下面是加密的循环代码的个人理解
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