编译器版本问题

owlpc 2007-02-12 08:12:41
正在逆向一程序.可以肯定的是:这程序是用VC++6.0开发的.
但我把反出来的程序再重新编译时,很多函数总有一点差别(不论我怎样改变编译设置).从汇编代码看,我怀疑我的编译器版本与它的不同.
我的CL编译器版本如下
产品版本 6.008168.0
文件版本 12.00.8168.0

现求与之不同的编译器.或提供下载地址!

我的Email是:owlpcb@163.com
...全文
291 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
stevphen 2007-02-14
  • 打赏
  • 举报
回复
学习
东文-桑晨 2007-02-14
  • 打赏
  • 举报
回复
jf~
owlpc 2007-02-13
  • 打赏
  • 举报
回复
另外,印证我的编译器版本比它高的证据还有:
在连续地进行_cdecl 类型函数调用时,它的堆栈恢复都是与函数一一对应的.有多条add esp+XX.

而我的却能将它合并,只用一条.
owlpc 2007-02-13
  • 打赏
  • 举报
回复
多谢ATField(field)提醒:
正确的写法是:
char retset[21] ;
memset(retstr, 0, sizeof(retstr)-1) ;
GetPrivateProfileString(
lpSectionName,lpKeyName,"0,0,0,0",retstr,sizeof(retstr)-1,lpFileName) ;

优化选项我已试过n种组合.
我具体的步骤是:先关闭所有的.然后根据需要一项一项地打开.
现在打开的选项都是必需的.因为有其它的函数为证.

从汇编代码来说,我生成的代码效率较高.所以怀疑我的编译器版本比它高.


ATField 2007-02-13
  • 打赏
  • 举报
回复
char retstr[21]应该是char retstr[20],因为原来的代码是push 14h

看第二段汇编代码在下面这段语句:
lpNumTypeAInfo->n1 = var34 ;
lpNumTypeAInfo->n2 = var30 ;
lpNumTypeAInfo->n3 = var2c ;
lpNumTypeAInfo->n4 = var28 ;
具体的汇编代码把赋值的顺序打乱了,而原来的代码并没有打乱赋值顺序,提示LZ在编译C++代码的时候可能打开了某个优化选项,建议试着关掉优化或者换用不同的优化选项再试试。当然,这也有可能是不同编译器版本在相同的编译选项下的结果不同导致的,很难直接推断。
owlpc 2007-02-12
  • 打赏
  • 举报
回复
这是反出来的源代码经编译后生成的汇编代码

sub_401490 ; int __cdecl sub_401490(int,LPCSTR lpAppName,LPCSTR lpKeyName,LPCSTR lpFileName)
sub_401490 sub_401490 proc near ; CODE XREF: sub_403130+85p
sub_401490
sub_401490 var_34 = dword ptr -34h
sub_401490 var_30 = dword ptr -30h
sub_401490 var_2C = dword ptr -2Ch
sub_401490 var_28 = dword ptr -28h
sub_401490 ReturnedString = byte ptr -24h
sub_401490 var_20 = dword ptr -20h
sub_401490 var_1C = dword ptr -1Ch
sub_401490 var_18 = dword ptr -18h
sub_401490 var_14 = dword ptr -14h
sub_401490 var_10 = byte ptr -10h
sub_401490 var_C = dword ptr -0Ch
sub_401490 var_4 = dword ptr -4
sub_401490 arg_0 = dword ptr 4
sub_401490 lpAppName = dword ptr 8
sub_401490 lpKeyName = dword ptr 0Ch
sub_401490 lpFileName = dword ptr 10h
sub_401490
sub_401490 6A FF push 0FFFFFFFFh
sub_401490+2 68 E0 38 40 00 push offset loc_4038E0
sub_401490+7 64 A1 00 00 00 00 mov eax, large fs:0
sub_401490+D 50 push eax
sub_401490+E 64 89 25 00 00 00 00 mov large fs:0, esp
sub_401490+15 83 EC 28 sub esp, 28h
sub_401490+18 56 push esi
sub_401490+19 33 C0 xor eax, eax
sub_401490+1B 8B 4C 24 48 mov ecx, [esp+38h+lpFileName]
sub_401490+1F 89 44 24 14 mov dword ptr [esp+38h+ReturnedString], eax
sub_401490+23 51 push ecx ; lpFileName
sub_401490+24 89 44 24 1C mov [esp+3Ch+var_20], eax
sub_401490+28 8B 4C 24 44 mov ecx, [esp+3Ch+lpAppName]
sub_401490+2C 89 44 24 20 mov [esp+3Ch+var_1C], eax
sub_401490+30 8D 54 24 18 lea edx, [esp+3Ch+ReturnedString]
sub_401490+34 89 44 24 24 mov [esp+3Ch+var_18], eax
sub_401490+38 6A 15 push 15h ; nSize
sub_401490+3A 89 44 24 2C mov [esp+40h+var_14], eax
sub_401490+3E 52 push edx ; lpReturnedString
sub_401490+3F 88 44 24 34 mov [esp+44h+var_10], al
sub_401490+43 8B 44 24 50 mov eax, [esp+44h+lpKeyName]
sub_401490+47 68 D4 60 40 00 push offset Default ; "0,0,0,0"
sub_401490+4C 50 push eax ; lpKeyName
sub_401490+4D 51 push ecx ; lpAppName
sub_401490+4E C7 44 24 4C 01 00 00 00 mov [esp+50h+var_4], 1
sub_401490+56 FF 15 40 40 40 00 call ds:GetPrivateProfileStringA
sub_401490+5C 8D 54 24 10 lea edx, [esp+38h+var_28]
sub_401490+60 8D 44 24 0C lea eax, [esp+38h+var_2C]
sub_401490+64 52 push edx
sub_401490+65 8D 4C 24 0C lea ecx, [esp+3Ch+var_30]
sub_401490+69 50 push eax
sub_401490+6A 8D 54 24 0C lea edx, [esp+40h+var_34]
sub_401490+6E 51 push ecx
sub_401490+6F 52 push edx
sub_401490+70 8D 44 24 24 lea eax, [esp+48h+ReturnedString]
sub_401490+74 68 C8 60 40 00 push offset s_DDDD ; "%d,%d,%d,%d"
sub_401490+79 50 push eax ; char *
sub_401490+7A FF 15 6C 43 40 00 call ds:sscanf
sub_401490+80 8B 74 24 54 mov esi, [esp+50h+arg_0]
sub_401490+84 8B 4C 24 1C mov ecx, [esp+50h+var_34]
sub_401490+88 8B 54 24 20 mov edx, [esp+50h+var_30]
sub_401490+8C 8B 44 24 24 mov eax, [esp+50h+var_2C]
sub_401490+90 89 0E mov [esi], ecx
sub_401490+92 8B 4C 24 28 mov ecx, [esp+50h+var_28]
sub_401490+96 89 4E 0C mov [esi+0Ch], ecx
sub_401490+99 83 C4 18 add esp, 18h
sub_401490+9C 8D 4C 24 40 lea ecx, [esp+38h+lpAppName]
sub_401490+A0 89 56 04 mov [esi+4], edx
sub_401490+A3 89 46 08 mov [esi+8], eax
sub_401490+A6 E8 A9 1D 00 00 call CString::~CString(void)
sub_401490+A6
sub_401490+AB 8D 4C 24 44 lea ecx, [esp+38h+lpKeyName]
sub_401490+AF C6 44 24 34 00 mov byte ptr [esp+38h+var_4], 0
sub_401490+B4 E8 9B 1D 00 00 call CString::~CString(void)
sub_401490+B4
sub_401490+B9 8D 4C 24 48 lea ecx, [esp+38h+lpFileName]
sub_401490+BD C7 44 24 34 FF FF FF FF mov [esp+38h+var_4], 0FFFFFFFFh
sub_401490+C5 E8 8A 1D 00 00 call CString::~CString(void)
sub_401490+C5
sub_401490+CA 8B 4C 24 2C mov ecx, [esp+38h+var_C]
sub_401490+CE 8B C6 mov eax, esi
sub_401490+D0 5E pop esi
sub_401490+D1 64 89 0D 00 00 00 00 mov large fs:0, ecx
sub_401490+D8 83 C4 34 add esp, 34h
sub_401490+DB C3 retn
sub_401490+DB
sub_401490+DB sub_401490 endp
owlpc 2007-02-12
  • 打赏
  • 举报
回复
这是我反出来的源代码

typedef struct tagNUMTYPEAINFO
{
UINT n1 ;
UINT n2 ;
UINT n3 ;
UINT n4 ;
} NUMTYPEAINFO ;
typedef NUMTYPEAINFO *PNUMTYPEAINFO ;
typedef NUMTYPEAINFO far *LPNUMTYPEAINFO ;

LPNUMTYPEAINFO _cdecl Fun_431330(LPNUMTYPEAINFO lpNumTypeAInfo, CString lpSectionName, CString lpKeyName, CString lpFileName)
{

int var34,var30,var2c,var28 ;
char retstr[21] ;

memset(retstr, 0, sizeof(retstr)) ;
GetPrivateProfileString(lpSectionName,lpKeyName,"0,0,0,0",retstr,sizeof(retstr),lpFileName) ;

sscanf(retstr,"%d,%d,%d,%d",&var34,&var30,&var2c,&var28) ;

lpNumTypeAInfo->n1 = var34 ;
lpNumTypeAInfo->n2 = var30 ;
lpNumTypeAInfo->n3 = var2c ;
lpNumTypeAInfo->n4 = var28 ;

return lpNumTypeAInfo ;
}
owlpc 2007-02-12
  • 打赏
  • 举报
回复
这是原代码(用IDA反出来的)

sub_431330 ; int __cdecl sub_431330(int,LPCSTR lpAppName,LPCSTR lpKeyName,LPCSTR lpFileName)
sub_431330 sub_431330 proc near ; CODE XREF: sub_401580+69p
sub_431330 ; sub_401580+D7p
sub_431330 ; sub_401580+143p
sub_431330 ; sub_401580+1AFp
sub_431330 ; sub_401580+21Bp
sub_431330 ; sub_401F40+6Ap ...
sub_431330
sub_431330 var_34 = dword ptr -34h
sub_431330 var_30 = dword ptr -30h
sub_431330 var_2C = dword ptr -2Ch
sub_431330 var_28 = dword ptr -28h
sub_431330 ReturnedString = byte ptr -24h
sub_431330 var_20 = dword ptr -20h
sub_431330 var_1C = dword ptr -1Ch
sub_431330 var_18 = dword ptr -18h
sub_431330 var_14 = dword ptr -14h
sub_431330 var_10 = byte ptr -10h
sub_431330 var_C = dword ptr -0Ch
sub_431330 var_4 = dword ptr -4
sub_431330 arg_0 = dword ptr 4
sub_431330 lpAppName = dword ptr 8
sub_431330 lpKeyName = dword ptr 0Ch
sub_431330 lpFileName = dword ptr 10h
sub_431330
sub_431330 000 6A FF push 0FFFFFFFFh
sub_431330+2 004 68 E0 D5 4B 00 push offset loc_4BD5E0
sub_431330+7 008 64 A1 00 00 00 00 mov eax, large fs:0
sub_431330+D 008 50 push eax
sub_431330+E 00C 64 89 25 00 00 00 00 mov large fs:0, esp
sub_431330+15 00C 83 EC 28 sub esp, 28h
sub_431330+18 034 56 push esi
sub_431330+19 038 33 C0 xor eax, eax
sub_431330+1B 038 8B 4C 24 48 mov ecx, [esp+38h+lpFileName]
sub_431330+1F 038 89 44 24 14 mov dword ptr [esp+38h+ReturnedString], eax
sub_431330+23 038 51 push ecx ; lpFileName
sub_431330+24 03C 89 44 24 1C mov [esp+3Ch+var_20], eax
sub_431330+28 03C 8B 4C 24 44 mov ecx, [esp+3Ch+lpAppName]
sub_431330+2C 03C 89 44 24 20 mov [esp+3Ch+var_1C], eax
sub_431330+30 03C 8D 54 24 18 lea edx, [esp+3Ch+ReturnedString]
sub_431330+34 03C 89 44 24 24 mov [esp+3Ch+var_18], eax
sub_431330+38 03C 6A 14 push 14h ; nSize
sub_431330+3A 040 89 44 24 2C mov [esp+40h+var_14], eax
sub_431330+3E 040 52 push edx ; lpReturnedString
sub_431330+3F 044 88 44 24 34 mov [esp+44h+var_10], al
sub_431330+43 044 8B 44 24 50 mov eax, [esp+44h+lpKeyName]
sub_431330+47 044 68 8C E9 4E 00 push offset Default ; "0,0,0,0"
sub_431330+4C 048 50 push eax ; lpKeyName
sub_431330+4D 04C 51 push ecx ; lpAppName
sub_431330+4E 050 C7 44 24 4C 01 00 00 00 mov [esp+50h+var_4], 1
sub_431330+56 050 FF 15 64 B1 4C 00 call ds:GetPrivateProfileStringA
sub_431330+5C 038 8D 54 24 10 lea edx, [esp+38h+var_28]
sub_431330+60 038 8D 44 24 0C lea eax, [esp+38h+var_2C]
sub_431330+64 038 52 push edx
sub_431330+65 03C 8D 4C 24 0C lea ecx, [esp+3Ch+var_30]
sub_431330+69 03C 50 push eax
sub_431330+6A 040 8D 54 24 0C lea edx, [esp+40h+var_34]
sub_431330+6E 040 51 push ecx
sub_431330+6F 044 52 push edx
sub_431330+70 048 8D 44 24 24 lea eax, [esp+48h+ReturnedString]
sub_431330+74 048 68 80 E9 4E 00 push offset s_DDDD ; "%d,%d,%d,%d"
sub_431330+79 04C 50 push eax ; char *
sub_431330+7A 050 FF 15 AC B8 4C 00 call ds:sscanf
sub_431330+80 050 8B 74 24 54 mov esi, [esp+50h+arg_0]
sub_431330+84 050 8B 54 24 1C mov edx, [esp+50h+var_34]
sub_431330+88 050 8B 44 24 20 mov eax, [esp+50h+var_30]
sub_431330+8C 050 8B CE mov ecx, esi
sub_431330+8E 050 83 C4 18 add esp, 18h
sub_431330+91 038 89 11 mov [ecx], edx
sub_431330+93 038 8B 54 24 0C mov edx, [esp+38h+var_2C]
sub_431330+97 038 89 41 04 mov [ecx+4], eax
sub_431330+9A 038 8B 44 24 10 mov eax, [esp+38h+var_28]
sub_431330+9E 038 89 51 08 mov [ecx+8], edx
sub_431330+A1 038 89 41 0C mov [ecx+0Ch], eax
sub_431330+A4 038 8D 4C 24 40 lea ecx, [esp+38h+lpAppName]
sub_431330+A8 038 E8 E7 5C 08 00 call CString::~CString(void)
sub_431330+A8
sub_431330+AD 038 8D 4C 24 44 lea ecx, [esp+38h+lpKeyName]
sub_431330+B1 038 C6 44 24 34 00 mov byte ptr [esp+38h+var_4], 0
sub_431330+B6 038 E8 D9 5C 08 00 call CString::~CString(void)
sub_431330+B6
sub_431330+BB 038 8D 4C 24 48 lea ecx, [esp+38h+lpFileName]
sub_431330+BF 038 C7 44 24 34 FF FF FF FF mov [esp+38h+var_4], 0FFFFFFFFh
sub_431330+C7 038 E8 C8 5C 08 00 call CString::~CString(void)
sub_431330+C7
sub_431330+CC 038 8B 4C 24 2C mov ecx, [esp+38h+var_C]
sub_431330+D0 038 8B C6 mov eax, esi
sub_431330+D2 038 5E pop esi
sub_431330+D3 034 64 89 0D 00 00 00 00 mov large fs:0, ecx
sub_431330+DA 034 83 C4 34 add esp, 34h
sub_431330+DD 000 C3 retn
sub_431330+DD
sub_431330+DD sub_431330 endp
ATField 2007-02-12
  • 打赏
  • 举报
回复
你是用反编译还是自己看汇编来写对应的C++代码?重新编译的结果有何不同?
peterxuxu 2007-02-12
  • 打赏
  • 举报
回复
LZ犯了个错误,忘记了尽可能不要出错就怀疑编译器的原则,还是先贴部分有问题的代码大家帮你分析一下吧?
owlpc 2007-02-12
  • 打赏
  • 举报
回复
因为程序比较大.所以我一定要用与它一样的编译器,这样编译出来的汇编代码才能完全相同.
不然的话,要验证我写的C++源码是否正确会很麻烦地.
ATField 2007-02-12
  • 打赏
  • 举报
回复
VC6也有很多ServicePack阿,估计Service Pack不同
pecker 2007-02-12
  • 打赏
  • 举报
回复
我的也是这个版本啊

2,586

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 资源
社区管理员
  • 资源
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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