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