为android 生成 native 程序

四 11th, 2010

 

为android生成原生应用程序,不难啊。
初始条件:安装android的ndk,比如目前最新的 android-ndk-r3。(2010-03版)
我的目录结构:
~/android-ndk-r3
~/android-ndk-r3/temp  这个是当前工作目录。

Step1: 写两个文件:
hello.c:

#include <stdio.h>
 
int main()
{
    printf("hello, world\n");
    return 0;
}

start.c

#include <stdlib.h>
extern int main(int argc, char **argv);
 
void _start(int argc, char **argv)
{
    exit (main (argc, argv));
}

Step2: compile
[code]
../build/prebuilt/linux-x86/arm-eabi-4.2.1/bin/arm-eabi-gcc \
-I ../build/platforms/android-3/arch-arm/usr/include/  -c hello.c
../build/prebuilt/linux-x86/arm-eabi-4.2.1/bin/arm-eabi-gcc \
-I ../build/platforms/android-3/arch-arm/usr/include/  -c start.c
[/code]

Step3: link
[code]
../build/prebuilt/linux-x86/arm-eabi-4.2.1/bin/arm-eabi-ld --entry=_start \
--dynamic-linker /system/bin/linker -nostdlib     -rpath /system/lib  \
-L ../build/platforms/android-3/arch-arm/usr/lib/  \
-rpath ../build/platforms/android-3/arch-arm/usr/lib/    \
-lc -o hello hello.o start.o
[/code]

Step4: execute:
[code]
adb push hello /data/hello
adb shell
cd /data
chmod 755 ./hello
./hello
hello, world
[/code]

值得注意的一点是,在/sdcard目录下,程序运行不起来。我一开始还以为是没编好呢。后来扔到/data目录下,才成功跑起来。

标签:

添加了ssl证书,已经支持https

四 4th, 2010

去startssl 申请了一个证书。这个地方注册时一定要注意填真实信息,第一次填的有些是假的,结果要人工审核,一审核就挂了,后来换真实的一注册,就不用人工审,通过了。看来它里面有一些自动判定,对值得怀疑的要人工审核。

通过后验证email,验证网站,然后在控制面板的第二个tab就可以生成证书文件ssl.crt了。

打开hm里的cpannel里的SSL管理器,

把privatekey上传(其实我不知道这个要不要上传)

把ssl.crt上传,另外还要把startssl的根证书也一起上传(hm把这个叫做CA bundler)。

然后发ticket叫HM安装,装完就好了。

一开始我没有上传根据书,hostmonster的客服就让我上传CA bundler,我也不知道这个是啥,只是分析猜测是根证书,所以就上传了,结果是猜对了。

HM的客服安装完后,https就可以用了。呵呵,不过目前还不知道要拿来干嘛,纯粹研究一下。

标签:

卡住在 “setup is starting windows” 时的问题

三 29th, 2010

用2003的setupldr.bin加载ram盘做XP的一些启动时发现,老是卡死在

“setup is starting windows” 这里,永远也不会恢复。

N天都无果,今天无意中发现,原来是必须是用windows 2003 sp1的setupldr.bin才行。sp2的就不行。

ramdisk.sy_ 倒是好像可以随意。

so, you must use win2k3sp1 ‘s sutupldr.bin to avoid hangs on “setup is starting windows”.

标签:

调试XP/2k3的安装过程

三 28th, 2010

 在安装的源盘根目录提供一个winnt.sif,写上:

[SetupData]
OsLoadOptions = “/noguiboot /fastdetect /debug /debugport=com1 /baudrate=115200 /break”

即可。

不过XP的setupldr.bin不支持这个,要win2k3的才行。(推荐sp1。sp2加载ramdisk有卡住bug)

标签:

regsavekey (ntsavekey) 异常的调试过程

三 28th, 2010

结论非常简单,要先调用  NtInitializeRegistry. 参数见 wrk 中的 ntregapi.h

过程比较复杂,在smss.exe中用bootexecute启动的native程序里,调用 ntsavekey达不到想要的结果。

NtSaveKey会返回0,也就是没有错误。结果文件也会生成,生成的大小看起来也是对的。但是文件里面没有任何内容。所有字节都是0。

调试过程:

1. smss.exe启动的native程序是非常早的,可能是系统还有什么没准备好。试着替换其它程序而不是被smss.exe启动,来看看。

2. 替换winlogon.exe,发现能保存。

3. 替换 csrss.exe,发现也能保存。

4. 由于启动时候,smss创建csrss.exe ,后者再创建winlogon.exe。因此可以知道,在smss.exe调用native exe之后,启动csrss.exe之间,一定发生了什么事,使得ntsavekey在其前不能运行,其后可以运行。

5. 写一个简单的DLL,提供一个函数调用ntsavekey做测试,用lordpe把此DLL添加到smss.exe的依赖里。

6. WINDBG调试smss.exe启动native app后的路径,它每调几个函数就试下DLL中提供的函数看看ntsavekey是否正常。

7. 调试发现,在 NtInitializeRegistry之前,ntsavekey出现异常结果,之后,正常。

8. 结论: NtSaveKey需要用NtInitializeRegistry初始化注册表。

标签:

转载: windbg 如何在内核模式调试用户空间的程序

三 28th, 2010

1:使用!process 0 0 获取用户空间的所有的进程的信息

 !process 0 0

**** NT ACTIVE PROCESS DUMP ****
    PROCESS 80a02a60  Cid: 0002    Peb: 00000000  ParentCid: 0000
    DirBase: 00006e05  ObjectTable: 80a03788  TableSize: 150.
    Image: System

 。。。。。

2:使用.process /p + 你需要断的应用程序的EProcess地址切换到应用程序的地址空间

   例如:

 .process  /p  0x80a02a60

3:重新加载user PDB文件

     .reload /f /user

4:使用非侵入式的切换进程空间

    .process /i /p 0x80a02a60

5:下应用层断点  bp        bu      都可以

原文:http://blog.csdn.net/purplethunder/archive/2009/04/04/4048379.aspx

另外顺便证下在windbg调试时强制调用一个函数:(设函数名是 test_reg)

r esp=esp-4 ; ed esp eip ; r eip = test_reg

标签:

vs中有趣的 windows message compiler

三 25th, 2010

vs自带了一个mc.exe的程序,这个东西鲜有人知,它就是windows的message compiler程序。

mc编译mc代码,把它转变了一个bin格式的文件,放到资源中加载。在使用 windows event log , formatmessage的时候,就用得上这个消息了。formatmessage 有一个类似于 printf的形式的格式化能力。不过是用%1,%2这样的字眼,而不是%s,%d。这种%1,%2的形式理适合国际化。

codeproject上有一篇关于message compiler的文章:  http://www.codeproject.com/KB/system/mctutorial.aspx

windows kernel有不少地方使用mc格式的文本。比如windows 在安装的时候,提示欢迎,格式化等的文字都来源于安装盘smss.exe的message resource里。

生成的 .bin 文件格式;

binfile =  dword x + idgroups[x] + message[]

idgroup = dword startid + dword endid  + dword offset_to_message

message = dword sizeof(message) + char text[]

标签:

移动XP的新情况

三 22nd, 2010

我的WINXP移动版,也就是装在移动硬盘上的XP。在应用到我的新电脑(联想LENOVO G455A M320)时,发生了新的情况。

本来,移动的XP应该是,不论在哪里,插到新电脑上,一用USB启动,就自动进入到系统中,这样我不论在什么地方,都可以使用我原来的系统,最熟悉的系统,不用担心要同步文档配置啥的。而且这个绝对不是WINPE能比的,WINPE能在任何电脑上启动XP,但它只是用于维护和简单的使用。而移动版XP的功能是完整的,跟装在机箱内部硬盘的XP一样的功能。

移动的理想是美好的,现实是,在遇到全新的硬件时,它不一定能启动启来,可能发生BSOD 0x000007b错误。在G455A上就遇到了。

由于这个笔记本没有PCI Express Card接口,无法用我高价买的express 1394卡进行kernel debugging。它也没有串口,无法用串口kernel debuging. XP不支持USB kernel debugging, 就算换到vista或win7, 估计ehci的usb debug port也没有导出(有没有导出纯粹看运气,厂商一般不会故意导出)。总而言之,kernel debugging来诊断为什么从USB移动硬盘上启动不了,是没戏了。只能瞎子乱摸了。

说说最后的成果:
1.  HKLM\SYSTEM\MountedDevices下的值 \DosDevice\C: 必须删掉,换了硬件后,后面的二进制可能变了,不删掉此项,可能导致C盘不能挂载,从而发生蓝屏。把此功能加到移动XP的recovery module中。
2. 需要copy安装盘安装时生成的 HKLM\SYSTEM\ControlSet001\Enum\PCI 全目录。由于我在recovery module中copy的是winpe的。跟安装盘的setupldr.bin生成的PCI信息有些差别,导致不能启动。要彻底解决,必须基于安装盘而不是PE重写recovery mode。不过我没有时间搞这玩意儿了。而且接下来可能要研究移动版win7而不是XP了,所以…算了吧。

再说说过程:

由于只能瞎子乱撞的试验,最开始试了很多次都成功不了。后来还是想到,重头再来,在机器上的主硬盘上新装一个全新的XP,先不装驱动,为了省时间,反正能登录进去的XP就行了。然后改注册表重启,使得用winobj看arcnames的时候,可以看到插上电脑的USB移动硬盘的记录。看到后说明,这份COPY的XP已经可以从USB移动硬盘启动。

然后,有了一个成功的版本,也有了一个失败的版本,就让它们不断的逼近吧。这里又出了一个问题:方案上,可以用二分法快速逼近找出问题的关键,也可以用经验为主的方式进行重点排查,我选择了后者,尝试重启若干次,无果。 只好往第一种方法偏,最终发现了1和2这两个结论。少一个也不行。

我以前碰到的电脑,尝试了好多种硬件,都发现只需要COPY WINPE的PCI信息就可以修复成功启动了,但现在这电脑非得要安装时产生的。不知道是不是新硬件搞出的新脾气。

移动版XP以后也没有太大的研究价值了,希望移动版的WIN7会更容易配置。不过VISTA/WIN7的boot配置就够麻烦的了,还是boot.ini来得简洁直观。

我在一些论坛上说移动的操作系统时,总要被人用WIN  PE来拍砖。 其实移动OS是用来替换平时工作学习娱乐所用的OS的,跟WINPE主要用于维护是十分的不同。

你需要背着笔记本从家里到公司,或从宿舍到实验室吗,或者带着它从A地出差到B地吗?如果你在两处都有电脑,用移动的OS肯定好过背一台电脑。现代社会在目标地找或借一台电脑已经不难了,背个硬盘相比于背台笔记本,那肯定是爽了很多。

你需要同步在家里电脑和公司电脑上产生的不同的内容吗?如果用了移动的OS,那所有的文档设置和生产出来的文件都已经在移动硬盘上同步了,根本没有合并和版本选择的烦恼。

LINUX是很容易做成移动的OS的,微软则则不知是有意还是无意制造了一些烦恼,让你的WIN不能在移动硬盘上启动任何一台电脑,只是提供了一个用于维护的WINPE。还好XP和WIN7都是可以做成移动系统的。前者我已经成功了,后者,在网上能找到有些人的成功记录,估计应该不会太难实现。待到有空时,再搞个500G的移动硬盘,试试移动WIN7了。

标签:

Git via socks5 Proxy

三 14th, 2010

1. 安装 connect-proxy

#apt-get install connect-proxy

2. 编辑脚本 /usr/bin/my-git-proxy

[code]#!/bin/sh
SOCKS5_PASSWD=xxxxxx connect-proxy -S username@host:port $@ [/code]

[code]chmod +x /usr/bin/my-git-proxy [/code]

3. 配置Git

[code] $ git config --global core.gitproxy "my-git-proxy" [/code]

标签:

Internet连接共享(ICS)命令行设置

二 23rd, 2010

因为有些原因要用到ICS。想用命令行启用ICS,GOOGLE了一番,没有结果,有的人信势旦旦的说用netsh可以做到,通过对比开启ICS前和ICS后的netsh dump文件发现,这两个根本就没有本质区别,换句话说,netsh不可能开启ICS。

于是对比注册表,注册表太大,只对比了开启ICS前后的Current Control Set,也没有发现本质区别,换句话说,改注册表可能不能启用ICS,或者很难,不知道信息存在哪里。(我猜是不在注册表里的)

没办法了,使出万能法宝,一定可以成功的调试器。ollydbg威武出场,调试了一下,通过网卡属性设置ICS时,调用了hnetcfg里的COM接口。用oleview一看,嘿,这dll还提供了比较不错的idl信息,还是基于IDispatch接口的,也就是说,可以用脚本调用。于是改换方向,用这个IDL里面的关键字,继续google。这下就找到了。

用起来还挺简单: cscript  /nologo ics.vbs “private interface name” “public interface name”

key word: CONNECTION_PUBLIC  CONNECTION_PRIVATE  EnableSharing

经验教训:

  1. 搜命令行或Command line 之类的关键词找不到结果时,要试一下script, vbs之类的关键字。
  2. 搜这种词的时候,google还是挺垃圾的,我是用google.com/ncr搜的,还是难以找到。
  3. 互联网上的垃圾信息越来越多了,想要的有深度的内容会越来越不好找。
  4. 一边研究一边google的做法,目前还是比较好用的。想当年为了把windows(不是WINPE)装到移动硬盘上,并且可以在任意一台电脑上启动系统并使用系统,就是用研究再加搜索的方法,研究到80%,知道了一堆的keyword,也就容易找到相同的问题和解决方案了,否则找到的都是垃圾。

ics.vbs 下载

标签: