首页
社区
课程
招聘
[求助]ollydbg反汇编引擎源代码使用求助?
发表于: 2009-3-28 22:47 20599

[求助]ollydbg反汇编引擎源代码使用求助?

2009-3-28 22:47
20599
在用ollydbg的反汇编引擎源代码时,使用它里面的结构成员。其中我遇到两个问题:

第一。使用dump成员,在输出结果时,机器码前面总是有很多FFFFFFF,影响美观。

我是这样插入到列表视图中的:

wsprintf(szBuffer,"%s",da.dump);
pCmpDisasmDlg->m_ListCtrlDisasm.SetItemText(dwCountCode,1,szBuffer);


第二,涉及到跳转指令时,由于跳转指令要在当前位置加上目的地址,而使用OD自带的result成员,则直接显示跳转数,而不是目的地址。

我的代码:

sprintf(szBuffer,"%s",da.result);
pCmpDisasmDlg->m_ListCtrlDisasm.SetItemText(dwCountCode,2,szBuffer);


我使用的代码如下,后面是演示界面。

我反汇编的文件是Windows自带的记事本程序。程序OEP为10CC,这个大家都很熟悉了。


//反汇编处理线程
DWORD WINAPI ThreadProcDisasm(LPVOID lpParam)
{
CCmpDisasm *pCmpDisasmDlg=(CCmpDisasm*)lpParam;
HANDLE hFile; //文件句柄
TCHAR *pBuffer;
UINT nIndex=0; //当前指令位置
int nCodelen; //指令长度
WORD temp; //暂存读取字符
DWORD dwOEP; //文件OEP
DWORD dwRead; //保存实际读取的字节数
DWORD dwPeHeaderOffset; //pe文件头Offset
DWORD dwImageBase; //载入基址
DWORD dwCodeBase; //代码段起始RVA
DWORD dwSizeOfCode=0; //代码段的大小
DWORD dwCountCode=0; //反汇编代码的行数
DWORD dwNumOfJMP=0; //JMP指令的个数
t_disasm da; //反汇编后的结果
char szBuffer[TEXTLEN];
pBuffer=new TCHAR[CODESIZE];

//创建文件句柄
hFile=CreateFile(pCmpDisasmDlg->m_FileName,GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

if (hFile==INVALID_HANDLE_VALUE)
{
AfxMessageBox("打开文件错误!");
return -1;
}

//////////////////////////////////////////////////////////////////////////
//判断文件格式

SetFilePointer(hFile,0,NULL,FILE_BEGIN);
ReadFile(hFile,&temp,2,&dwRead,NULL);
if (temp!='ZM')
{
AfxMessageBox("文件不是PE格式!");
return -1;
}
SetFilePointer(hFile,0x3C,NULL,FILE_BEGIN);
ReadFile(hFile,&dwPeHeaderOffset,4,&dwRead,NULL);
SetFilePointer(hFile,dwPeHeaderOffset,NULL,FILE_BEGIN);
ReadFile(hFile,&temp,2,&dwRead,NULL);
if (temp!='EP')
{
AfxMessageBox("文件不是PE格式!");
return -1;
}
//获取程序OEP
SetFilePointer(hFile,dwPeHeaderOffset+0x28,NULL,FILE_BEGIN);
ReadFile(hFile,&dwOEP,4,&dwRead,NULL);
if (dwOEP==0)
{
AfxMessageBox("获取OEP失败!文件不是PE格式!");
return -1;
}
//获取映像基址
SetFilePointer(hFile,dwPeHeaderOffset+0x34,NULL,FILE_BEGIN);
ReadFile(hFile,&dwImageBase,4,&dwRead,NULL);
//获取代码段地址RVA及大小
SetFilePointer(hFile,dwPeHeaderOffset+0x1C,NULL,FILE_BEGIN);//代码块大小
ReadFile(hFile,&dwSizeOfCode,4,&dwRead,NULL);
SetFilePointer(hFile,dwPeHeaderOffset+0x2C,NULL,FILE_BEGIN);//代码块其实RVA
ReadFile(hFile,&dwCodeBase,4,&dwRead,NULL);
//将指针移到代码段起始RVA
SetFilePointer(hFile,dwCodeBase,NULL,FILE_BEGIN);
ReadFile(hFile,pBuffer,dwSizeOfCode,&dwRead,NULL);
//关闭句柄
CloseHandle(hFile);

//从OEP处开始反汇编
nIndex=dwOEP-dwCodeBase;
while(nIndex<dwSizeOfCode)
{
nCodelen=Disasm(&pBuffer[nIndex],20,dwImageBase+dwCodeBase,&da,DISASM_CODE); // 调用反汇编引擎
//自定义代码
//在列表视图中显示反汇编结果代码
sprintf(szBuffer,"%08lX",da.ip+nIndex);
pCmpDisasmDlg->m_ListCtrlDisasm.InsertItem(dwCountCode,szBuffer);
wsprintf(szBuffer,"%s",da.dump);
pCmpDisasmDlg->m_ListCtrlDisasm.SetItemText(dwCountCode,1,szBuffer);
sprintf(szBuffer,"%s",da.result);
pCmpDisasmDlg->m_ListCtrlDisasm.SetItemText(dwCountCode,2,szBuffer);
//如果遇到JMP指令
if (da.jmpconst)
{
sprintf(szBuffer,"%08d",dwNumOfJMP+1);
pCmpDisasmDlg->m_ListCtrlDisasm_JmpInfo.InsertItem(dwNumOfJMP,szBuffer);
sprintf(szBuffer,"%08lX",da.ip+nIndex);
pCmpDisasmDlg->m_ListCtrlDisasm_JmpInfo.SetItemText(dwNumOfJMP,1,szBuffer);
sprintf(szBuffer,"%08lX",da.jmpconst);
pCmpDisasmDlg->m_ListCtrlDisasm_JmpInfo.SetItemText(dwNumOfJMP,2,szBuffer);
dwNumOfJMP++;
}

//设定进度条
pCmpDisasmDlg->m_ProgressDisasm.SetPos(nIndex*100/dwSizeOfCode+1);
//代码行数加一
dwCountCode++;
nIndex+=nCodelen;

}
//编辑框显示分析结果。
sprintf(szBuffer,"OEP:%08lX,代码段:%d Bytes,JMP指令:%d个,代码:%d行。",
dwOEP,dwSizeOfCode,dwNumOfJMP,dwCountCode);
pCmpDisasmDlg->SetDlgItemText(IDC_EDIT_DISASM_JMPINFO,szBuffer);

return 0;
}


见下图所示:

[注意]APP应用上架合规检测服务,协助应用顺利上架!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (31)
雪    币: 82
活跃值: (10)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
2
自己写一个,不就没问题了/J
2009-3-29 01:41
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
3
这个竟然是硕士毕业,膜拜
2009-3-29 02:19
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
硕士毕业设计,同意自己写一个引擎
2009-3-29 02:36
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
因为这是一个加壳程序的一部分。首先通过反汇编分析目标程序,获取程序结构(一般为跳转等指令),然后进行一个流程控制混淆,最后再进行加壳。反汇编引擎一方面自己在研究,另一方面也想用现成的反汇编引擎来实现,验证一下这种方法可行不可行。

所以就用OD的试试了。
2009-3-29 09:24
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
6
这方面刚好你可以问2楼的
2009-3-29 09:27
0
雪    币: 7325
活跃值: (3803)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
7
神州行,我看行
期待你的 壳

/J
2009-3-29 10:35
0
雪    币: 82
活跃值: (10)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
8
我写的明码他都没看懂,楼上竟然还加码.
2009-3-29 11:30
0
雪    币: 7325
活跃值: (3803)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
9
他是我校you,他能看懂
2009-3-29 12:09
0
雪    币: 82
活跃值: (10)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
10
风月的专业出人才啊.
2009-3-29 12:23
0
雪    币: 7325
活跃值: (3803)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
11
我是本shan传mei专业的
2009-3-29 12:28
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
12
san or shan?
这个专业忽悠能力很强啊
2009-3-29 12:32
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
13
我还以为你写了个调试器,想说下第一个问题的解决,看来你还是自己研究下吧
2009-3-29 13:15
0
雪    币: 82
活跃值: (10)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
14
自己不写反汇编引擎,至少也把他的代码连注释都看过一遍吧,看完了这些问题自然就明白了.
毕业设计,不说对别人如何,起码要对自己负责吧.
2009-3-29 13:26
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
15
估计博士毕业的时候该写.net反编译对比了。混淆前代码xxxx,混淆后代码yyyy
2009-3-29 13:26
0
雪    币: 193
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
我看你还是先弄个asm级别的出来吧

这种反汇编问题都搞不定的话,对bin进行流程混淆能完成的概率估计在1%以下。
2009-3-29 14:27
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
多谢6楼的提醒,我正在看2楼作者的NoobyICE代码。但不知道14楼Nooby所说的“至少也把他的代码连注释都看过一遍吧”是什么意思,他指的谁?是OD的代码注释,还是你的那个反汇编模块的注释?不明白。OD的注释和说明我看了,你的那个我大概看了,还没有细看。编译的时候要下载XtremeTool,我整了半天,还没有装好。

我的毕业本来只是做一个加壳的,加壳的部分基本都完成了。但后来感觉只做一个加壳是不是太简单了。于是就想到混淆一下,看了一些混淆算法,对于目标代码进行混淆都需要先反汇编。所以又开始研究反汇编了。

现在是看了Svin的教程、罗聪的教程、还有egogg的打造自己的反汇编引擎。一方面自己在研究,另一方面如果现成的反汇编引擎可以使用,我就可以先测试一下这种想法可行不可行了。
2009-3-29 18:53
0
雪    币: 82
活跃值: (10)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
18
我看来无法跟你交流了.
反汇编引擎的头文件disasm.h

// Free Disassembler and Assembler -- Header file
//
// Copyright (C) 2001 Oleh Yuschuk
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA


#ifndef MAINPROG
#define unique extern
#else
#define unique
#endif

// If you prefere Borland, this will force necessary setting (but, as a side
// effect, may cause plenty of warnings if other include files will be compiled
// with different options):

#ifdef __BORLANDC__
#pragma option -K // Unsigned char
#endif

#if (char)0xFF!=255
#error Please set default char type to unsigned
#endif


这么点都没有耐心看完?
2009-3-29 18:59
0
雪    币: 82
活跃值: (10)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
19
第二个问题
nCodelen=Disasm(&pBuffer[nIndex],20,dwImageBase+nIndex,&da,DISASM_CODE);
2009-3-29 19:02
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
好的,感谢Nooby的回答和提醒。我再仔细研究一遍。
不过我用的是一个VC修改版的,不是官方原版。
估计两者应该差不多。
2009-3-29 19:06
0
雪    币: 82
活跃值: (10)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
21
山寨山出问题了,不是自己的问题,是别人的问题.
2009-3-29 19:10
0
雪    币: 357
活跃值: (3608)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
22
还是菊导厉害
2009-3-29 21:25
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
23
主要是那个 /j ,否则编译可能出很多问题。你弄个2003或者啥的,连我这种人都能用起来,汉
2009-3-29 21:34
0
雪    币: 107
活跃值: (2434)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
[QUOTE=lilu;598578]多谢6楼的提醒,我正在看2楼作者的NoobyICE代码。但不知道14楼Nooby所说的“至少也把他的代码连注释都看过一遍吧”是什么意思,他指的谁?是OD的代码注释,还是你的那个反汇编模块的注释?不明白。OD的注释和说明我看了,你的那个我大概看了,还没有细看。编译的时候要下载XtremeTool,我整了半天,还没有装好。

我的毕业本来只是做一个加壳的,加壳的部分基本都完成了。但后来感觉只做一个加壳是不是太简单了。于是就想到混淆一下,看了一些混淆算法,对于目标代码进行混淆都需要先反汇编。所以又开始研究反汇编了。

现在是看了Svin的教程、罗聪的教程、还有egogg的打造自己的反汇编引擎。一方面自己在研究,另一方面如果现成的反汇编引擎可以使用,我就可以先测试一下这种想法可行不可行了。[/QUOTE]

加壳可以不需要反汇编引擎?那你还有强度可言么??还不如直接down一个压缩壳交差。。。
2009-4-5 16:57
0
雪    币: 3268
活跃值: (3079)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
LZ用的VC版的估计是bughoho改的那个吧。。。。在CALL和 JMP之类的跳转方面改成其他的了。。。还有那个FFFFFF前缀的问题。。。读一下那个Disasm函数。。。把里边的几个指针读取改成字节类型就不会有这问题了。。。。估计是BCB和VC之间默认的类型不一样。。。
2009-4-6 17:22
0
游客
登录 | 注册 方可回帖
返回
//