对于汇编忘光了,看得不太理解,希望各位大神帮忙看看这个算法

一把编程的菜刀 2014-10-25 11:07:17

0049DD11 85C0 test eax,eax
0049DD13 0F84 5C020000 je 测试.0049DF75
0049DD19 8D45 98 lea eax,dword ptr ss:[ebp-0x68]
0049DD1C 8D4D DC lea ecx,dword ptr ss:[ebp-0x24]
0049DD1F 50 push eax
0049DD20 51 push ecx
0049DD21 C785 50FFFFFF B>mov dword ptr ss:[ebp-0xB0],测试.0040C>; &H
0049DD2B C785 48FFFFFF 0>mov dword ptr ss:[ebp-0xB8],0x8
0049DD35 895D A0 mov dword ptr ss:[ebp-0x60],ebx
0049DD38 895D 98 mov dword ptr ss:[ebp-0x68],ebx
0049DD3B FF15 C8114000 call dword ptr ds:[<&MSVBVM60.__vbaI4Var>; msvbvm60.__vbaI4Var
0049DD41 8B55 14 mov edx,dword ptr ss:[ebp+0x14]
0049DD44 50 push eax;从第几位开始,这里第一次是从第3个开始
0049DD45 8B02 mov eax,dword ptr ds:[edx]
0049DD47 50 push eax
0049DD48 FF15 BC104000 call dword ptr ds:[<&MSVBVM60.#631>] ; msvbvm60.rtcMidCharBstr;从第几位开始截取2个字符。得出eax=E0(第一次截取)
0049DD4E 8D4D 88 lea ecx,dword ptr ss:[ebp-0x78]
0049DD51 8D95 78FFFFFF lea edx,dword ptr ss:[ebp-0x88]
0049DD57 51 push ecx
0049DD58 52 push edx
0049DD59 8945 90 mov dword ptr ss:[ebp-0x70],eax
0049DD5C C745 88 0800000>mov dword ptr ss:[ebp-0x78],0x8
0049DD63 FF15 AC104000 call dword ptr ds:[<&MSVBVM60.#520>] ; msvbvm60.rtcTrimVar
0049DD69 8D85 48FFFFFF lea eax,dword ptr ss:[ebp-0xB8]
0049DD6F 8D8D 78FFFFFF lea ecx,dword ptr ss:[ebp-0x88]
0049DD75 50 push eax
0049DD76 8D95 68FFFFFF lea edx,dword ptr ss:[ebp-0x98]
0049DD7C 51 push ecx
0049DD7D 52 push edx
0049DD7E FFD6 call esi ; msvbvm60.__vbaVarAdd 跟&H连接组合字符串&HE0
0049DD80 50 push eax
0049DD81 8D45 AC lea eax,dword ptr ss:[ebp-0x54]
0049DD84 50 push eax
0049DD85 FF15 60114000 call dword ptr ds:[<&MSVBVM60.__vbaStrVa>; msvbvm60.__vbaStrVarVal 把字符转ascii码 从字符串特点位置上获取其值
0049DD8B 50 push eax;&HE0
0049DD8C FF15 2C124000 call dword ptr ds:[<&MSVBVM60.#581>] ; msvbvm60.rtcR8ValFromBstr //把字符串转换成浮点数
0049DD92 FF15 E0114000 call dword ptr ds:[<&MSVBVM60.__vbaFpI2>>; msvbvm60.__vbaFpI2
0049DD98 8D4D AC lea ecx,dword ptr ss:[ebp-0x54]
0049DD9B 8945 B0 mov dword ptr ss:[ebp-0x50],eax
0049DD9E FF15 28124000 call dword ptr ds:[<&MSVBVM60.__vbaFreeS>; msvbvm60.__vbaFreeStr
0049DDA4 8D8D 68FFFFFF lea ecx,dword ptr ss:[ebp-0x98]
0049DDAA 8D95 78FFFFFF lea edx,dword ptr ss:[ebp-0x88]
0049DDB0 51 push ecx
0049DDB1 8D45 88 lea eax,dword ptr ss:[ebp-0x78]
0049DDB4 52 push edx
0049DDB5 8D4D 98 lea ecx,dword ptr ss:[ebp-0x68]
0049DDB8 50 push eax
0049DDB9 51 push ecx
0049DDBA 6A 04 push 0x4
0049DDBC FF15 34104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeV>; msvbvm60.__vbaFreeVarList
0049DDC2 83C4 14 add esp,0x14
0049DDC5 66:3B7D B4 cmp di,word ptr ss:[ebp-0x4C]
0049DDC9 7D 0C jge 测试.0049DDD7
0049DDCB 66:83C7 01 add di,0x1
0049DDCF 0F80 62020000 jo 测试.0049E037
0049DDD5 EB 05 jmp 测试.0049DDDC
0049DDD7 BF 01000000 mov edi,0x1
0049DDDC 8B4D 10 mov ecx,dword ptr ss:[ebp+0x10]
0049DDDF 8D55 98 lea edx,dword ptr ss:[ebp-0x68]
0049DDE2 0FBFC7 movsx eax,di
0049DDE5 52 push edx
0049DDE6 8B11 mov edx,dword ptr ds:[ecx];ecx的值是机器码后8位
0049DDE8 50 push eax;eax=1;
0049DDE9 52 push edx;机器码后8位
0049DDEA C745 A0 0100000>mov dword ptr ss:[ebp-0x60],0x1
0049DDF1 895D 98 mov dword ptr ss:[ebp-0x68],ebx
0049DDF4 FF15 BC104000 call dword ptr ds:[<&MSVBVM60.#631>] ; msvbvm60.rtcMidCharBstr;从第一个开始截取,每次截取1个字符
0049DDFA 8BD0 mov edx,eax;
0049DDFC 8D4D AC lea ecx,dword ptr ss:[ebp-0x54]
0049DDFF FF15 00124000 call dword ptr ds:[<&MSVBVM60.__vbaStrMo>; msvbvm60.__vbaStrMove
0049DE05 50 push eax
0049DE06 FF15 40104000 call dword ptr ds:[<&MSVBVM60.#516>] ; msvbvm60.rtcAnsiValueBstr;把字符转为数据,在eax反馈结果
0049DE0C 8B4D B0 mov ecx,dword ptr ss:[ebp-0x50]
0049DE0F 8D95 48FFFFFF lea edx,dword ptr ss:[ebp-0xB8]
0049DE15 33C1 xor eax,ecx
0049DE17 8D4D C4 lea ecx,dword ptr ss:[ebp-0x3C];
0049DE1A 66:8985 50FFFFF>mov word ptr ss:[ebp-0xB0],ax;
0049DE21 899D 48FFFFFF mov dword ptr ss:[ebp-0xB8],ebx
0049DE27 FF15 18104000 call dword ptr ds:[<&MSVBVM60.__vbaVarMo>; msvbvm60.__vbaVarMove
0049DE2D 8D4D AC lea ecx,dword ptr ss:[ebp-0x54]
0049DE30 FF15 28124000 call dword ptr ds:[<&MSVBVM60.__vbaFreeS>; msvbvm60.__vbaFreeStr;把字符串参数的内存回收 //释放字符串变量
0049DE36 8D4D 98 lea ecx,dword ptr ss:[ebp-0x68];
0049DE39 FF15 1C104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeV>; msvbvm60.__vbaFreeVar //释放对象变量
0049DE3F 66:8B45 BC mov ax,word ptr ss:[ebp-0x44];
0049DE43 8D4D C4 lea ecx,dword ptr ss:[ebp-0x3C];
0049DE46 8D95 58FFFFFF lea edx,dword ptr ss:[ebp-0xA8]
0049DE4C 51 push ecx
0049DE4D 52 push edx
0049DE4E 66:8985 60FFFFF>mov word ptr ss:[ebp-0xA0],ax
0049DE55 C785 58FFFFFF 0>mov dword ptr ss:[ebp-0xA8],0x8002
0049DE5F FF15 6C104000 call dword ptr ds:[<&MSVBVM60.__vbaVarTs>; msvbvm60.__vbaVarTstLe
0049DE65 66:85C0 test ax,ax
0049DE68 74 5A je 测试.0049DEC4
0049DE6A 66:8B45 BC mov ax,word ptr ss:[ebp-0x44]
0049DE6E 8D8D 58FFFFFF lea ecx,dword ptr ss:[ebp-0xA8]
0049DE74 66:8985 50FFFFF>mov word ptr ss:[ebp-0xB0],ax
0049DE7B 8D55 C4 lea edx,dword ptr ss:[ebp-0x3C]
0049DE7E 51 push ecx
0049DE7F 8D45 98 lea eax,dword ptr ss:[ebp-0x68]
0049DE82 52 push edx
0049DE83 50 push eax
0049DE84 C785 60FFFFFF F>mov dword ptr ss:[ebp-0xA0],0xFF
0049DE8E 899D 58FFFFFF mov dword ptr ss:[ebp-0xA8],ebx
0049DE94 899D 48FFFFFF mov dword ptr ss:[ebp-0xB8],ebx
0049DE9A FFD6 call esi;vbaVarAdd ->两个变量值相加
0049DE9C 8D8D 48FFFFFF lea ecx,dword ptr ss:[ebp-0xB8]
0049DEA2 50 push eax
0049DEA3 8D55 88 lea edx,dword ptr ss:[ebp-0x78]
0049DEA6 51 push ecx
0049DEA7 52 push edx
0049DEA8 FF15 04104000 call dword ptr ds:[<&MSVBVM60.__vbaVarSu>; msvbvm60.__vbaVarSub 变量相减,在eax中返回
0049DEAE 8BD0 mov edx,eax
0049DEB0 8D4D C4 lea ecx,dword ptr ss:[ebp-0x3C]
0049DEB3 FF15 18104000 call dword ptr ds:[<&MSVBVM60.__vbaVarMo>; msvbvm60.__vbaVarMove
0049DEB9 8D4D 98 lea ecx,dword ptr ss:[ebp-0x68]
0049DEBC FF15 1C104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeV>; msvbvm60.__vbaFreeVar
0049DEC2 EB 31 jmp 测试.0049DEF5
0049DEC4 66:8B45 BC mov ax,word ptr ss:[ebp-0x44]
0049DEC8 8D4D C4 lea ecx,dword ptr ss:[ebp-0x3C]
0049DECB 66:8985 60FFFFF>mov word ptr ss:[ebp-0xA0],ax
0049DED2 8D95 58FFFFFF lea edx,dword ptr ss:[ebp-0xA8]
0049DED8 51 push ecx
0049DED9 8D45 98 lea eax,dword ptr ss:[ebp-0x68]
0049DEDC 52 push edx
0049DEDD 50 push eax
0049DEDE 899D 58FFFFFF mov dword ptr ss:[ebp-0xA8],ebx
0049DEE4 FF15 04104000 call dword ptr ds:[<&MSVBVM60.__vbaVarSu>; msvbvm60.__vbaVarSub
0049DEEA 8BD0 mov edx,eax
0049DEEC 8D4D C4 lea ecx,dword ptr ss:[ebp-0x3C]
0049DEEF FF15 18104000 call dword ptr ds:[<&MSVBVM60.__vbaVarMo>; msvbvm60.__vbaVarMove 变体变量赋值(一般用于数值变量) 把变量1赋值给变量2
0049DEF5 8B4D B8 mov ecx,dword ptr ss:[ebp-0x48];把上一个算出来的值赋给ecx;第一次是为空,第二次是明码的是第一个
0049DEF8 8D55 C4 lea edx,dword ptr ss:[ebp-0x3C]
0049DEFB 52 push edx
0049DEFC 898D 60FFFFFF mov dword ptr ss:[ebp-0xA0],ecx
0049DF02 C785 58FFFFFF 0>mov dword ptr ss:[ebp-0xA8],0x8
0049DF0C FF15 C8114000 call dword ptr ds:[<&MSVBVM60.__vbaI4Var>; msvbvm60.__vbaI4Var 截取字符串
0049DF12 50 push eax
0049DF13 8D45 98 lea eax,dword ptr ss:[ebp-0x68]
0049DF16 50 push eax
0049DF17 FF15 54114000 call dword ptr ds:[<&MSVBVM60.#608>] ; msvbvm60.rtcVarBstrFromAnsi
0049DF23 8D55 98 lea edx,dword ptr ss:[ebp-0x68]
0049DF26 51 push ecx
0049DF27 8D45 88 lea eax,dword ptr ss:[ebp-0x78]
0049DF2A 52 push edx
0049DF2B 50 push eax
0049DF2C FFD6 call esi;vbaVarAdd ->两个变量值相加 把上次结算出来的值跟本次的值连接起来,比如第二次计算出来是4,本次计算出来是6,那么就是eax=46
0049DF2E 50 push eax
0049DF2F FF15 28104000 call dword ptr ds:[<&MSVBVM60.__vbaStrVa>; msvbvm60.__vbaStrVarMove
0049DF35 8BD0 mov edx,eax
0049DF37 8D4D B8 lea ecx,dword ptr ss:[ebp-0x48]
0049DF3A FF15 00124000 call dword ptr ds:[<&MSVBVM60.__vbaStrMo>; msvbvm60.__vbaStrMove
0049DF40 8D4D 88 lea ecx,dword ptr ss:[ebp-0x78]
0049DF43 8D55 98 lea edx,dword ptr ss:[ebp-0x68]
0049DF46 51 push ecx
0049DF47 52 push edx
0049DF48 53 push ebx
0049DF49 FF15 34104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeV>; msvbvm60.__vbaFreeVarList
0049DF4F 8B45 B0 mov eax,dword ptr ss:[ebp-0x50]
0049DF52 83C4 0C add esp,0xC
0049DF55 8D8D F8FEFFFF lea ecx,dword ptr ss:[ebp-0x108]
0049DF5B 8945 BC mov dword ptr ss:[ebp-0x44],eax
0049DF5E 8D95 08FFFFFF lea edx,dword ptr ss:[ebp-0xF8]
0049DF64 51 push ecx
0049DF65 8D45 DC lea eax,dword ptr ss:[ebp-0x24]
0049DF68 52 push edx
0049DF69 50 push eax
0049DF6A FF15 1C124000 call dword ptr ds:[<&MSVBVM60.__vbaVarFo>; msvbvm60.__vbaVarForNext 循环
0049DF70 ^ E9 9CFDFFFF jmp 测试.0049DD11
...全文
530 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Page-hy 2015-12-19
  • 打赏
  • 举报
回复
我只是路过,因为我不懂
  • 打赏
  • 举报
回复
引用 3 楼 u012564309 的回复:
[quote=引用 2 楼 chinmo 的回复:] 又是一个死版?
这个是你反汇编的? 怎么知道访问的函数功能呢 没有给上下文环境 有高人可以猜出来吗 0049DD48 FF15 BC104000 call dword ptr ds:[<&MSVBVM60.#631>] ; msvbvm60.rtcMidCharBstr;从第几位开始截取2个字符。得出eax=E0(第一次截取) 这个注释是你写的吗... 那 从第几位开始呢... 所以 这个算法 就像是 一个可能的循环的调用过程 有大神可以 仅仅通过 未知参数 和 未知过程 和 未知的 stack 推测出 是什么算法吗 要是有的话 可以做我师傅吗?[/quote] 这个能看懂上面的汇编跟我提供的这些应该可以推测出算法啊 我是看不懂上面的
  • 打赏
  • 举报
回复
这个算法部分,其实就是一个循环计算注册码这部分(E02360A7E1226E98FE1B799EF81B7990F51D7A)跟机器码后8位(14756169), 这个循环是每次读取2位注册码,跟1位机器码,来进行计算,机器码是循环重复读取的(就是说循环完读完一次,又从新开始读取,直到注册码全部读取完) 也就是下面的对应: E0 -> 1 23 -> 4 60 -> 7 A7 -> 5 E1 -> 6 22 -> 1 6E -> 6 98 -> 9 FE -> 1 1B -> 4 79 -> 7 9E -> 5 F8 -> 6 1B -> 1 79 -> 6 90 -> 9 F5 -> 1 1D -> 4 7A -> 7 每次循环都是利用什么的这个关系来进行比较以及各种运算
  • 打赏
  • 举报
回复
引用 3 楼 u012564309 的回复:
[quote=引用 2 楼 chinmo 的回复:] 又是一个死版?
这个是你反汇编的? 怎么知道访问的函数功能呢 没有给上下文环境 有高人可以猜出来吗 0049DD48 FF15 BC104000 call dword ptr ds:[<&MSVBVM60.#631>] ; msvbvm60.rtcMidCharBstr;从第几位开始截取2个字符。得出eax=E0(第一次截取) 这个注释是你写的吗... 那 从第几位开始呢... 所以 这个算法 就像是 一个可能的循环的调用过程 有大神可以 仅仅通过 未知参数 和 未知过程 和 未知的 stack 推测出 是什么算法吗 要是有的话 可以做我师傅吗?[/quote] 这部分就是算法啊, 我来说下我跟踪的一点数字:他首先读取注册码(9DE02360A7E1226E98FE1B799EF81B7990F51D7A)的前2位(9D),组合成十六进制 &H9D,转换成十进制9D=157,并且读取机器码,截取机器码(1214756169)后8位:14756169 然后开始进入上面那算法的循环,每次循环读取2位,步伐每次+2 首先读取E0,组合成十六进制:&HE0 转换成十进制:224 然后接着读取机器码后8位(14756169),每次读取1位,步伐+1,这里先读取1,这个1这里是图形,转换成16进制:31 在这里不知道他怎么处理的,得出一个数字209,用209跟上一个注册码的2位(9D)的十进制157比较大小,由于209比157大,所以直接进行减法:209-157=52,用52转成图形就是4,而十六进制就是34,他这里是取图形4,也就是得出明码第一位数字4 然后进行下一个循环 从第五位开始截取注册码的2位,即得到23,23组成十六进制&H23,十进制是35,接着从第二位开始截取机器码后8位(14756169)的1位,即得到4,这个4是图形,转换成16进制就是35 这里不知道他怎么计算得出了一个数字23,然后跟上一个注册码的2位(E0)的十进制224比较大小,犹豫23小于224,所以先进行加法,23+255=278,再用278跟224比较大小,278币224大,所以执行减法,278-224=54,54转成图形就是6,6正好就是明码的第二2
G-ben 2014-10-27
  • 打赏
  • 举报
回复
引用 2 楼 chinmo 的回复:
又是一个死版?
这个是你反汇编的? 怎么知道访问的函数功能呢 没有给上下文环境 有高人可以猜出来吗 0049DD48 FF15 BC104000 call dword ptr ds:[<&MSVBVM60.#631>] ; msvbvm60.rtcMidCharBstr;从第几位开始截取2个字符。得出eax=E0(第一次截取) 这个注释是你写的吗... 那 从第几位开始呢... 所以 这个算法 就像是 一个可能的循环的调用过程 有大神可以 仅仅通过 未知参数 和 未知过程 和 未知的 stack 推测出 是什么算法吗 要是有的话 可以做我师傅吗?
  • 打赏
  • 举报
回复
又是一个死版?
  • 打赏
  • 举报
回复
用户名:464201637 机器码:1214756169 注册码:9DE02360A7E1226E98FE1B799EF81B7990F51D7A 到期日期:2014-04-30 注册等级:03 明码:4642016370320140430 (明码实际就是由用户名,注册等级,以及到期日期组成的) 上面是信息,我只是看懂了一部分,望大神们解释一下具体的算法 上面就是算法代码,这段算法是从注册码(9DE02360A7E1226E98FE1B799EF81B7990F51D7A)的第三个开始的,也就是E02360A7E1226E98FE1B799EF81B7990F51D7A 这里开始计算,机器码(1214756169)他是取后8位,也就是14756169进行计算的 目前我能理解的是(注:也不知道对不对): 每次读取注册码(E02360A7E1226E98FE1B799EF81B7990F51D7A)的2位,跟&H组合行16进制, 机器码(14756169)的是每次读取一位,然后不知道通过什么计算得出明码的每一位,机器码是循环读取的,也就是说机器码逐个取完了,就从新开始逐个取,然后跟机器码得出的数字计算 上面就是我了解的,具体的他是怎么计算出明码的,没看出来,哪位大神指点一下啊

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧