注册 登录
自由的生活_软路由 返回首页

心想事成的个人空间 https://www.routerclub.com/?681 [收藏] [复制] [分享] [RSS]

日志

把ida的汇编代码扒到VC中

已有 308 次阅读2010-11-10 11:23 |

有时候把汇编的算法还原成C代码是一件令人头大的事,
索性直接从ida的反汇编代码中扒出来用
但是我不习惯用masm写代码,还是喜欢用VC,那怎么办呢?
当然是扒到VC中了.

先把IDA中的反汇编代码复制到一个文本文件里面,然后跑一段replace.pl,把前面的.data:0042E76C等无用代码去掉
Code:


my $infile
;
my $outfile
;
my $line
;

printf "请输入文件名:"
;
chop($infile =<STDIN
> );
open(READ_FILE, "<$infile"
);
$outfile = $infile.".asm"
;
open(WRITE_FILE, ">$outfile"
);


foreach
$line (<READ_FILE
> )
{
    
#去除ida汇编代码前面的东西
    
$line =~ s/^.data:[0-9A-F]{8,8}
//;
    
printf(WRITE_FILE "$line"
);    
}

close(READ_FILE
);
close(WRITE_FILE
);




然后把过滤后的asm代码复制到c文件中
一般我们的做法是放到一个函数中用
__asm
{ }进行包裹
但是vc所生成的函数代码都要进行栈帧和返回处理
也就是产生
push ebp
mov ebp,esp

pop ebp
ret 类似的代码,
这个是我们广大中国人民所不愿意看到滴

幸好VC还有__declspec(naked) 参数,放在你指定的函数前,可以让函数"裸奔" :-P 例如:
Code:


#include <stdio.h>
__declspec(naked) void test(char* msg
)
{
    
printf(msg
);
}

void main
()
{
    
test("hello world\n"
);
}


用Ollydbg看生成的汇编代码,可以看到test函数是"裸"的
Code:


00401000  
/$  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
00401003  |.  50            PUSH EAX                                 ; |
format
00401004  
|.  FF15 00204000 CALL DWORD PTR DS:[<&MSVCRT.printf>]     ;
printf
0040100A  
|.  83C4 04       ADD ESP,
4
0040100D  
|$  
55            PUSH EBP
0040100E  
|.  8BEC          MOV EBP,
ESP
00401010  
|.  68 10304000   PUSH naked.00403010                      ;  ASCII
"hello world\n"
00401015  |.  
E8 E6FFFFFF   CALL naked.00401000
0040101A  
|.  83C4 04       ADD ESP,
4
0040101D  
|.  
5D            POP EBP
0040101E  
.  
C3            RETN



好了,剩下的我们要做的工作就是搞清楚被扒代码的函数参数个数和入栈顺序,写个函数声明,然后把反汇编代码填到里面,
PS: 差点忘了说ida中的参数替换怎么处理
Code:


.text:0040F100 var_C           = dword ptr -0Ch
.text:0040F100 var_8           = byte ptr -
8
.text:0040F100 arg_0           =
dword ptr  4
.text:
0040F100


写成C的宏,然后放在拔出代码前面即可,最终如下:
Code:


__declspec
(naked) void codec(unsigned char* Input, unsigned int size, unsigned char* Key)
{
  
__asm
  
{
#define var_C            -0Ch
#define var_8           -8
#define arg_0            4
  //
  // 添加扒出的代码
//
#undef var_C
#undef var_8
#undef arg_0
  
}
}


路过

雷人

握手

鲜花

鸡蛋

发表评论 评论 (1 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

QQ|Archiver|手机版|小黑屋|软路由 ( 渝ICP备15001194号-1|渝公网安备 50011602500124号 )

GMT+8, 2026-3-10 07:15 , Processed in 0.028022 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

返回顶部