shuai 的个人资料娱乐精神照片日志 工具 帮助
2007/12/14

强暴.Net程序集 之十三 (反汇编之反汇编输出)

 
警告:本系列文章为本人原创,只作技术研究之用,您可以引用链接传播,禁止其它的转载方式,禁止用于商业或非法目的, 对于造成的一切后果本人概不负责
 
    首先, 得到当前的指令, 注意处理双字节的情况(以0xFE开始的字节)

    BYTE b = source[index];
    index++;
    if(IsPrefix(b))
    {
        b = source[index];
        index++;
        current = (opcode)twoByteOpcodes[b];
    }
    else
    {
        current = (opcode)oneByteOpcodes[b];
    }
 
    直接输出current的Instruction成员就是当前指令的字符串表示
 
    然后, 根据类型, 得到操作数

    switch(current.Type())
    {
    case Switch:
        switchCount = *((DWORD*)&source[index]);
        index += 4;
        operand = &source[index];
        index += switchCount * sizeof(DWORD);
        break;
    case Token:
        operand = &source[index];
        break;
    case Branch:
        operand = &source[index];
        index += current.OperandSize();
        break;
    case Index:
        operand = &source[index];
        index += current.OperandSize();
        break;
    case Value:
        operand = &source[index];
        index += current.OperandSize();
        break;
    }
 
    对于 Token和Value类型的操作数应该以16进制字符串形式输出, 可能引用了其它表比如MethodRef中的方法Token, 或是字符串流的Token
    对于Branch类型它是方法内的指令相对地址, 在ildasm以IL_000000X形式输出
 
    最后, 不断移动index, 得到下一条指令, 这样就可以完成整个方法的反汇编输出

 

评论 (4)

请稍候...
很抱歉,您输入的评论太长。请缩短您的评论。
您没有输入任何内容,请重试。
很抱歉,我们当前无法添加您的评论。请稍后重试。
若要添加评论,需要您的家长授予您相应权限。请求权限
您的家长禁用了评论功能。
很抱歉,我们当前无法删除您的评论。请稍后重试。
您已超过了一天之内允许提供的评论数上限。请在 24 小时后重试。
因为我们的系统表明您可能在向其他用户提供垃圾评论,您的帐户已禁用了评论功能。如果您认为我们错误地禁用了您的帐户,请联系 Windows Live 支持部门
完成下面的安全检查,您提供评论的过程才能完成。
您在安全检查中键入的字符必须与图片或音频中的字符一致。

若要添加评论,请使用您的 Windows Live ID 登录(如果您使用过 Hotmail、Messenger 或 Xbox LIVE,您就拥有 Windows Live ID)。登录


还没有 Windows Live ID 吗?请注册

yangshuai发表:
我最近负责公司产品研发,不会太深入这方面了,而且比较忙,希望你能发这个hotmail邮箱同我联系
 
1 月 29 日
匿名 的图片
seven 发表:
我对这方面很感兴趣,能否告诉我你的MSN?有些问题想向你请教。
1 月 22 日
yangshuai发表:
我确实是从"五"开始写的, 本来想过几天补上,不过最近没心情了...
1 月 22 日
匿名 的图片
seven 发表:
这个系列的文章怎么是从“五”开始?找了n久没找到起始的文章。
1 月 20 日

引用通告

此日志的引用通告 URL 是:
http://iauhsgnay.spaces.live.com/blog/cns!C7C5DB6D46321CDD!452.trak
引用此项的网络日志