當前位置:首頁 » 安卓系統 » idaandroidserver

idaandroidserver

發布時間: 2023-08-30 10:56:52

1. Android逆向 ida動態調試問題

先輸入」adb shell」,然後輸入」su root」獲取root許可權。

接著輸入」 chmod 777 /data/local/tmp/android_server」 給android_server加上相應的許可權。

接著輸入」 /data/local/tmp/android_server」啟動android_server。

如下圖所示:

輸入」adb forward tcp:23946 tcp:23946」進行tcp埠轉發

命令,啟動所要調試的Activity。

app會彈出」Waitting for debugger」對話框,如下圖所示:

點擊」Debug options」按鈕,在」Suspend on process entry point」, 」Suspend on thread start/exit」, 」Suspend on library load/unload」 等選項的前面打上勾,如下圖所示:

點擊」ok」後會在以下對話框的hostname中填上」localhost」

在彈出和物的」Choose process to attach to」窗口中找到」com.example.testjniso」進程,選中該進程,然後點擊」ok」按鈕。

其中可以看到com.example.testjniso進程的埠為8700。

如下圖所示:

在ida彈出的」Add map」窗口中,一律點擊」Cancle」按鈕。

點擊ida中的暫停調試按鈕,暫停當前的調試,如下圖所示:

右擊libTestJniSo.so文件,在彈出的隱告框中點擊」Jump to mole base」,跳轉到libTestJniSo.so文件的起始地址。

按下Alt+T,彈出查找對話框中輸入」 Java_com_example_testjniso_MainActivity_helloFromJni」 如下圖所示:

點擊」ok」按鈕後,即可跳轉到 Java_com_example_testjniso_MainActivity_helloFromJni 函數所在的起始地址。

然後在地址處下斷點喚攜液:

再按F9重新開始調試,點擊app中的」點擊載入so文件」按鈕重新載入libTestJniSo.so,即可看到程序成功地停在了斷點處:

到此處就可以正常地調試so文件了。

Linker是什麼?
Linker就是/system/lib/linker,它是進程啟動時第一個載入的模塊,它負責管理elf可執行文件以及各個so文件的載入執行,還參與了調試的一些東西。通俗地說,它是一個elf文件的解釋器。它可以載入elf可執行文件及so動態庫。

在android 5.0下,不能執行android_server是因為android5.0自帶的linker不支持載入非pie的elf文件,但如果自己實現一個可以載入pie的linker,不就可以解決這個問題了嗎?對的,就是醬紫,補上自己的自定義linker在附件.

https://bbs.pediy.com/thread-206084.htm

2. 如何調試Android SO中的init函數

1.Root設備

Root許可權下才能快樂調試。
使用市面上的各種Root師傅工具。

2.連接設備

將設備打開調試模式在開發者選項里。
將IDA安裝目錄中dbgsrv文件夾下的android_server推送到設備系統目錄並賦可執行許可權。在高於IDA6.6版本才能調試高版本android,此時調試低版本Android SO時,需要使用的是android_nonpipe。
在PC端輸入命令:

adb shell su
adb shell android_server的路徑/android_server

保持上面窗口,在命令行窗口進行埠轉發:

adb forward tcp:23946 tcp:23946

為什麼是23946呢,IDA和push進設備的android_server默認用都用23946埠進行通訊。當然可以修改。

3.打開IDA

附加或者啟動進程的過程不再多言。

4.定位INIT函數

比較便捷的方法是找一份與設備同系統版本號的android源碼。解析執行SO文件的地方在linker.c(cpp)中。
因為不同版本有差異,我就不上圖了。

高版本時在do_dlopen()下的CallConstructors()裡面,但是編譯系統時往往將其和find_library融合在其父函數中,查找時需注意。一個簡便方法是源碼中搜索「INIT」四個字.
先將設備中的linker pull出來用IDA分析來確定調用INIT的具體位置。
因為linker在Android進程中載入非常早,所以它在IDA中的地址可以不用修正直接拿來用。

5.下斷在INIT

下斷點後,執行Apk中觸發載入該SO的功能。
正常情況下就能停在該SO的INIT前了。

3. Android studio 開發app,如何抵抗動態調試,反調試代碼怎麼寫請寫上詳細代碼。

為了保護關鍵代碼被逆向分析,一般放在應用程序初始化過程中,如init_array,或jni_onload函數里進行檢查代碼執行。
1.調試檢測
對調試器的檢測(ida,gdb,strace, ltrace等調試工具)
a.父進程檢測
b.當前運行進程檢測
例如對android_server進程檢測。針對這種檢測只需將android_server改名就可繞過
[objc] view plain
pid_t GetPidByName(const charchar *as_name) {
DIR *pdir = NULL;
struct dirent *pde = NULL;
FILEFILE *pf = NULL;
char buff[128];
pid_t pid;
char szName[128];
// 遍歷/proc目錄下所有pid目錄
pdir = opendir("/proc");
if (!pdir) {
perror("open /proc fail.\n");
return -1;
}
while ((pde = readdir(pdir))) {
if ((pde->d_name[0] < '0') || (pde->d_name[0] > '9')) {
continue;
}
sprintf(buff, "/proc/%s/status", pde->d_name);
pf = fopen(buff, "r");
if (pf) {
fgets(buff, sizeof(buff), pf);
fclose(pf);
sscanf(buff, "%*s %s", szName);
pid = atoi(pde->d_name);
if (strcmp(szName, as_name) == 0) {
closedir(pdir);
return pid;
}
}
}
closedir(pdir);
return 0;
}
c.讀取進程狀態(/proc/pid/status)
State屬性值T 表示調試狀態,TracerPid 屬性值正在調試此進程的pid,在非調試情況下State為S或R, TracerPid等於0

d.讀取 /proc/%d/wchan
下圖中第一個紅色框值為非調試狀態值,第二個紅色框值為調試狀態:

[objc] view plain
static void get_process_status(pid_t pid,const char* info,charchar *outline)
{
FILEFILE *fp;
char filename;
char line = {0};
snprintf( filename, sizeof(filename), "/proc/%d/status", pid );
fp = fopen( filename, "r" );
if ( fp != NULL )
{
while ( fgets( line, sizeof(line), fp ) )
{
if ( strstr( line, info ) )
strcpy(outline,line);
}
fclose( fp ) ;
}
return ;
}
static int getProcessStatus(int pid)
{
char readline = {0};
int result = STATUS_ELSE;
get_process_status(pid,"State",readline);
if(strstr(readline,"R"))
result = STATUS_RUNNING;
else if(strstr(readline,"S"))
result = STATUS_SLEEPING;
else if(strstr(readline,"T"))
result = STATUS_TRACING;
return result;
}
static int getTracerPid(int pid)
{
char readline = {0};
int result = INVALID_PID;
get_process_status(pid,"TracerPid",readline);
charchar *pidnum = strstr(readline,":");
result = atoi(pidnum + 1);
return result;
}
static int getWchanStatus(int pid)
{
FILEFILE *fp= NULL;
char filename;
char wchaninfo = {0};
int result = WCHAN_ELSE;
char cmd = {0};
sprintf(cmd,"cat /proc/%d/wchan",pid);
LOGANTI("cmd= %s",cmd);
FILEFILE *ptr; if((ptr=popen(cmd, "r")) != NULL)
{
if(fgets(wchaninfo, 128, ptr) != NULL)
{
LOGANTI("wchaninfo= %s",wchaninfo);
}
}
if(strncasecmp(wchaninfo,"sys_epoll\0",strlen("sys_epoll\0")) == 0)
result = WCHAN_RUNNING;
else if(strncasecmp(wchaninfo,"ptrace_stop\0",strlen("ptrace_stop\0")) == 0)
result = WCHAN_TRACING;
return result;
}
e. ptrace 自身或者fork子進程相互ptrace
[objc] view plain
ptrace me
if (ptrace(PTRACE_TRACEME, 0, 1, 0) < 0) {
printf("DEBUGGING... Bye\n");
return 1;
}
void anti_ptrace(void)
{
pid_t child;
child = fork();
if (child)
wait(NULL);
else {
pid_t parent = getppid();
if (ptrace(PTRACE_ATTACH, parent, 0, 0) < 0)
while(1);
sleep(1);
ptrace(PTRACE_DETACH, parent, 0, 0);
exit(0);
}
}
f. 防止mp
利用Inotify機制,對/proc/pid/mem和/proc/pid/pagemap文件進行監視。inotify API提供了監視文件系統的事件機制,可用於監視個體文件,或者監控目錄。具體原理可參考:http://man7.org/linux/man- pages/man7/inotify.7.html
偽代碼:
[objc] view plain
void __fastcall anitInotify(int flag)
{
MemorPagemap = flag;
charchar *pagemap = "/proc/%d/pagemap";
charchar *mem = "/proc/%d/mem";
pagemap_addr = (charchar *)malloc(0x100u);
mem_addr = (charchar *)malloc(0x100u);
ret = sprintf(pagemap_addr, &pagemap, pid_);
ret = sprintf(mem_addr, &mem, pid_);
if ( !MemorPagemap )
{
ret = pthread_create(&th, 0, (voidvoid *(*)(voidvoid *)) inotity_func, mem_addr);
if ( ret >= 0 )
ret = pthread_detach(th);
}
if ( MemorPagemap == 1 )
{
ret = pthread_create(&newthread, 0, (voidvoid *(*)(voidvoid *)) inotity_func, pagemap_addr);
if(ret > 0)
ret = pthread_detach(th);
}
}
void __fastcall __noreturn inotity_func(const charchar *inotity_file)
{
const charchar *name; // r4@1
signed int fd; // r8@1
bool flag; // zf@3
bool ret; // nf@3
ssize_t length; // r10@3
ssize_t i; // r9@7
fd_set readfds; // @2
char event; // @1
name = inotity_file;
memset(buffer, 0, 0x400u);
fd = inotify_init();
inotify_add_watch(fd, name, 0xFFFu);
while ( 1 )
{
do
{
memset(&readfds, 0, 0x80u);
}
while ( select(fd + 1, &readfds, 0, 0, 0) <= 0 );
length = read(fd, event, 0x400u);
flag = length == 0;
ret = length < 0;
if ( length >= 0 )
{
if ( !ret && !flag )
{
i = 0;
do
{
inotity_kill((int)&event);
i += *(_DWORD *)&event + 16;
}
while ( length > i );
}
}
else
{
while ( *(_DWORD *)_errno() == 4 )
{
length = read(fd, buffer, 0x400u);
flag = length == 0;
ret = length < 0;
if ( length >= 0 )
}
}
}
}
g. 對read做hook
因為一般的內存mp都會調用到read函數,所以對read做內存hook,檢測read數據是否在自己需要保護的空間來阻止mp
h. 設置單步調試陷阱
[objc] view plain
int handler()
{
return bsd_signal(5, 0);
}
int set_SIGTRAP()
{
int result;
bsd_signal(5, (int)handler);
result = raise(5);
return result;
}

4. AndroidServer 是什麼東西怎麼刪除啊

AndroidServer.exe是騰訊公司的產品進程,如果您安裝了騰訊旗下應用寶(原qq手機管家PC版)和電腦管家,並且將安卓手機連接了PC機,該進程就會出現並開機啟動,後來在新版QQ中騰訊又加入了此進程。

  1. 打開任務管理器找到AndroidServer.exe後結束它,並打開所在目錄將其刪除。

  2. 可以使用一些第三方軟體如管家之類的,進行卸載或強制粉碎。

熱點內容
硬體腳本語言 發布:2025-03-07 14:35:46 瀏覽:506
c語言怎麼調用函數 發布:2025-03-07 14:30:14 瀏覽:417
python合並多個文本 發布:2025-03-07 14:28:08 瀏覽:81
安卓手機qq如何顯示王者段位 發布:2025-03-07 14:19:22 瀏覽:912
萬寶壓縮機質量怎麼樣 發布:2025-03-07 14:19:17 瀏覽:520
手機存儲類型有哪些ddr 發布:2025-03-07 14:19:13 瀏覽:167
我的世界伺服器快速記錄 發布:2025-03-07 14:12:39 瀏覽:334
圖資料庫應用場景 發布:2025-03-07 14:12:01 瀏覽:973
單晶緩存 發布:2025-03-07 13:46:42 瀏覽:798
快手音樂怎麼配置 發布:2025-03-07 13:38:45 瀏覽:636