逆向工程
世纪殇
一个不断保持前进的程序员,目前潜心在数据分析和中等网站架构设计中
展开
-
逆向工程-第一次修改.exe
入门参考资料-《黑客反汇编揭秘》,实验环境WIN7+VS2010,源代码#include "stdafx.h"#includeusing namespace std;int _tmain(int argc, _TCHAR* argv[]){#pragma data_seg("knpc") char* password="dsadasd";#pragma data_seg() c原创 2013-05-23 10:06:40 · 2194 阅读 · 0 评论 -
OD根据API下断点调试程序
我们先看下C++语言的源代码,一般而言,类似于这样的界面,我们可以猜测首先要获得编辑框的句柄,而后根据句柄得到其内容,而后进行比较所以,对于GetDlgItem(),和GetWindowTextA函数则是我们需要注意的,C++源代码是这样的,void CCrackMeDlg::OnBnClickedOk(){// TODO: 在此添加控件通知处理程序代码CString原创 2013-07-04 20:01:59 · 5610 阅读 · 0 评论 -
OD内存断点
内存断点原理:OD会对所设置地址设置为不可访问或者不可写属性,这样挡程序试图访问或者写入时就会产生异常,OD在截获这种异常后比较地址是否是设置的断点地址,这种方式会对程序的运行速度有很大的影响,所以只允许设置一个内存断点,但是在找到内存断点后可以使用一般的断点(这个是可以设置无数个的)进行调试。内存断点一般用在跟踪关键数据的断点,根据这个特点在破解跟踪时只要在关键数据内存当中下断点,就可以原创 2013-07-05 11:24:32 · 1428 阅读 · 0 评论 -
反汇编的学习
首先看下凯撒加密算法的C++源代码,我们知道凯撒加密算法只是一个循环移位的算法,在这儿我们说这个,只是想学习下在反汇编过程当中遇到的问题,以及在反汇编过程中对于循环等问题的处理,在此做下记录// 凯撒加密算法.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include"iostream"#include"time.h"using name原创 2013-07-29 20:45:58 · 1341 阅读 · 0 评论 -
MFC寻找按钮事件
[软件名称]: CRECKME 0 CRECKME 0 程序和分析源码.zip.[应用平台]:Win9X/NT/2000/XP[软件大小]:8K[破解声明]:为了检验自己的逆向破解能力,请求斑竹给个邀请码,鼓励我继续写下去。顺便感谢一下党,感谢国家,感谢我们家的曾曾。[破解工具]:PEiD,IDA 5.5,PE Explore[备注] 破解软件来源于看雪论坛中的帖子 (本人转载 2013-07-24 17:30:23 · 2026 阅读 · 0 评论 -
OD条件与消息断点的设置方法
OD条件与消息断点的设置方法编写整理:Coderui一、条件断点:使用方法(如):在当前行按[Shift+F2]键->条件断点(这个不太好用,因为程序BUG偶尔失效)。在当前行按[Shift+F4]键->条件记录断点(只要设置上条件语句和按什么条件生效就可以了)。条件语句(如):EAX == 00401000 ; 当转载 2013-07-25 17:19:02 · 1553 阅读 · 0 评论 -
关于PE文件新区段的创建
对于为已有的EXE文件加壳,一般我们会创建一个新的区段,在该区段中写入的是外壳代码。 新加一个区段,通常会有三个步骤 1.首先修改PE文件头部信息,NT头部的区段数目,修改OPTIONAL头部的镜像大小 2.向内存中申请一个IMAGE_SECTION_HEADER的内存模型,并修改其各个变量(区块的偏移位置和大小,文件相对虚拟地址和大小) 3.写入文件 现在说下IMA原创 2013-08-25 09:56:02 · 1658 阅读 · 1 评论 -
通过添加新的节来感染PE文件
所谓感染PE文件,其实就是修改PE文件,在不改变其原有功能的基础上,添加我们自己的代码,在这里我们将PE文件看作是一般的文件,只是在修改时,要根据PE文件结构来进行update,否则的话就会破坏原有程序。这里我们不再对PE文件结构进行解释说明,请读者自行百度哈 现在我们说下添加区段的一般步骤 一.修改PE文件头部信息,需要修改的有IMAGE_FILE_HEADER的Nu原创 2013-08-26 10:26:29 · 1984 阅读 · 0 评论 -
PE文件代码段的加密与解密
// 区块合并.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include#include#includeusing namespace std;#pragma comment(lib,"imagehlp.lib")char* strSrcExePath="D:\\project\\tmp\\Debug\\tmp.ex原创 2013-09-07 16:42:24 · 2951 阅读 · 0 评论 -
软件加壳之输入表转储
// EncrpyImport.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include#include#include#includeusing namespace std;#pragma comment(lib,"imagehlp.lib")void ReaseImportDir(char*srcPath);原创 2013-09-05 09:00:21 · 726 阅读 · 0 评论 -
shellcode获取MessageBoxA的地址
_asm{ push ebp;暂存基址 mov eax,fs:[30];获取PEB地址 mov eax,[eax+0ch];获取LDR地址 mov eax,[eax+14h];获得PEB_LDR_DATA中InMemoryOrderModuleListFlink的地址,该地址和LDR_DATA_TABLE_ENTRY中的Flink相同原创 2013-09-02 17:12:07 · 2849 阅读 · 0 评论 -
获得PE文件输入表和输出表
#include #include #include#pragma comment(lib,"imagehlp.lib")using namespace std;int main(){ char* strExePath="C:\\Windows\\System32\\kernel32.dll"; //打开文件 HANDLE hFile=::CreateFile(strExePath,GENERIC原创 2013-09-02 15:26:17 · 1872 阅读 · 0 评论 -
软件加壳输入表处理-解析
本篇博文说下PE文件中输入表的格式和具体的使用,以及在软件加壳中的注意事项(本人菜鸟),高手飘过IMAGE_IMPORT_DESCRIPTOR STRUC{ union Characteristics DWORD OriginalFirstThunk DWORD ends TimeDateStamp DWORD原创 2013-09-03 21:27:09 · 1511 阅读 · 0 评论 -
为程序添加启动消息提示
#include"windows.h"#include"iostream"#include"imagehlp.h"using namespace std;#pragma comment(lib,"imagehlp.lib")DWORD GetAlign(DWORD size,DWORD dwAlign){ DWORD dwResult=0; if(siz原创 2013-09-03 11:20:29 · 1066 阅读 · 0 评论 -
如何编写并编译一个shellcode!
最近开始再看LINUX了嘛(希望还不算太晚)。所以就找找文章,看有什么好的就贴到自己BLOG上来。【实验环境】 虚拟机:VMware Workstation , Version: 5.5.3 build-34685 虚拟机OS:Redhat Linux 9.03简体中文版,X86-based PC 主机OS:Microsoft Window转载 2013-09-12 15:35:48 · 2363 阅读 · 0 评论 -
shellcode中在代码段中使用字符串
// CrackMe.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include#include #includeusing namespace std;int main(){ goto shellEnd; _asm {shellCode: pushad;原创 2013-09-12 16:36:57 · 1473 阅读 · 0 评论 -
SEH溢出攻击
环境使用:WIN7 ,VS2010,攻击具有溢出漏洞的程序,其源代码如下#include "stdafx.h"#include #include#includeusing namespace std;int main(){HANDLE hLib=LoadLibraryA("D:\\project\\dll\\Debug\\dll.dll");FARPROC原创 2013-10-01 10:07:52 · 1656 阅读 · 0 评论 -
win7 下不成功的一次堆栈漏洞溢出
首先,我使用的是JMP ESP的跳转到shellcode,在本次开机的时候获得LoadLibraryA,GetProcAddress,当然在win7下kernel32.dll的地址是随机的,但一旦开机,就已经固定,只是重启后变得不再相同,本次使用的是LoadLibraryA的地址是0x75a0dc55,getProcAddress的地址是:x75a0cc84h,我们需要获得的是system函数原创 2013-09-17 22:41:06 · 2169 阅读 · 1 评论 -
关于com接口调用的反汇编
只是为了测试,现在只写一个接口的自定义的两个函数这是接口的定义[ object, uuid(C320028D-2E57-46FD-8D80-F24315B58543), dual, nonextensible, pointer_default(unique)]interface IDiction : IDispatch{ HRESULT justTest(); HRES原创 2013-07-03 10:03:50 · 1282 阅读 · 0 评论 -
可执行程序调用dll过程的反编译
我们先来一段C++的调用dll源代码 HINSTANCE hInstance=::LoadLibraryA("D:\\project\\dll\\Release\\dll.dll"); typedef int(*fun)(); fun hun=(fun)GetProcAddress(hInstance,"hehe"); hun(); int a=GetLastError(); a++原创 2013-07-02 21:23:31 · 1882 阅读 · 0 评论 -
使用IDA对MFC寻找按钮处理事件
由于我练习的都是MFC程序,在寻找按钮事件的时候,费了老鼻子劲了,当初说的,根据DispatchMessage,TranslateMessage,下条件断点神马的,笔者,试了又试,在里面消息转了又转,就是出不来,放下了一段时间,但是不甘心,最后找到了一篇很好的文章点击打开链接,让我有了很好的启发,对于自己做的小程序而言,已经足够了,现在说下,我自己写的这篇水平实在有些哇,高手不要见笑啊,好原创 2013-06-29 19:02:18 · 5280 阅读 · 1 评论 -
C语言的字符串比较与汇编的对照
字符串比较的解读由C->汇编 if(strcmp(input_word,password)==0) { cout<<"graduations!\n"; } else { cout<<"sorry\n"; }在此过程中eax放置的是password的偏移量,即password的地址,esi则是输入的字符串的地址级input_word的地址.text:00401061原创 2013-05-23 16:29:26 · 1081 阅读 · 0 评论 -
HIEW下破解自己的if(psw==input_psw)//整型比较
原函数如下:#includeusing namespace std;int _tmain(int argc, _TCHAR* argv[]){int psw=10010;int input_psw;coutcin>>input_psw;if(psw==input_psw){cout}else{cout}return 0;原创 2013-05-24 21:07:18 · 979 阅读 · 0 评论 -
内联函数并非由自己制定的环境 WIN7+VS2010
先记录下题外话:CALL指令将紧接在他之后的指令压入堆栈的顶部,但是esp的值并不发生变化,等待该过程执行完毕之后,执行RET指令,将程序的控制权还给之前压入堆栈的call之后的第一条指令的地址。结束函数的执行。例外的是并不是多有的RET指令都表示函数的结束,同时有一点要记得,函数可能并非只有一个出口点。对不?好了进入正题:C++代码如下#includeusing names原创 2013-05-25 11:19:15 · 804 阅读 · 0 评论 -
关于cout<<1; cout<<endl;和cout<<1<<endl;的解析
C++源代码如下cout经IDA反汇编之后得出.text:00401000 mov eax, ds:__imp_?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z ; std::endl(std::basic_ostream> &) ;//将endl原创 2013-05-25 10:44:21 · 6745 阅读 · 0 评论 -
跟据函数指针调用函数的反汇编
不说废话,上来高级语言C++的源代码int _tmain(int argc, _TCHAR* argv[]){ int a[3]={(int)test,(int)test1,(int)test2}; for(int i=0;i<3;i++) { int (*f)(); f=(int(*)())a[i]; f(); }}反汇编之后如下:.text:0原创 2013-05-27 10:35:13 · 967 阅读 · 0 评论 -
C++反汇编代码分析--函数调用
代码如下: #include "stdlib.h" int sum(int a,int b,int m,int n) { return a+b; } void main() { int result = sum(1,2,3,4); system("pause");转载 2013-05-27 10:50:26 · 655 阅读 · 0 评论 -
函数的开始和结束标志
.text:00401010 ; void *__thiscall CtmpApp___vector deleting destructor_(CtmpApp *this, unsigned int).text:00401010 ??_ECtmpApp@@UAEPAXI@Z proc near ; DATA XREF: .rdata:004034D8o.text:0040101原创 2013-05-28 20:39:22 · 3880 阅读 · 0 评论 -
函数的多个返回标志
.text:00401000 ; int __cdecl wmain(int argc, wchar_t **argv).text:00401000 _wmain proc near ; CODE XREF: __tmainCRTStartup+11Dp.text:00401000.text:00401000 m =原创 2013-05-28 21:07:57 · 878 阅读 · 0 评论 -
内置函数的反汇编解读
#includeusing namespace std;int max(int a,int b){ if(a>b) return a; else return b;}int _tmain(int argc, _TCHAR* argv[]){ int a,b; cin>>a; cin>>b; cout>a; cin>>b; cout>a; cin>>b; c原创 2013-05-29 20:37:16 · 670 阅读 · 0 评论 -
cdecl、stdcall、fastcall是什么?哪种可以实现个数不定的入口参数,为什么?
三者都是函数调用的约定。cedel:c declare(c调用约定)的缩写,是c和c++程序的缺省调用方式,规则是,从又向左的顺序压参数入,由调用者把参数弹出栈,对于传入参数的内存栈是由调用者来维护的,正因为如此,只有这种调用方式可以实现个数不定的入口参数(可变参数)。stdcall:是pascal程序的缺省调用方式,规则是,按从右向左的顺序入栈,被调用的函数在返回前清理传送参数的转载 2013-05-30 21:48:23 · 908 阅读 · 0 评论 -
虚函数的解析
概念上,虚函数是在程序运行时刻才定义的函数,其实其含义是:虚函数是在运行时刻才知道要调用的是子类的方法,还是父类的方法,对于一个含有虚函数的类而言,他的虚函数的定义在一个地方,还有一个叫做虚函数表的数据结构被存储下来,这个虚函数表,这个虚函数表中存放了每个虚函数的首地址,当我们调用一个虚函数时,他会首先寻找虚函数表所在,然后根据偏移量获得该虚函数的地址,进而将该虚函数地址中的内容,放进寄存原创 2013-06-04 17:15:06 · 754 阅读 · 0 评论 -
对于纯虚函数的解读
纯虚函数,类也有一张纯虚函数表,类似于纯虚函数,可是有什么区别呢?现在分析下 // 虚函数.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#includeusing namespace std;class base{public: virtual void demo_1()=0; };class Imp :public bas原创 2013-06-05 09:53:51 · 613 阅读 · 0 评论 -
派生类的虚函数列表
我们知道,每个具有虚函数的类中都有一张虚函数表,在rdata中用以记录每个类中虚函数列表,或者说虚函数的地址,那么如果是继承关系的类,对于其基类中函数虚函数的派生类,其虚函数表又是怎样的呢?下面看下C++源代码和反汇编的对比#include "stdafx.h"#includeusing namespace std;class A{public: virtual void f(){c原创 2013-06-17 14:50:30 · 1307 阅读 · 0 评论 -
破解练习之Acid burn.exe
首先运行Acid burn.exe看下有没有什么可供利用的东东“:首次出现的界面点击确定之后出现的界面如下而后点击Serial/Name出现界面当输入任何值时,弹出对话框”Sorry, The serial is incorrect"下面贴上Acid burn.exe的反汇编代码,查找Sorr。。。的所在找到CODE:0042FA57原创 2013-06-18 16:16:00 · 1701 阅读 · 0 评论 -
破解时常用汇编命令
基本上多数破解的思路是一样的,就是将本来判断为true的时候干的事情改为逻辑值为false就做,因此常常需要替换一些汇编命令:cmp a,b 比较a与bmov a,b 把b的值送给aret 返回主程序nop 无作用,英文“no operation”的简写,意思是“do nothing”(机器码90)***机器码的含义参看上面(解释:ultraedit打开编辑exe文件时你看转载 2013-06-19 17:04:06 · 896 阅读 · 0 评论 -
ollydbg和IDA,HIEW的简单结合
本人新手,对于逆向工程还不是很了解,现下只是学习,写下本文聊做笔记,以观后效void CbhuDlg::OnBnClickedButton1(){ // TODO: 在此添加控件通知处理程序代码CString str;GetDlgItem(IDC_EDIT1)->GetWindowTextW(str);if(str==L"DSADAS") {::MessageBoxW(NUL原创 2013-06-26 21:00:52 · 2674 阅读 · 0 评论 -
读取PE文件头的简单实现
// 读取PE文件头.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include#include#includeusing namespace std;int _tmain(int argc, _TCHAR* argv[]){ HANDLE hFile=CreateFile(L"D:\\project\\Proc_Url\\Debug\原创 2013-07-13 15:40:01 · 2945 阅读 · 0 评论